For the things you’re building

A little code.
A lot of music.

Bring sheet music recognition into your app, workflow, or AI agent. One conversion engine. A REST API and an MCP server.

Free recognition previews · Shared subscription pages · No automatic overages

Upload a score · cURL
curl -X POST 'https://sheetmusicconverter.com/api/v1/conversions' \
  -H "Authorization: Bearer $SMC_TOKEN" \
  -H 'Accept: application/json' \
  -F '[email protected]' \
  -F 'format=musicxml'
Scoped tokensAsynchronous jobs6 output formats

From a file to a finished result

Four steps. Your workflow.

01

Create a token

Choose permissions and an expiry below. Send the token in the Authorization header from your server.

02

Upload & poll

Upload a score. Save the returned ID, then poll its status every five seconds until complete or failed.

03

Review & unlock

Review the output. Explicitly approve using subscription pages, or pay for the score on the website.

04

Download & use

Fetch an unlocked format with the same token. Save your files before the result expires.

Check status
curl 'https://sheetmusicconverter.com/api/v1/conversions/CONVERSION_ID' \
  -H "Authorization: Bearer $SMC_TOKEN" \
  -H 'Accept: application/json'
Unlock with page credits
curl -X POST 'https://sheetmusicconverter.com/api/v1/conversions/CONVERSION_ID/unlock' \
  -H "Authorization: Bearer $SMC_TOKEN" \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -d '{"confirm":true}'

Replace CONVERSION_ID with data.id from the upload response. Statuses are queued, processing, complete, or failed. Preparation, recognition, and export progress appears in stage. Uploads create new jobs: if a response is lost, check your workspace before retrying.

Small API. Useful building blocks.

API reference

Base URL: https://sheetmusicconverter.com/api/v1

POST/conversions

Upload one file

Multipart fields: file, format (musicxml, mxl, mid, mp3, pdf, zip), and optional mode (notation or scan). Returns 202 and data.id.

Required permission: scores:write

GET/conversions/{id}

Check your score

Returns data.status, stage, source_pages, formats, downloads_available, expires_at, and links. Poll every 5 seconds; stop at complete or failed.

Required permission: scores:read

POST/conversions/{id}/unlock

Use subscription pages

Send {"confirm": true} after approving the source-page count. Spends available subscription credits; never creates a monetary charge. Repeating a successful unlock does not spend again.

Required permission: scores:unlock

GET/conversions/{id}/files/{format}

Download a file

Use a format returned by the status response. Include your bearer token on the download request. Locked downloads return 402. source, playback, original-1, and result-1 are also available for review.

Required permission: scores:read

GET/usage

Read page usage

Returns the current plan, remaining_pages, active status, and period_end. The website and API share the same allowance.

Required permission: usage:read

Errors you can handle

401 Missing, invalid, expired, or revoked token.

402 Downloads locked or not enough subscription pages.

403 / 404 Permission missing, or score not found in your account.

409 / 410 Score not ready, or result has expired.

422 Invalid file, parameters, or changed checkout balance.

429 Rate limit or queue capacity reached. Back off before retrying.

Music tools for your agent

Meet your MCP connection.

Connect a client that supports a remote HTTP MCP server with an Authorization bearer header. Use the same scoped token as the REST API. This is token authentication; OAuth-only clients and automatic “Connect account” flows are not supported.

The example uses a common MCP configuration shape. Your client may use different field names or store headers separately. Keep your token in its secure credential settings.

MCP server configuration
{
  "mcpServers": {
    "sheetmusic": {
      "type": "http",
      "url": "https://sheetmusicconverter.com/mcp/sheet-music",
      "headers": {
        "Authorization": "Bearer YOUR_API_TOKEN"
      }
    }
  }
}

get-usage

Check the current plan and remaining page allowance.

create-score

Submit a file as base64. Maximum decoded size: 2 MB. Use the REST API for larger files, then get-score with the returned ID.

get-score

Read progress, page count, expiry, and authenticated download links.

unlock-score

Use subscription pages only after the user approves the page count and confirm is true. No monetary charges are created.

Tools are built with Laravel MCP. Uploaded score content is data, not instructions. Your agent needs permission to upload the file and to spend page credits. Download links also require authentication.

Clear limits. Predictable costs.

Your pages, wherever you work.

API tokens are free. Website and API downloads use the same subscription page allowance. One unlock includes every available format for that score. Unused pages do not roll over.

Compare plans
  • PDF, JPG, PNG · Up to 10 pages in notation mode; one page in scan mode.
  • REST uploads: 20 MB. MCP base64 uploads: 2 MB.
  • 60 requests per minute per account, shared across tokens and MCP. Up to 6 uploads per minute.
  • One conversion at a time per account. A full queue returns 429.
  • Results normally expire after 24 hours. An unlock starts a 24-hour download window.
  • Insufficient pages? The API stops. Purchase through the website; no automatic overage charges.

Your next integration starts here

Make a connection.

Tokens are shown once, stored as hashes, and can be revoked at any time. Set an expiry of 7, 30, or 90 days. Keep credentials on your server, outside client-side code.

More questions?

Your account. Your API.

Sign in to create and manage API tokens. You can test recognition before choosing a plan.