Skip to content
Sound Server

Sound Server API reference

One search API for free music samples: drums, 808s, loops, vocals, FX, foley and instruments, with licence verdicts. Version 0.1.0, base URL https://sound.shep.bot. Machine-readable:OpenAPI 3.1 JSON. Want to send requests from the browser? Open theinteractive API playground.

  • Authentication: none on the public server. Self-hosted servers may require Authorization: Bearer <key> or x-api-key.
  • Rate limits: 120 requests per minute per client, announced in RateLimit-Policy / RateLimit headers; 429 comes with Retry-After. See versioning & rate limits.
  • Errors: JSON { "error": "message" } with a 4xx/5xx status.

Find samples across every source in one call.

GET/v1/searchSearch every source

Fans out to every enabled source in parallel (each with its own timeout), then merges and ranks. Words like 140 bpm, F minor or one shot in q become filters (see filters in the response); explicit parameters win. Unknown BPM, key, form or duration stay in the list, ranked below known matches, unless strict=true. A slow or failing source never fails the search: it shows up in providers with its status.

Parameters

NameInTypeDescription
qquerystringShort query, written like a producer would.
categoryquerystringComma-separated categories; a parent includes its children. Top level: drums, bass, vocals, fx, foley, ambience, keys, guitar, synth, strings, brass, woodwind, mallets, other; children like drums.kick, bass.808, vocals.chop, fx.riser.
formquerystringComma-separated forms: one-shot, loop, phrase, multisample, pack, midi, preset.
bpmquerystringTempo or range: "140" or "120-128".
keyquerystringMusical key: "F minor", "F#m", "Eb", "A major".
min_durationquerynumberMinimum length in seconds.
max_durationquerynumberMaximum length in seconds (e.g. 2 for one-shots).
commercialquerybooleanOnly samples whose licence verdict is yes or yes-with-credit.
freequerybooleanOnly free samples.
downloadablequerybooleanOnly samples this server can download directly.
strictquerybooleanDrop samples whose BPM, key, form or duration is unknown when that filter is set.
providersquerystringComma-separated source ids (see /v1/providers).
limitqueryintegerMax results (default 24).
offsetqueryintegerPer-source offset for paging (e.g. 24 for page 2).
x-freesound-tokenheaderstringOptional: your own Freesound OAuth2 access token. Freesound serves its original WAV/AIFF/FLAC files only to a logged-in user, so without it Freesound samples download as their high-quality MP3/OGG preview. The token is passed to Freesound for this request only and is never logged or stored.

Responses

  • 200Ranked results, the filters in force and a per-source report.SearchResponseheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 400Invalid parameters or unknown source id.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 401API key required (self-hosted servers only).Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl "https://sound.shep.bot/v1/search?category=drums.kick&form=one-shot&bpm=140&key=F%20minor&providers=freesound%2Cwikimedia"

Samples

Details, previews, file selection and downloads for one sample.

GET/v1/samples/{id}Sample details with files

Full metadata, the licence with its verdict and credit line, the preview and every file for one sample.

Parameters

NameInTypeDescription
id *pathstringSample id <provider>:<nativeId>, URL-encoded (: may stay as is). Take it from a search result.
x-freesound-tokenheaderstringOptional: your own Freesound OAuth2 access token. Freesound serves its original WAV/AIFF/FLAC files only to a logged-in user, so without it Freesound samples download as their high-quality MP3/OGG preview. The token is passed to Freesound for this request only and is never logged or stored.

Responses

  • 200The sample and its files.SampleDetailsheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 400Malformed id or unknown source.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 404Unknown sample.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy
  • 501The source has no detail pages here; open url on the source site.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 502The source site failed.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset

Example

curl "https://sound.shep.bot/v1/samples/freesound:2086"
GET/v1/samples/{id}/filesPick the right files

The best file for a format and role (the original WAV by default), or every file with all=true, with sizes and the licence.

Parameters

NameInTypeDescription
id *pathstringSample id <provider>:<nativeId>, URL-encoded (: may stay as is). Take it from a search result.
formatquerystringPreferred file format. The closest match wins; omitted = the best quality available (WAV, then AIFF, FLAC, OGG, MP3).
rolequery"original" | "preview" | "pack" | "stem" | "midi"Which kind of file: the original upload, the preview, a pack archive, a stem or midi part of a construction kit.
allquerybooleanEvery file instead of the best single one.
x-freesound-tokenheaderstringOptional: your own Freesound OAuth2 access token. Freesound serves its original WAV/AIFF/FLAC files only to a logged-in user, so without it Freesound samples download as their high-quality MP3/OGG preview. The token is passed to Freesound for this request only and is never logged or stored.

Responses

  • 200Selected files and total size.FileSelectionheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 404Unknown sample.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl "https://sound.shep.bot/v1/samples/freesound:2086/files?format=wav"
GET/v1/samples/{id}/downloadDownload

One plain file redirects (302) to the source, so the bytes never pass through this server. Several files, files the source only serves with extra request headers, or bundle=true stream as one zip with ATTRIBUTION.md and credits.json next to the audio. X-License and X-Attribution carry the licence on both. Samples that are only available on the source site (an account, a purchase, a login wall) answer 409 with the page url.

Parameters

NameInTypeDescription
id *pathstringSample id <provider>:<nativeId>, URL-encoded (: may stay as is). Take it from a search result.
formatquerystringPreferred file format. The closest match wins; omitted = the best quality available (WAV, then AIFF, FLAC, OGG, MP3).
rolequery"original" | "preview" | "pack" | "stem" | "midi"Which kind of file: the original upload, the preview, a pack archive, a stem or midi part of a construction kit.
allquerybooleanEvery file instead of the best single one.
bundlequerybooleanAlways answer with a zip that includes ATTRIBUTION.md and credits.json.
x-freesound-tokenheaderstringOptional: your own Freesound OAuth2 access token. Freesound serves its original WAV/AIFF/FLAC files only to a logged-in user, so without it Freesound samples download as their high-quality MP3/OGG preview. The token is passed to Freesound for this request only and is never logged or stored.

Responses

  • 200Zip bundle with the files, ATTRIBUTION.md and credits.json.string (binary)headers: X-License, X-Attribution, RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 302Redirect to the single file on the source.headers: X-License, X-Attribution, RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 404Unknown sample or no file matches the format/role.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 409No direct download here; get the file from the source page (url).Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl -L -O "https://sound.shep.bot/v1/samples/freesound:2086/download?format=wav"
GET/v1/samples/{id}/previewPlay the preview

Redirects (302) to the sample's preview. Previews the source only serves with a Referer, and any preview with proxy=1, are streamed through this server with Access-Control-Allow-Origin: *, so browser players, Strudel and web DAWs can load them. Previews only, at most 25 MB: this is not a general proxy.

Parameters

NameInTypeDescription
id *pathstringSample id <provider>:<nativeId>, URL-encoded (: may stay as is). Take it from a search result.
proxyquerybooleanStream the preview through this server (CORS enabled) instead of redirecting.
x-freesound-tokenheaderstringOptional: your own Freesound OAuth2 access token. Freesound serves its original WAV/AIFF/FLAC files only to a logged-in user, so without it Freesound samples download as their high-quality MP3/OGG preview. The token is passed to Freesound for this request only and is never logged or stored.

Responses

  • 200The preview audio.string (binary)headers: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 302Redirect to the preview on the source.headers: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 404Unknown sample, or it has no preview.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 413Preview too large to proxy.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl "https://sound.shep.bot/v1/samples/freesound:2086/preview"
GET/v1/samples/{id}/peaksWaveform peaks

Min/max pairs (-1..1) for drawing the sample's waveform, computed from its preview and cached. Pass them to wavesurfer.js as peaks with duration.

Parameters

NameInTypeDescription
id *pathstringSample id <provider>:<nativeId>, URL-encoded (: may stay as is). Take it from a search result.
pointsqueryintegerNumber of min/max pairs (50–4000, default 800).

Responses

  • 200Peaks.objectheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 404Unknown sample, or no audio file to analyse.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl "https://sound.shep.bot/v1/samples/freesound:2086/peaks"
GET/v1/samples/{id}/similarSounds like this one

Nearest sounds by audio embedding (CLAP) among the samples this server has indexed, when embeddings are turned on; otherwise Freesound's own similarity for freesound: ids. method says which was used.

Parameters

NameInTypeDescription
id *pathstringSample id <provider>:<nativeId>, URL-encoded (: may stay as is). Take it from a search result.
limitqueryintegerMax results (default 12, max 30).

Responses

  • 200Similar samples.objectheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 404Unknown sample.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy
  • 501Embeddings are off on this server and the sample is not from Freesound.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset

Example

curl "https://sound.shep.bot/v1/samples/freesound:2086/similar"
GET/v1/samples/{id}/midiMIDI from a melodic sample

Transcribes a melodic sample (bass line, lead, arpeggio, vocal line) one note at a time and returns a Standard MIDI File, or the notes as JSON with format=json. Notes snap to the grid when the tempo is known (bpm, or the sample's own). Chords and drums are not transcribed; a warning says so.

Parameters

NameInTypeDescription
id *pathstringSample id <provider>:<nativeId>, URL-encoded (: may stay as is). Take it from a search result.
bpmquerynumberTempo of the loop (40–300).
quantizequerystringSteps per beat: 1, 2, 4 (16ths, default) or 8; false keeps the played timing.
formatquery"json"json for the notes instead of the file.

Responses

  • 200The MIDI file, or the notes.string (binary)headers: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 400Invalid bpm or quantize.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 404Unknown sample.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl "https://sound.shep.bot/v1/samples/freesound:2086/midi"

Kits

Assemble a matching drum kit in one call.

POST/v1/kitsBuild a drum kit

One search per slot (default kick, snare, clap, closed hat, open hat, 808), steered by style, bpm and key, returning the best pick per slot with alternatives and the reason it won. Commercial-safe picks only unless commercialOnly: false. The response includes a Strudel sample map and snippet that play the picks through this server's preview proxy, a General MIDI / SFZ drum map, how many picks fall under each licence verdict, and the credit lines.

Parameters

NameInTypeDescription
x-freesound-tokenheaderstringOptional: your own Freesound OAuth2 access token. Freesound serves its original WAV/AIFF/FLAC files only to a logged-in user, so without it Freesound samples download as their high-quality MP3/OGG preview. The token is passed to Freesound for this request only and is never logged or stored.

Responses

  • 200The kit plan.Kitheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 400Invalid body (e.g. an unreadable key).Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl -X POST "https://sound.shep.bot/v1/kits" \
  -H "content-type: application/json" -H "accept: application/json, text/event-stream" \
  -d '{}'

Sources

The sample sites this server searches, what they hold, and how the server is used.

GET/v1/providersList sources

Every sample site with the categories it carries, pricing, licence, the filters it applies itself and whether files can be downloaded directly.

Responses

  • 200Sources.objectheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl "https://sound.shep.bot/v1/providers"
GET/v1/catalogCatalog census

How many samples every source holds, counted once a day: listings per source, by top-level category, licence and the source's own categories, free counts, listings added in the last 30 days, and highlights such as the most downloaded sample. atLeast: true marks lower bounds (sources that cap their counts). Sources whose count failed today keep their last good numbers with stale. The same file is at /catalog.json; one point per day is in /catalog-history.json.

Responses

  • 200Catalog census.Catalogheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 404The census has not been built on this server.Errorheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl "https://sound.shep.bot/v1/catalog"
GET/v1/statsUsage statistics

Aggregate usage of this server: searches by surface (web, API, MCP), downloads, MCP tool calls, the client families and categories searched most, and per-source health (success rate, p50/p95 latency). Counts come from Prometheus (source: prometheus, last 24 hours and 7 days) or, when it is unavailable, from this process since it started (source: process). No queries, IPs or user agents are exposed. Cached for 60 seconds.

Responses

  • 200Usage statistics.Statsheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl "https://sound.shep.bot/v1/stats"

MCP

Model Context Protocol endpoint for AI agents.

POST/mcpMCP endpoint (Streamable HTTP)

Stateless Model Context Protocol endpoint for AI agents. Tools: search_samples, get_sample, build_kit, find_similar, list_sources (and download_sample on local installs, which saves files with their credits). Point any MCP client at this URL; see /docs/mcp for per-client setup.

Responses

  • 200JSON-RPC 2.0 response.objectheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl -X POST "https://sound.shep.bot/mcp" \
  -H "content-type: application/json" -H "accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_samples","arguments":{"query":"punchy kick","categories":["drums.kick"],"commercial_only":true}}}'

System

Health and machine-readable descriptions.

GET/v1/embeddingsEmbedding index status

Whether audio embeddings are on, the model, how many samples are indexed and the indexing queue.

Responses

  • 200Status.objectheaders: RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset
  • 429Rate limit exceeded. Wait Retry-After seconds.Errorheaders: Retry-After, RateLimit, RateLimit-Policy

Example

curl "https://sound.shep.bot/v1/embeddings"
GET/healthHealth check

Responses

  • 200OKobject

Example

curl "https://sound.shep.bot/health"
GET/openapi.jsonThis OpenAPI document

Responses

  • 200OpenAPI 3.1object

Example

curl "https://sound.shep.bot/openapi.json"

Schemas

Category

One of: drums, drums.kick, drums.snare, drums.clap, drums.hat, drums.hat.closed, drums.hat.open, drums.cymbal, drums.cymbal.crash, drums.cymbal.ride, drums.tom, drums.perc, drums.fill, drums.break, bass, bass.808, bass.sub, vocals, vocals.acapella, vocals.chop, vocals.shout, vocals.spoken, vocals.choir, fx, fx.riser, fx.downlifter, fx.impact, fx.sweep, fx.zap, fx.noise, fx.glitch, fx.transition, foley, ambience, keys, guitar, synth, synth.pad, synth.lead, synth.pluck, synth.stab, strings, brass, woodwind, mallets, other

SampleForm

One of: one-shot, loop, phrase, multisample, pack, midi, preset

CommercialVerdict

One of: yes, yes-with-credit, restricted, clearance-required, check-terms, no

NativeFilter

One of: categories, forms, bpm, key, duration, commercialOnly, freeOnly

MusicalKey

tonic *"C" | "C#" | "D" | "D#" | "E" | "F" | "F#" | "G" | "G#" | "A" | "A#" | "B"
mode *"major" | "minor"

License

id *stringSPDX id where one exists (CC0-1.0, CC-BY-4.0, CC-BY-NC-4.0…), else LicenseRef-*.
name *string
urlstring (uri)
commercialUseboolean
attributionRequiredboolean
shareAlikeboolean
redistributionbooleanMay the sample itself be passed on (in a pack, repo or dataset)? Almost always false.
assertedBy *"source" | "site" | "uploader"source: recorded per item by the site; site: one licence for the whole site; uploader: claimed by an anonymous uploader and not verified (capped at check-terms).
verdict *CommercialVerdict
notestringOne line on why the verdict is what it is.

Price

free *boolean
amountnumber
currencystring

Sample

id *stringGlobally unique <provider>:<nativeId>.
provider *string
nativeId *string
title *string
descriptionstring
url *string (uri)The sample's page on the source site.
authorstring
authorUrlstring (uri)
tags *string[]
genresstring[]
category *Category
categoryEvidenceobjectHow the category was decided: by the source, the file name, word rules or a model, and how sure (0..1).
formSampleForm
unit *"sample" | "pack" | "instrument"One sound, a pack of many, or a playable instrument.
packSizeintegerNumber of sounds when unit is pack or instrument.
bpmnumber
keyMusicalKey
rootNoteintegerMIDI note of a pitched one-shot (60 = C4).
durationSecnumber
sampleRateinteger
bitDepthinteger
channelsinteger
loudnessLufsnumber
previewUrlstring (uri)Always-playable lower quality file (MP3/OGG) for auditioning.
previewNeedsRefererbooleanPlay it through /v1/samples/{id}/preview instead of previewUrl.
thumbnailUrlstring (uri)Pack artwork or a waveform image.
formatsstring[]Known file formats: wav, aiff, flac, ogg, mp3, mid, zip…
licenseLicense
attributionstringReady-to-paste credit line, when the licence asks for one.
pricePrice
requiresAccountbooleanThe full-quality file needs an account on the source site (e.g. Freesound originals).
downloadable *booleanTrue when this server can fetch the files directly.
createdAtstring
popularityintegerDownloads or plays on the source, when published.
sameAsstring[]Ids of the same sound on other sources.
scorenumberRelevance 0..1 assigned by the ranker.

SampleFile

url *string (uri)
filename *string
format *stringLowercase extension: wav, aiff, flac, ogg, mp3, zip, mid…
role *"original" | "preview" | "pack" | "stem" | "midi"
sampleRateinteger
bitDepthinteger
channelsinteger
sizeBytesinteger
requiresAuthbooleanNeeds a login, a purchase or your own token on the source site.

SampleDetails

Sample & object

SampleFilters

categoriesCategory[]
formsSampleForm[]
bpmobject
keyobject
maxDurationSecnumber
minDurationSecnumber
commercialOnlyboolean
freeOnlyboolean

ProviderSearchReport

provider *string
name *string
status *"ok" | "error" | "timeout" | "skipped" | "link"link = the site forbids or blocks automated access; use searchUrl to run the same search there. skipped says why in error.
count *integer
totalintegerTotal hits the source reported.
searchUrlstring (uri)The same search on the source website.
errorstring
filteredLocallyNativeFilter[]Filters this source could not apply itself; the server applied them to the page it returned, so it may hold fewer results than limit.
tookMs *integer

SearchResponse

query *stringThe free text left after BPM, key and form words were parsed out.
filters *SampleFilters
results *Sample[]Merged and ranked; a sound mirrored by several sources appears once.
providers *ProviderSearchReport[]One status line per source.

Provider

id *string
name *string
homepage *string (uri)
description *string
categories *Category[]Top-level categories the source carries.
formsSampleForm[]Forms it carries; absent = any.
access *"api" | "static" | "scrape" | "link"api official API; static a curated manifest filtered locally; scrape public pages; link deep links only (the site forbids or blocks automated access).
pricing *"free" | "freemium" | "paid"
licenseLicense
apiKeyEnvstringEnvironment variable holding the source's API key on a self-hosted server.
supportsDownload *boolean
nativeFiltersNativeFilter[]Filters the source applies itself; the rest are applied locally.
enabledboolean

FileSelection

id *string
licenseLicense
attributionstring
totalBytesinteger
files *SampleFile[]

KitRequest

stylestringGenre or character words added to every slot's search.
slotsstring[]Slot names: category ids (drums.kick), short ids (hat.closed) or words (crash, perc, riser, vocal chop). Default: kick, snare, clap, hat.closed, hat.open, 808.
bpmnumber
keystringKey for pitched slots (808, bass, synth), e.g. "F minor" or "F#m".
commercialOnlybooleanOnly picks whose verdict is yes or yes-with-credit.
providersstring[]
perSlotintegerAlternatives per slot.

KitSample

id *string
title *string
category *Category
formSampleForm
durationnumberSeconds.
keystring
source *stringProvider id.
url *string (uri)
previewstring (uri)Playable URL (through this server's CORS-enabled preview proxy).
license *stringLicence name and verdict label.
verdict *CommercialVerdict
attributionstring

KitSlot

slot *string
category *Category
pickKitSample
alternatives *KitSample[]
reason *stringWhy this pick won, or why the slot is empty.

Kit

name *stringShort kit id (from the style); also the Strudel bank name.
stylestring
bpmnumber
keystring
slots *KitSlot[]
warningsstring[]
licences *objectNumber of picks per licence verdict.
creditsNeeded *booleanTrue when any pick must be credited.
creditsstring[]The credit lines to publish with your track.
strudelobject
gmobjectGeneral MIDI drum mapping (kick 36, snare 38, clap 39, closed hat 42, open hat 46, 808 on 35) and an SFZ file for any SFZ sampler.

CountWithBound

count *integer
atLeastbooleanThe count is a lower bound.

SourceCensus

id *string
name *string
homepage *string (uri)
licensestringThe source's single licence id, when uniform.
pricing"free" | "freemium" | "paid"
supportsDownloadboolean
total *integerListings on the source (free and paid).
atLeastboolean
freeinteger
byCategory *objectListings per top-level category; each listing counts once.
byLicenseobject
categoriesobjectThe source's own categories or tags (may overlap).
unit"samples" | "packs"
addedLast30Daysinteger
downloadsintegerTotal downloads, when the source publishes them.
highlightsobject[]
method *stringHow the source was counted.
countedAt *string (date-time)
staleobject

Catalog

countedAt *string (date-time)
totals *object
byCategory *objectListings per top-level category across sources.
byLicense *object
sources *SourceCensus[]
linkedobject[]

UsageWindow

key *string24h, 7d, or process (since the last restart).
label *string
searches *integer
searchesWithResults *integer
bySurface *object
sampleViews *integer
downloads *integer
toolCalls *integerMCP tool calls.
pageViews *integerWebsite pages served.

Ranked

name *string
count *integer

ProviderHealth

provider *string
requests *integerSearches that reached the source.
ok *integer
errors *integer
timeouts *integer
okRate *number | null
p50Ms *integer | null
p95Ms *integer | null

Stats

generatedAt *string (date-time)
source *"prometheus" | "process"
sincestring (date-time)Start of counting for source: process.
windows *UsageWindow[]
breakdownLabel *stringPeriod covered by clients, tools and assetTypes.
clients *Ranked[]Searches by client family (claude-code, cursor, browser, curl…).
tools *Ranked[]MCP tool calls by tool.
assetTypes *Ranked[]Searches by category filter (any = no filter).
providers *ProviderHealth[]Per-source health over the last 24 hours.
catalog *object

Error

error *string
urlstring (uri)The sample's page on the source, when the file must be fetched there.
requiresAccountboolean
retryAfterinteger

AI agent? This page is also available as markdown.