API REFERENCE
Run Valuation
On this page
/api/valuationGenerate a catalog from a Spotify artist in one call. Resolves the artist's releases, captures current Spotify play counts (spending the account's credits), materializes a catalog from the resulting snapshot (idempotent - see Create catalog), and returns the catalog with its estimated value band. The catalog is owned by the calling account unless organization_id names one of the caller's organizations to own it instead, in which case every member of that organization sees it. The calling account is always taken from the credentials, never the body, and it is the account whose credits are spent. The searched artist is also linked to the caller's roster (so a funnel signup lands with a populated GET /api/artists it can confirm); when the catalog's songs already resolve a canonical artist that one is used, otherwise the searched Spotify artist is linked directly. Synchronous: the request waits for the capture to land (typically under two minutes). Each run also persists a row in the catalog's valuation history, readable via Get Catalog Valuations.
Authentication
x-api-key in header
bearerAuth bearer
Request
curl --request POST \
--url 'https://api.recoupable.dev/api/valuation' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"spotify_artist_id": "string"
}'Request body required
The Spotify artist to value.
application/json
spotify_artist_idstringrequiredThe Spotify artist id to value (e.g. from a Spotify artist search). The endpoint resolves this artist's releases, measures them, and builds the catalog.
organization_idstringOptional. ID of an organization to own the resulting catalog instead of the calling account. Every member of that organization then sees it in their own Get Catalogs response. The caller must be a member of the organization; otherwise the request is rejected with 403. Credits are still spent by the calling account, and the searched artist is still linked to the caller's roster. Omit to own the catalog personally, which is the default.
format: uuid
account_idstringOptional. Act on behalf of this account (UUID). Only applicable when the authenticated account has access to the target account, for example an organization key acting for a member account. Every side effect of the run - the playcount snapshot, the catalog claim, the roster attach, and the report email - is scoped to this account instead of the caller. Omit to run for the caller's own account, which is the default.
format: uuid
Responses
200Catalog created (or idempotently re-fetched) with its estimated value band.+
application/json
statusstring · enumStatus of the request
Values: "success", "error"
catalogobjectA catalog with its metadata
Properties for catalog
idstringUnique identifier for the catalog
format: uuid
namestringName of the catalog
created_atstringISO timestamp of when the catalog was created
format: date-time
updated_atstringISO timestamp of when the catalog was last updated
format: date-time
bandobjectEstimated catalog value in USD, derived at read time from the latest measurements - the same model as the recoupable.dev valuation card. Annual run-rate = lifetime streams / catalog age (lifetime-average proxy), converted to net label share (all-DSP gross-up 1.25/1.4/1.6, 15% distribution fee, 25% royalty share, $0.0035 per Spotify stream) and multiplied by a 10x/13x/16x master-catalog market multiple.
Properties for band
lownumberLow estimate in USD (1.25x gross-up, 10x multiple)
midnumberCentral estimate in USD (1.4x gross-up, 13x multiple)
highnumberHigh estimate in USD (1.6x gross-up, 16x multiple)
songs_measuredintegerNumber of tracks with a captured play count that were materialized into the catalog.
errorstringError message (only present if status is 'error')
400Bad request - missing or invalid spotify_artist_id+
application/json
statusstring · enumStatus of the request
Values: "error"
errorstringError message describing what went wrong
401Unauthorized - missing or invalid credentials+
application/json
statusstring · enumStatus of the request
Values: "error"
errorstringError message describing what went wrong
402Insufficient credits to measure the catalog+
application/json
statusstring · enumStatus of the request
Values: "error"
errorstringError message describing what went wrong
403Forbidden - the caller is not a member of the organization named by organization_id+
application/json
statusstring · enumStatus of the request
Values: "error"
errorstringError message describing what went wrong
404Not found - no releases found for the Spotify artist+
application/json
statusstring · enumStatus of the request
Values: "error"
errorstringError message describing what went wrong
504The measurement did not complete within the wait window - retry shortly+
application/json
statusstring · enumStatus of the request
Values: "error"
errorstringError message describing what went wrong
Full specification
Download the OpenAPI file for complete schemas, constraints, and examples.
Download releases.jsonView operation source
{
"summary": "Run valuation",
"description": "Generate a catalog from a Spotify artist in one call. Resolves the artist's releases, captures current Spotify play counts (spending the account's credits), materializes a catalog from the resulting snapshot (idempotent - see [Create catalog](/api-reference/songs/catalogs-create)), and returns the catalog with its estimated value band. The catalog is owned by the calling account unless organization_id names one of the caller's organizations to own it instead, in which case every member of that organization sees it. The calling account is always taken from the credentials, never the body, and it is the account whose credits are spent. The searched artist is also linked to the caller's roster (so a funnel signup lands with a populated `GET /api/artists` it can confirm); when the catalog's songs already resolve a canonical artist that one is used, otherwise the searched Spotify artist is linked directly. Synchronous: the request waits for the capture to land (typically under two minutes). Each run also persists a row in the catalog's valuation history, readable via [Get Catalog Valuations](/api-reference/songs/catalog-valuations).",
"security": [
{
"apiKeyAuth": []
},
{
"bearerAuth": []
}
],
"requestBody": {
"description": "The Spotify artist to value.",
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RunValuationRequest"
}
}
}
},
"responses": {
"200": {
"description": "Catalog created (or idempotently re-fetched) with its estimated value band.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RunValuationResponse"
}
}
}
},
"400": {
"description": "Bad request - missing or invalid spotify_artist_id",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogSongsErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized - missing or invalid credentials",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogSongsErrorResponse"
}
}
}
},
"402": {
"description": "Insufficient credits to measure the catalog",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogSongsErrorResponse"
}
}
}
},
"403": {
"description": "Forbidden - the caller is not a member of the organization named by organization_id",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogSongsErrorResponse"
}
}
}
},
"404": {
"description": "Not found - no releases found for the Spotify artist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogSongsErrorResponse"
}
}
}
},
"504": {
"description": "The measurement did not complete within the wait window - retry shortly",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CatalogSongsErrorResponse"
}
}
}
}
}
}