Guide

Everything the Jam Jam API converts, from a recording to sheet music

The conversion engine behind jam-jam.org/app/convert and the mobile app is also a public REST API: send it a file, a link or plain text, and get back chords, lyrics, key, tempo, or a portable export. Here is exactly what it accepts, what it returns, and how to call it.

Featured tool · Your online chord songbook

A REST API behind the exact same engine

The API lives at jam-jam.org/api/v1 and runs the identical pipeline as the web app, the mobile app and jam-jam.org/app/convert: a file dropped through any of them takes the same code path and gives the same result. Full documentation, with live curl and Python examples and a way to generate a key, is at jam-jam.org/developers. The machine-readable OpenAPI 3.1 specification, at jam-jam.org/api/v1/openapi.json, embeds a recommended call sequence for an agent or a script, and jam-jam.org/llms.txt lists every capability below for an assistant that reads it directly. An official MCP (Model Context Protocol) server, @jam-jam/convert-mcp, wraps the same API as five tools, list_formats, convert_file, convert_text, get_job and get_usage, for MCP-capable agents such as Claude Desktop, Claude Code or Cursor.

A key, a quota, and no queue to join

Calling GET /formats needs no authentication at all, and returns every format this server accepts today with its size and duration limits, so a script can check before it uploads anything. Everything else expects an Authorization: Bearer header, either a Supabase session token or a personal API key prefixed jj_live_..., created for free in Settings > API keys inside the app. Without a key, a call is treated as anonymous: 3 conversions per rolling 24 hours. A free account raises that to 10 a week, the same rolling quota the songbook's own import and export already share; Premium raises it to 500 a month. Every response that spends quota carries X-Quota-* headers with the exact balance, and both uploaded files and results are deleted 24 hours after the job is created, win or lose.

Submit a job, then poll or stream it

A conversion is a job, not an instant reply: POST /jobs with a file as multipart/form-data, or a URL or pasted text as JSON, returns a 202 with the job's id. From there, GET /jobs/{id} polls its state (respecting the Retry-After header), or GET /jobs/{id}/events opens a Server-Sent Events stream of the same job for a script that would rather wait than ask. Once its phase reaches done, GET /jobs/{id}/result downloads the finished file, and GET /jobs/{id}/result/songbook returns the same result as Jam Jam's own JSON pivot, chords, lyrics, sections, key, tempo, ready to read directly. Every error comes back as a standard application/problem+json body instead of a bare status code.

In: a recording, a link, a scan or a photo

An audio or video file becomes a songbook with its chords, lyrics, key and tempo already worked out, the same detection the app runs on a live microphone or an uploaded track, and from there it can go straight into a generated karaoke video or a backing track. A page pasted by URL, or a search query, is read the same way a tab site is read inside the app. A PDF or a photo, a printed chord sheet, a scanned score, a full songbook, guitar tab, even a phone photo of a whiteboard, goes through OCR and Optical Music Recognition into the same pivot. Turning raw audio itself into notation, a staff or a tab, stays behind a quality gate for now: that direction needs a source that already carries the melody, not a live recording.

In: text and notation you already have

ChordPro and OnSong files, plain text with chords or lyrics or an ASCII tab, a Word or RTF document, presentation slides, a spreadsheet or CSV set list, and a pasted web page's HTML all convert into the same songbook, because a chord sheet rarely arrives in just one shape. MusicXML and MIDI files bring their own notes and, when they have them, their lyrics; a Guitar Pro or MuseScore project file (.gp, .gpx, .mscz and related extensions) reaches the songbook the same way, in beta; a synced lyrics file (.lrc, .srt, .vtt, .ass) brings its timing; and a .jamsong file or a zipped export re-imports losslessly, exactly as it left Jam Jam.

Out: whichever format the job actually needs

From that songbook, the API exports a PDF of the chords, the lyrics or a blank grid; a PNG image, an HTML page, plain text, ChordPro, a chords-lab or chords-csv chord annotation, or just the key and tempo; a transposed or capo version; chord diagrams for guitar, ukulele, piano and the other instruments Jam Jam covers; synced lyrics as .lrc or .srt; a karaoke video; a generated backing track; or the lossless .jamsong file, print-ready on request. Once a melody is actually on file, imported from MusicXML, MIDI, a Guitar Pro project, a scanned score or a tab rather than raw audio, that same songbook also exports as sheet music, a guitar tab PDF, MIDI or MusicXML, the last two on Premium.

For the bigger picture on Jam Jam's conversion pipeline, read the universal file conversion overview.

API frequently asked questions

What is the Jam Jam API?

A public REST API at jam-jam.org/api/v1 that runs Jam Jam's own conversion engine: send it an audio file, a PDF, a photo, a link, MIDI, MusicXML, ChordPro or plain text, and get back a structured songbook (chords, lyrics, key, tempo) or a portable export such as a PDF, a karaoke video or a backing track.

Is the API free to use?

Yes, up to a quota. Anonymous calls get 3 conversions per rolling 24 hours, a free account gets 10 a week, and Premium raises that to 500 a month. Uploaded files and results are deleted 24 hours after the job runs.

Can the API turn an audio file into chords and lyrics?

Yes. Posting an audio or video file with output: songbook returns time-stamped chords, the key, the tempo and the lyrics, the same detection the app itself runs. Full melody notation from raw audio (MIDI, MusicXML, a staff or a tab) is not part of that: it needs a source that already carries the melody.

Is there an MCP server for AI agents?

Yes, @jam-jam/convert-mcp exposes the same API as five tools, list_formats, convert_file, convert_text, get_job and get_usage, so an MCP-capable agent such as Claude Desktop, Claude Code or Cursor can call it directly.

Where do I get an API key?

Create a free Jam Jam account, then open Settings > API keys in the app (mobile or web) and generate one. It is shown once, starts with jj_live_, and can be revoked at any time; up to 5 keys per account.

Read the full reference, with live curl and Python examples, at jam-jam.org/developers: