Chord finder
Type C, E and G and the finder names it C major in root position. Enter three or more note names in any octave to get the root, the quality and the inversion of the chord under your fingers. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
A chord finder answers the question musicians type when they already have notes and need a name: which triad or seventh do these pitches spell? Guitarists who landed on a cluster at the seventh fret, pianists who held a voicing without a lead-sheet symbol, and theory students checking homework all want the same contract — send a list of note names, receive the root and quality such as C major or A minor seventh, without installing a DAW plugin. This chord finder maps each token to a pitch class, drops duplicate spellings of the same class, and matches the interval set against a published quality table.
How a chord finder names a stack of notes
A named chord is a pitch-class set measured from a root by a fixed interval formula. C, E, and G are the pitch classes zero, four, and seven; from C those offsets are a perfect unison, a major third, and a perfect fifth, which every textbook calls a major triad. A, C, E, and G are zero, three, seven, and ten from A — a minor seventh.
The finder does not listen to audio and does not care which octave you played: C4 and C5 are the same class, and repeating a class does not add a new tone. Identification therefore starts by parsing each token as a letter A through G with an optional sharp or flat, converting it to a residue modulo twelve, and keeping the first spelling you used for that class. Each remaining class is then tried as a candidate root.
The offsets from that candidate are sorted and looked up in a table of published qualities: major, minor, diminished, augmented, suspended second and fourth, dominant seventh, major seventh, minor seventh, diminished seventh, half-diminished seventh, minor-major seventh, major and minor sixth, add nine, seventh suspended fourth, and common ninths. An exact set match wins; leftover tones are not fuzzed into a nearby jazz name.
When two roots both match — the classic C6 versus Am7 pair on C, E, G, and A — the engine prefers the first distinct input note as bass if that note is a legal root, then the lower inversion, then a simpler quality rank. The search this page ranks for is “chord finder”: notes in, name out. Expanding a known symbol into tones is a different query, served by a chord note calculator, and the two must not cannibalize each other.
What to enter, inversions and what you get back
Arrays of the same tokens are accepted so a client that already holds a list does not have to join it. Letters A through G are case-insensitive; accidentals may be written #, b, ##, bb, or the unicode sharp and flat signs; a trailing octave digit such as C4 is stripped. Duplicate pitch classes are ignored after the first spelling.
You need at least three distinct valid notes — a dyad is not named as a triad or seventh here, and two copies of C plus one E still fail that floor. A legal list that matches no published quality also fails rather than inventing a slash chord. Order of input notes after the bass does not change the named chord: E, G, C is still C major, reported in first inversion because the bass is E.
Practice, songwriting and related chord tools
Songwriters who voicings on a piano or a fretboard and want a lead-sheet symbol paste the sounding pitch classes and read the name plus inversion, then decide whether to write C/E or a root-position C. Validation failures never consume balance. This capability names pitch-class sets only.
It does not suggest fingerings, spell enharmonic roots for a key signature you did not send, analyse a recording, or transpose a symbol by semitones — use a transposition calculator for that shift, and a chord note calculator when you already know the quality and want the tones. Source inputs follow the same retention rules as other KIT parse items. Pin the chord, symbol, and inversion fields in tests so a table change cannot silently rename Am7 as C6 when the bass is A.
What you can do with it
Theory homework and ear-training drills
Students paste the notes they hear or spell and check the returned root, quality, and inversion against their own analysis, with a clear error when fewer than three distinct notes are given.
Songwriting from a piano or fretboard voicing
Writers who held a cluster without a lead-sheet symbol send the sounding pitch classes and receive a display name such as C major or A minor seventh plus a compact symbol.
FAQ
How do I identify a chord from a list of notes?
The response includes root, quality, the display name chord, a compact symbol, and inversion.
Why do I need at least three distinct notes?
A named triad or seventh is a set of at least three pitch classes.
Does note order change the chord name?
The named chord is the pitch-class set. Order after the first distinct note does not change the root and quality. The first distinct note is the bass and selects the inversion (E, G, C is C major in first inversion).
Which note names and accidentals are accepted?
Letters A through G, optional #, b, ##, bb or unicode sharp and flat, and optional octave digits (C4). Duplicate pitch classes are ignored.
What does the chord finder cost?
The browser tool runs free on your device.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/hobby/chord-finder \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"notes":"C, E, G"}'const res = await fetch("https://api.kit.forhosting.com/hobby/chord-finder", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"notes": "C, E, G"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/hobby/chord-finder",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"notes": "C, E, G"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/hobby/chord-finder", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"notes":"C, E, G"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"notes":"C, E, G"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/hobby/chord-finder", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"notes": "C, E, G"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.chord_finder",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Fewer than three distinct valid notes, an unrecognized token, or a set that matches no quality fails with invalid_input instead of a guessed nearest chord. Successful calls are billed at $0.002; failed validation is not charged.
How a chord finder names a stack of notes
That rule is deterministic, so identical lists always produce identical JSON.
Input contract, inversions, errors, and the response shape
POST a JSON body with the required field notes: a string of pitch-class tokens separated by commas, spaces, or semicolons, such as C, E, G or A C E G. Aliases text, input, and chord_notes are honoured. Unrecognized tokens such as H or Foo fail with invalid_input naming the bad note. On success the body returns root, quality in prose (major, minor seventh, …), chord as the display phrase C major or A minor seventh, a compact symbol such as C or Am7, bass as the first distinct input note, inversion as an integer with inversion_name in words (root position, first inversion, …), and the stacked notes, pitch_classes, intervals, and semitones from the chosen root. Missing notes, an empty string, more than thirty-two tokens, or a non-string non-array value fail with invalid_input and are not billed. Pricing for a successful item is a flat $0.002.
Practice, songwriting, API use, and nearby tools
Ear-training apps and theory homework use a chord finder so a student who wrote C, Eb, G can confirm C minor without flipping a third by hand, and so a grader can reject a two-note answer as invalid_input instead of marking an empty success. Fretboard and MIDI tools that already know which keys were down can POST the same list and cache the JSON because the path is pure modular arithmetic: no network, no random seed, no wall clock. Call the free in-browser chord finder for drills and demos; use the prepaid API at $0.002 per successful item when a tutoring platform or a setlist helper needs the contract under KIT balance.
Integration use cases
Tutoring platforms and MIDI pitch-class stacks
Curriculum generators and instrument apps POST deterministic note lists to name chords for auto-graded quizzes and on-screen labels at a stable prepaid unit price.