v1.0 — Developer Reference

Chord Intelligence
API

Four endpoints. One harmony engine. Parse any chord symbol, get spelled notes and MIDI, generate instrument-ready voicings, and reharmonize entire progressions.

BASE https://api.thiri.ai/v1 ⎘ Copy
POST Analyze POST Resolve POST Voice POST Reharmonize Errors Pricing
🔑

Authentication

All requests require a Bearer token. Include it in every request header:
Authorization: Bearer your_api_token


1

Analyze Chord

POST
/v1/analyze

Parse any chord symbol into its root, quality, intervals, and extensions. When a key is provided, returns the chord's Roman numeral and harmonic function.

Request
{
  "chord": "Dm7",
  "key": "C"
}
Response
{
  "symbol": "Dm7",
  "root": "D",
  "quality": "minor7",
  "intervals": [0, 3, 7, 10],
  "extensions": [],
  "alterations": [],
  "bassNote": null,
  "numeral": "ii",
  "degree": 2,
  "diatonic": true,
  "function": "predominant"
}
Request Parameters
FieldTypeRequiredDescription
chordstringYesAny standard chord symbol
keystringNoKey center for functional analysis
Response Fields
FieldTypeDescription
symbolstringOriginal input chord symbol
rootstringRoot note name
qualitystringChord quality classification
intervalsnumber[]Semitone intervals from root
extensionsnumber[]Upper extensions present
alterationsstring[]Altered tones (e.g. "b9", "#11")
bassNotestring | nullSlash chord bass note
numeralstringRoman numeral (when key provided)
degreenumberScale degree 1–7 (when key provided)
diatonicbooleanWhether chord belongs to the key
functionstringtonic, subdominant, predominant, or dominant
Supported formats: Standard chord notation including slash chords (Cmaj7/E), shorthand symbols (△, °, ø), all extensions and alterations. Repeat signs (%) and N.C. are handled gracefully.

2

Resolve Chord

POST
/v1/resolve

Resolves a chord symbol to its spelled-out notes, frequencies, MIDI numbers, and recommended improvisation scales.

Request
{
  "chord": "Cm7"
}
Response
{
  "root": "C",
  "quality": "m7",
  "notes": ["C", "Eb", "G", "Bb"],
  "intervals": ["1", "b3", "5", "b7"],
  "semitones": [0, 3, 7, 10],
  "frequencies": [261.63, 311.13, 392.0, 466.16],
  "midi": [60, 63, 67, 70],
  "scales": ["dorian", "aeolian", "phrygian"]
}
Response Fields
FieldTypeDescription
notesstring[]Spelled note names
intervalsstring[]Interval labels
semitonesnumber[]Semitone offsets from root
frequenciesnumber[]Frequencies in Hz (A4 = 440)
midinumber[]MIDI note numbers
scalesstring[]Recommended scales for improvisation

3

Generate Voicing

POST
/v1/voicing

Generate instrument-ready voicings for a chord in a specified style. Supports voice leading from a previous voicing to ensure smooth transitions.

Request
{
  "chord": "Dm7",
  "style": "rootless",
  "octave": 3,
  "previousNotes": ["E3", "G3", "Bb3", "D4"]
}
Response
{
  "notes": ["F3", "A3", "C4", "E4"],
  "style": "rootless",
  "chord": "Dm7"
}
Request Parameters
FieldTypeRequiredDefaultDescription
chordstringYesChord symbol
stylestringNo"pad"Voicing style
octavenumberNo3Base octave
previousNotesstring[]NoPrevious voicing for voice leading
Available Styles
rootless
Jazz voicings without the root — ideal for comping with a bassist
shell
Root, 3rd, and 7th only — economical and clear
drop2
Open voicing with wider spacing — classic big band sound
drop3
Wider drop voicing — orchestral spread
pad
Close-position stacking — full and warm
triad
Basic three-note voicing
Voice Leading: When previousNotes is provided, the engine optimizes the new voicing's register to minimize movement between chords, preventing jarring jumps during progressions.

4

Reharmonize

POST
/v1/reharmonize

Analyze a chord progression and generate reharmonization suggestions. Returns per-bar substitution options with explanations, plus complete alternative progressions.

Request
{
  "bars": ["Cmaj7", "Dm7", "G7", "Cmaj7"],
  "key": "C"
}
Response
{
  "original": ["Cmaj7", "Dm7", "G7", "Cmaj7"],
  "key": "C",
  "suggestions": {
    "0": [{
      "name": "Secondary Dominant",
      "chords": ["A7"],
      "explanation": "A7 targets Dm7 as its V7...",
      "adventurousness": 2,
      "genres": ["jazz", "pop"]
    }]
  },
  "alternatives": [
    {
      "name": "Tritone Subs",
      "bars": ["Cmaj7", "Dm7", "Db7", "Cmaj7"],
      "adventurousness": 4
    },
    {
      "name": "Dark Mode",
      "bars": ["Cmaj7", "Fm7", "G7", "Cmaj7"],
      "adventurousness": 5
    }
  ]
}
Request Parameters
FieldTypeRequiredDescription
barsstring[]YesChord symbols, one per bar
keystringYesKey center
Suggestion Fields
FieldTypeDescription
namestringHuman-readable technique name
chordsstring[]Replacement chord(s) for the bar
explanationstringWhy this substitution works musically
adventurousnessnumberHarmonic adventurousness (1–10)
genresstring[]Genres where this sounds most natural
Alternative progressions: Each response includes up to 4 complete reharmonized versions of the input, from conservative to adventurous. Each includes a name, description, full bar array, and an adventurousness rating.

Error Handling

All endpoints return standard HTTP status codes.

200
Success
400
Invalid input — malformed chord or missing field
401
Unauthorized — invalid or missing token
404
Chord not found in harmony engine
429
Rate limit exceeded
500
Internal server error
Error Response
{
  "error": "invalid_chord",
  "message": "Could not parse chord symbol: Xmaj99"
}
Rate Limits
Free
30
requests / minute
Founder Edition
300
requests / minute
Enterprise
Custom
contact us

Start Free. Scale When Ready.

Pre-launch pricing — join the waitlist to lock in your tier.

Free
$0
forever
100 API calls
10 audio streams
Watermarked audio
30 req/min rate limit
Indie
$29
/month
5,000 API calls
500 audio streams
50 compose renders
Unwatermarked audio
Enterprise
Custom
contact us
Unlimited everything
SLA & dedicated support
Custom catalog curation
Custom rate limits
Copied to clipboard