discogs-rs
discogs-rs is an async Rust client library for Discogs API v2.
Official Discogs API v2 Links
- API Home: https://www.discogs.com/developers/
- Authentication: https://www.discogs.com/developers/#page:authentication
- Database: https://www.discogs.com/developers/#page:database
- Marketplace: https://www.discogs.com/developers/#page:marketplace
- Inventory Export: https://www.discogs.com/developers/#page:inventory-export
- User Identity: https://www.discogs.com/developers/#page:user-identity
- User Collection: https://www.discogs.com/developers/#page:user-collection
- User Wantlist: https://www.discogs.com/developers/#page:user-wantlist
- User Lists: https://www.discogs.com/developers/#page:user-lists
Features
- Domain-oriented API modules (
database,marketplace,inventory,user,collection,wantlist,list) - Strongly typed request/response models for common fields
- Forward compatibility via
flatten extrafor unknown fields - OAuth helper for request/access token flow
- Parsed rate-limit metadata from Discogs response headers
- Configurable exponential backoff for
429 Too Many Requests
Installation
[]
= "0.1"
MSRV: 1.85
Feature Flags
rustls-tls(default): usereqwestwith Rustls TLS backendnative-tls: use platform native TLS backend
Example:
[]
= { = "0.1", = false, = ["native-tls"] }
Quick Start
use ;
async
Typed API Example
use ;
let client = with_default_user_agent.build?;
let query = SearchQuery ;
let result = client.database.search.await?;
println!;
Authentication Modes
Auth::NoneAuth::UserToken { token }Auth::Discogs { consumer_key, consumer_secret }Auth::OAuth { consumer_key, consumer_secret, access_token, access_token_secret }
For single-account usage, you can use the dedicated user-token constructors:
use DiscogsClient;
let client = with_default_user_agent_and_user_token?;
Auth Level Matrix
This client enforces auth level before dispatching HTTP requests.
AuthLevel::None- Public endpoints (most database reads, public user/list data)
AuthLevel::Consumer- Consumer-key gated endpoints (for example database search)
AuthLevel::User- User-scoped endpoints (identity, collection writes, wantlist writes, marketplace order/listing writes, inventory export)
API Coverage
Core
DiscogsClient::aboutDiscogsClient::get_identity
Database API (client.database())
get_artistget_artist_releasesget_releaseget_release_ratingset_release_ratingdelete_release_ratingget_release_community_ratingget_release_statsget_masterget_master_versionsget_labelget_label_releasessearch
Marketplace API (client.marketplace())
get_listingadd_listingedit_listingdelete_listingget_ordersget_orderedit_orderget_order_messagesadd_order_messageget_feeget_price_suggestionsget_release_stats
Inventory Export API (client.inventory())
export_inventoryget_exportsget_exportdownload_export
User API (client.user())
get_profileedit_profileget_inventoryget_identityget_contributionsget_submissionsget_listscollectionwantlistlist
Collection API (client.user().collection() / client.collection())
get_foldersget_folderadd_folderset_folder_namedelete_folderget_releasesget_release_instancesadd_releaseedit_releaseremove_releaseget_fieldsedit_instance_noteget_value
Wantlist API (client.user().wantlist() / client.wantlist())
get_releasesadd_releaseedit_notesremove_release
List API (client.user().list() / client.list())
get_items
OAuth Helper (DiscogsOAuthClient)
request_tokenaccess_token
Examples
Rate Limit and Retry
Each call returns ApiResponse<T>, including optional rate_limit parsed from:
x-discogs-ratelimitx-discogs-ratelimit-usedx-discogs-ratelimit-remaining
Configure retry behavior with RetryConfig.
Discogs API Constraints
- Discogs requires a descriptive
User-Agent. - Rate limits are exposed via response headers and can vary by auth mode.
- This crate retries only
429 Too Many Requestsusing exponential backoff; all other non-2xx responses are mapped toDiscogsError::Http. - Auth errors are prevented early when possible by local auth-level checks.
Errors
DiscogsError variants:
AuthRequiredHttpRequestJsonInvalidOAuthResponse
API Compatibility Policy
- Common/high-value fields are strongly typed.
- Unknown fields are preserved through
#[serde(flatten)] extramaps. - This strategy minimizes breakage from additive API response changes while keeping ergonomic typed access.
Development