Creators & communities
Substack
Posts, Notes, messages, subscribers and stats for your publication.
50 endpoints
Releases, earnings, stats and splits from your DistroKid account. Use it in ChatGPT, Claude or any AI agent over MCP, or in n8n, Make and scripts over REST.
10 tools Read and write
DistroKid has no public API, no developer docs, no webhooks and no MCP server (checked 28 Oct 2026). Your money and stats leave the dashboard only as a Bank file you download by hand. Cotlet runs 10 DistroKid tools hosted, over MCP for agents and REST for scripts.
| What you need | Bank CSV by hand | GitHub wrapper | Cotlet |
|---|---|---|---|
| Earnings by store, song or month | Download, then a spreadsheet | If you write it | Yes, filtered |
| Release status and daily stats | No | If you write it | Yes |
| Read and change Splits | No | If you write it | Yes, change after your OK |
| Runs while your computer sleeps | No | No | Yes, hosted |
| Kept working when DistroKid changes | Yes, official | Up to you | Yes, tested every 12 h |
Checked 28 Oct 2026. Sources: DistroKid Help: Using the DistroKid Bank to see your earnings · DistroKid Help: Saving your earnings information as a spreadsheet file · DistroKid API Engineer job ad · DistroKid Terms of Service
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Ask your agent or send an HTTP request.
We never keep your DistroKid password, no tool withdraws money, and a split change waits for your approval. Who can see your session
Use MCP with your AI agent, or HTTP requests in n8n, Make, Zapier and scripts. Follow the MCP setup below or jump to the REST guide.
Sign in to DistroKid in a Cloud Browser. Make a Cotlet account, open DistroKid in its Cloud Browser, sign in as the account owner, type the emailed code and press Enable for agents.
Add the Cotlet address. Enter https://cotlet.dev/mcp/v1 as a new MCP server or connector in your agent.
Allow the agent. Chat apps open a Cotlet sign-in window. Code editors, n8n and cron scripts use an API key from the console instead.
DistroKid shares https://cotlet.dev/mcp/v1 with every other app in your workspace. Turned DistroKid on after you connected? Refresh the connector and its 10 tools appear.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-distrokid \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-distrokid": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-distrokid]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: distrokid_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: distrokid_write Create a Cotlet API key with access to DistroKid and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store.
Connect DistroKid in Cotlet and enable it for agents. Account access: Your own DistroKid account (the account owner; Daily Stats needs the Musician Plus or Ultimate plan).
curl https://cotlet.dev/api/v1/distrokid/releases \
-H "Authorization: Bearer $COTLET_API_KEY" A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs, messages and credit details.
{
"status": "success",
"app": "distrokid",
"tool": "list_releases",
"result": {
"releases": [
{
"release_id": "r_8f3a21",
"title": "Night Drive",
"artist": "Mara Quill",
"release_date": "2026-09-12",
"status": "delivered"
},
{
"release_id": "r_71c0be",
"title": "Low Tide EP",
"artist": "Mara Quill",
"release_date": "2026-10-24",
"status": "processing"
}
],
"next_cursor": null
}
} Returns title, artist, release date and status for each release, newest first, one page at a time with next_cursor. The status mirrors the colored circle left of the artwork on MyMusic: green is delivered to services, yellow is still processing or being delivered, red is an error that blocks delivery.
Release review, approval and delivery can take several days, so yellow is normal for a new upload.
cursor: next_cursor from the previous page.
Keep the same selection when continuing a list. Compare changed record values as well as identifiers when refreshing your destination.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Get one release: tracks, label, release date, status and whether an edit request is pending. Use get_release in your configured content report. |
| Make | HTTP > Make a request | List the detail rows behind the Bank totals, as under "See excruciating detail". Use list_earnings_rows in your configured content report. |
| Python or Node.js | REST API | Estimated daily streams and sales for the last days, from the Stats page. Use get_daily_stats in your configured content report. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and record comparisons.
Cotlet reads DistroKid; your workflow steps write to your chosen destination. These HTTP workflows do not require a native Cotlet connector or a prebuilt template.
Python and Node.js can use the same HTTP requests without an AI agent. Keep access keys in credentials, outside shared workflow exports.
The API and MCP reference lists operations and inputs. The REST API guide explains authentication, errors and approvals.
Stores report every 1 to 2 months, so the last months of the Bank can be empty. Daily stats need Musician Plus or Ultimate. Fan emails from HyperFollow are never returned.
Returns one row per group with earnings and quantity (streams or downloads, depending on the service). Streaming services report every 1 to 2 months and cover streams from a few months earlier, so recent months can be empty. Amounts are the Bank totals as the page shows them. It reads totals only and never starts a withdrawal.
MCP calldistrokid_read → get_earnings_summary
REST endpointGET https://cotlet.dev/api/v1/distrokid/earnings-summary
| Name | Type | Description |
|---|---|---|
| group_by string required | string | artist, song or service. |
| from string | string | Start of the period, YYYY-MM-DD. |
| to string | string | End of the period, YYYY-MM-DD. |
{
"group_by": "group by"
} {
"group_by": "service",
"currency": "USD",
"rows": [
{
"service": "Spotify",
"earnings": 412.6,
"quantity": 128400
},
{
"service": "Apple Music",
"earnings": 188.2,
"quantity": 24100
}
],
"total_earnings": 600.8
} Returns the rows of the detail view with the QUANTITY column, one page at a time with next_cursor. DistroKid builds large reports (over 50,000 records) as files that stay available for 7 days, so a wide period can take longer than a narrow one. Use filters to keep reads small.
MCP calldistrokid_read → list_earnings_rows
REST endpointGET https://cotlet.dev/api/v1/distrokid/earnings-rows
| Name | Type | Description |
|---|---|---|
| from string | string | Start of the period, YYYY-MM-DD. |
| to string | string | End of the period, YYYY-MM-DD. |
| store string | string | Filter by store name as the Bank shows it. |
| release_id string | string | Filter by release id from list_releases. |
| cursor string | string | next_cursor from the previous page. |
{
"rows": [
{
"sale_month": "2026-08",
"store": "Spotify",
"title": "Night Drive",
"quantity": 61200,
"earnings": 198.4
},
{
"sale_month": "2026-08",
"store": "Apple Music",
"title": "Night Drive",
"quantity": 9800,
"earnings": 76.1
}
],
"next_cursor": null
} Returns one row per day with estimates from Spotify, Apple Music, iTunes and Amazon. Services update them about every 24 hours for the previous day, and they often differ from the Bank earnings. Numbers can drop to zero for a day when a service reports late. Needs the Musician Plus or Ultimate plan; on Musician the call fails with APP_PERMISSION_DENIED.
MCP calldistrokid_read → get_daily_stats
REST endpointGET https://cotlet.dev/api/v1/distrokid/daily-stats
| Name | Type | Description |
|---|---|---|
| from string | string | Start date, YYYY-MM-DD. |
| to string | string | End date, YYYY-MM-DD. |
{
"days": [
{
"date": "2026-10-26",
"spotify": 1840,
"apple_music": 220,
"itunes": 3,
"amazon": 41
},
{
"date": "2026-10-27",
"spotify": 1910,
"apple_music": 205,
"itunes": 1,
"amazon": 38
}
]
} Returns how many people visited the release's HyperFollow page and how many followers it added. DistroKid creates a HyperFollow page for every upload. Fan email addresses are not returned.
MCP calldistrokid_read → get_hyperfollow_stats
REST endpointGET https://cotlet.dev/api/v1/distrokid/releases/{release_id}/hyperfollow-stats
| Name | Type | Description |
|---|---|---|
| release_id string required | string | Release id from list_releases. |
{
"release_id": "release_8c41d2"
} {
"release_id": "r_8f3a21",
"visitors": 1520,
"followers_added": 214
} Status follows the colored circle on MyMusic. One edit request at a time; track order, genres and ISRCs stay locked. A removal cannot be called back.
Returns title, artist, release date and status for each release, newest first, one page at a time with next_cursor. The status mirrors the colored circle left of the artwork on MyMusic: green is delivered to services, yellow is still processing or being delivered, red is an error that blocks delivery. Release review, approval and delivery can take several days, so yellow is normal for a new upload.
MCP calldistrokid_read → list_releases
REST endpointGET https://cotlet.dev/api/v1/distrokid/releases
| Name | Type | Description |
|---|---|---|
| status string | string | Filter by the status circle: delivered (green), processing (yellow), error (red). Omit for all. |
| cursor string | string | next_cursor from the previous page. |
{
"releases": [
{
"release_id": "r_8f3a21",
"title": "Night Drive",
"artist": "Mara Quill",
"release_date": "2026-09-12",
"status": "delivered"
},
{
"release_id": "r_71c0be",
"title": "Low Tide EP",
"artist": "Mara Quill",
"release_date": "2026-10-24",
"status": "processing"
}
],
"next_cursor": null
} Returns the fields the Edit Release page shows and the status circle. DistroKid allows one edit request at a time, so edit_pending tells you whether a new one can be submitted. Track order, release language, Album Extras, genres and ISRCs are locked after upload.
MCP calldistrokid_read → get_release
REST endpointGET https://cotlet.dev/api/v1/distrokid/releases/{release_id}
| Name | Type | Description |
|---|---|---|
| release_id string required | string | Release id from list_releases. |
{
"release_id": "release_8c41d2"
} {
"release_id": "r_71c0be",
"title": "Low Tide EP",
"artist": "Mara Quill",
"label": "Mara Quill",
"release_date": "2026-10-24",
"status": "processing",
"edit_pending": false,
"tracks": [
{
"position": 1,
"title": "Low Tide"
},
{
"position": 2,
"title": "Salt Lines"
}
]
} Submits one edit request. Once submitted, DistroKid cannot speed it up or cancel it, and you cannot submit another until it is approved. Most services apply edits within a few days, some take 1 to 2 weeks. Track order, release language, Album Extras, genres and ISRCs cannot be edited. By default you confirm each call; you can switch that off for this tool.
MCP calldistrokid_write → edit_release
REST endpointPATCH https://cotlet.dev/api/v1/distrokid/releases/{release_id}
| Name | Type | Description |
|---|---|---|
| release_id string required | string | Release id from list_releases. |
| changes object required | object | Fields to change, as named on the Edit Release page, for example {"label": "Harbor Lane Records"}. |
{
"release_id": "release_8c41d2",
"changes": "changes"
} {
"release_id": "r_71c0be",
"status": "edit_requested",
"changes": {
"label": "Harbor Lane Records"
}
} Starts the removal at the bottom of Edit Release. It takes up to 1 to 2 weeks to disappear everywhere, and a submitted removal cannot be undone. Removal from only some stores or countries goes through DistroKid support, not this tool. By default you confirm each call; you can switch that off for this tool.
MCP calldistrokid_write → remove_release
REST endpointDELETE https://cotlet.dev/api/v1/distrokid/releases/{release_id}
| Name | Type | Description |
|---|---|---|
| release_id string required | string | Release id from list_releases. |
{
"release_id": "release_8c41d2"
} {
"release_id": "r_71c0be",
"status": "removal_requested"
} Percentages on a song add up to 100. Any change sends collaborators a fresh invitation to accept.
Returns each song with its collaborators, percentage and invitation state. With no Splits set up, 100% belongs to the account owner. Percentages on a song always add up to 100. A collaborator who has not accepted yet is marked pending; DistroKid holds their share until they join.
MCP calldistrokid_read → get_splits
REST endpointGET https://cotlet.dev/api/v1/distrokid/releases/{release_id}/splits
| Name | Type | Description |
|---|---|---|
| release_id string required | string | Release id from list_releases. |
{
"release_id": "release_8c41d2"
} {
"release_id": "r_8f3a21",
"songs": [
{
"title": "Night Drive",
"collaborators": [
{
"email": "mara@example.com",
"percent": 100,
"state": "owner"
}
]
}
]
} Fills in the Splits form and saves it with Review Changes and Save Changes. It invites every new collaborator by email and sends money by percentage from the next earnings on, and any change to an existing Split makes collaborators accept their invitation again. A bad total fails before anything is saved. By default you confirm each call; you can switch that off for this tool.
MCP calldistrokid_write → set_splits
REST endpointPUT https://cotlet.dev/api/v1/distrokid/releases/{release_id}/splits
| Name | Type | Description |
|---|---|---|
| release_id string required | string | Release id from list_releases. |
| song string required | string | Song title as in get_splits. |
| collaborators array required | array | List of {email, percent}. Percentages must add up to 100. |
{
"release_id": "r_8f3a21",
"song": "Night Drive",
"collaborators": [
{
"email": "mara@example.com",
"percent": 70
},
{
"email": "producer@example.com",
"percent": 30
}
]
} {
"release_id": "r_8f3a21",
"song": "Night Drive",
"status": "saved",
"collaborators": [
{
"email": "mara@example.com",
"percent": 70,
"state": "owner"
},
{
"email": "producer@example.com",
"percent": 30,
"state": "pending"
}
]
} Your signed-in DistroKid profile, AES-256-GCM encrypted, in Finland. No password.
The 10 DistroKid tools, never the cookie.
Your releases, Bank totals, stats and collaborator emails in Splits.
Withdrawals, payout details, tax forms, your plan and new uploads.
DistroKid emails a code on a new device. You type it; we never do.
Disable for agents, reset the browser, or change your DistroKid password.
cotlet.dev rates A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). We have no SOC 2 report or third-party pentest yet.
"You may not: ... use any high volume, automated, or electronic means to access the Services (including, without limitation, robots, spiders or scripts)."
The same list bars combining the Services "with hardware, software or other technology or materials not provided by us", and DistroKid may close an account "at any time without notice". That covers every DistroKid tool outside the dashboard, GitHub wrappers too. The takedowns artists report are for fake streams on Spotify, which no tool here creates. We found no case of an account closed for automation (checked 28 Oct 2026).
Read wide Bank periods with filters, a month or a store at a time. DistroKid builds reports over 50,000 rows as files, and the terms name "high volume" access.
DistroKid reworked its Bank export in July 2025, from one TSV to a zip of CSV files. A change like that is ours to absorb, not yours. status.cotlet.dev checks the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Set splits | Set them again; collaborators accept anew |
| Submit an edit request | No, it cannot be cancelled or sped up |
| Remove a release from stores | No, and it takes up to 2 weeks |
| Any read | Nothing to undo |
3 of 10 tools ask first: set_splits, edit_release and remove_release, the three that change what stores or collaborators get. The other 7 only read. You can switch the wait off per tool for a scheduled run.
A pending collaborator's share is held by DistroKid until they join, so a typo in an email only delays their money.
{
"name": "set_splits",
"arguments": {
"release_id": "r_8f3a21",
"song": "Night Drive",
"collaborators": [
{
"email": "mara@example.com",
"percent": 70
},
{
"email": "producer@example.com",
"percent": 30
}
]
}
} curl -X PUT https://cotlet.dev/api/v1/distrokid/releases/r_8f3a21/splits \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"song":"Night Drive","collaborators":[{"email":"mara@example.com","percent":70},{"email":"producer@example.com","percent":30}]}' {
"release_id": "r_8f3a21",
"song": "Night Drive",
"status": "saved",
"collaborators": [
{
"email": "mara@example.com",
"percent": 70,
"state": "owner"
},
{
"email": "producer@example.com",
"percent": 30,
"state": "pending"
}
]
} A royalty spreadsheet or cron job can call the same tools over REST at /api/v1/distrokid, one key, one price. get_daily_stats on the Musician plan fails with APP_PERMISSION_DENIED, and a failed call is free. The tools table lists the REST path of each tool.
About $12 a monthfor one artist with about a release a month, 2,120 credits. Your DistroKid plan stays billed by DistroKid.
| Job | Calls | Credits |
|---|---|---|
| Delivery check on new releases, daily | 1 × 30 | 300 |
| Bank earnings by store and song, weekly | 4 × 4 | 160 |
| Daily stats and HyperFollow digest, weekly | 3 × 4 | 120 |
| Splits for the new release | 2 × 1 | 20 |
| Label name fix by edit request | 2 × 1 | 20 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 2,120 |
The month is our example: one artist on Musician Plus ($44.99 a year at DistroKid), on the 6 to 12 singles a year most release advice gives independents. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| sowahq/distrogo | Go wrapper of the private API behind the DistroKid iOS app, 21 stars, MIT. | You intercept the app's token yourself; last push 29 Jul 2024; the terms ban reverse engineering. |
| Xtvback/solvero-distrokid-mcp | The only DistroKid MCP server on GitHub: prepares release manifests and checks audio and cover files. | By its own README it has no live link to a DistroKid account. |
| Infinite Catalog, Royalti.io | Royalty accounting with a DistroKid statement importer. | You still download each Bank file and upload it by hand. |
| Sheet Split, Good Splits | Free calculators that split the DistroKid export among collaborators. | DistroKid Splits already pays shares; these work on a file, not the account. |
For a yearly royalty statement, a royalty tool on the CSV is enough. For a weekly look at money, release status and splits without downloading anything, Cotlet lets an agent read your DistroKid account directly.
Cotlet belongs to Take Group sp. z o.o., a Polish software company in the EU (VAT PL6342984273) working since 2019. Its founders are Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Questions about the DistroKid tools go to contact@cotlet.dev.
Sign up free at https://cotlet.dev, open DistroKid under Integrations in the console and sign in to DistroKid in its Cloud Browser, with the code DistroKid emails you. The trial starts with your first app and needs no card.
Sign up at cotlet.dev, log in to DistroKid once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your DistroKid account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in DistroKid: monthly earnings report by store; check release delivery status; set up splits for a new release. You ask in plain words, and anything that reaches other people waits for your OK first.
No. Uploading new releases and withdrawals are outside these tools, and money leaves your Bank only when you withdraw it in DistroKid. The tools read earnings and stats, set splits, and submit edit and removal requests. DistroKid also documents that earnings are paid out after streaming services report them, 2 to 3 months later.
Earnings, releases, splits and HyperFollow stats work on any plan. get_daily_stats needs Musician Plus or Ultimate, because DistroKid shows Daily Stats only on those plans.
No. DistroKid sends no events out, so nothing tells an agent that a release went green or new earnings arrived. Run it on a schedule instead: a daily list_releases and a weekly get_earnings_summary cover most needs.
A DistroKid job ad for an API engineer lists MCP server work among its duties, but nothing is public as of 28 Oct 2026. If an official route appears, this page will say what it covers.
Only in how you call it. Both carry the same 10 tools, inputs and answers, with one API key and one price. Agents use MCP; spreadsheets, scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with DistroKid LLC.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the alternative for AI agents; you do not need to connect an agent to use REST.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy