API Reference
HTTP endpoints for ONCE MCP. User-scoped endpoints usually require Authorization: Bearer <token>. Large-file upload chunk + complete requests can also use the scoped x-mcp-upload-token returned by prepare_local_file_upload.
Base URL: https://beta.once.app
Note: MCP submissions debit credits from the authenticated ONCE account.
Authentication
OAuth Metadata Discovery
Protected Resource Metadata for MCP OAuth discovery.
OAuth Authorization Server metadata (RFC 8414).
OpenID Connect metadata compatibility endpoint.
OAuth Endpoints
Authorization endpoint for MCP client browser sign-in.
Token endpoint for authorization code + PKCE exchange and refresh token grants.
Dynamic client registration endpoint for MCP client interoperability.
Most MCP clients use these automatically after a 401 Unauthorized challenge from /api/mcp.
Uploads
Multipart Upload
Upload cover art or audio via multipart form-data.
Form Fields
| Field | Type | Description |
|---|---|---|
file | binary | The file to upload |
type | string | coverArt or audio |
Response
{
"success": true,
"fileUrl": "/api/files/cover-art/USER_ID/file.jpg",
"fileName": "file.jpg",
"userId": "..."
}Local Upload Session
For large local files in Claude Code or Cursor, call the prepare_local_file_upload MCP tool first. It returns:
session_idupload_tokenupload_header_name(x-mcp-upload-token)chunk_endpointcomplete_endpointrecommended_chunk_bytesmax_chunk_bytes
Upload Chunk
Upload a single chunk using the scoped token returned by prepare_local_file_upload.
Headers
x-mcp-upload-token: <upload_token>- For raw bytes:
x-session-id,x-chunk-index,x-upload-type
Multipart Fields
chunkchunkIndexsessionIdtype
JSON Request
{
"chunkBase64": "...",
"chunkIndex": 0,
"sessionId": "uuid-v4",
"type": "audio"
}Raw Bytes Body
Send the chunk as application/octet-stream with the headers listed above.
For large uploads, prefer raw bytes or multipart over JSON base64 to avoid extra payload overhead.
Complete Chunked Upload
Finalize a chunked upload session.
Request
{
"sessionId": "uuid-v4",
"fileName": "Track.wav",
"fileType": "audio/wav",
"type": "audio"
}Include x-mcp-upload-token: <upload_token> on the completion request.
Drafts
Save Draft
Persist a draft snapshot before submission.
Request
{
"releaseId": "optional",
"conversationId": "optional",
"mode": "delta",
"release": { ... },
"tracks": [ ... ],
"trackPatches": [ ... ],
"uploadRequests": [ ... ],
"status": "collecting"
}Releases
Submit Release
Submit a release for distribution. Rate limited; check retryAfterSeconds on 429.
Request
{
"release": {
"title": "My Release",
"primary_artist_name": "Artist Name",
"genre": "Pop",
"release_date": "2026-02-01",
"cover_art_file_url": "/api/files/cover-art/USER_ID/cover.jpg"
},
"tracks": [
{
"title": "My Release",
"primary_artist_name": "Artist Name",
"audio_file_url": "/api/files/audio/USER_ID/track.wav",
"explicit_flag": false,
"writers": [{ "name": "First Last" }]
}
],
"releaseId": "optional",
"conversationId": "optional"
}List Releases
Get recent releases for the authenticated user.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
limit | number | Max results (default 100) |
Get Release Metadata
Get merged metadata for a release.
Get Release Status
Get store delivery and aggregate status.
Get Job Status
Get processing job status and errors.