Skip to main content

songfinderdev

Identify any song from a link or an audio file, then read its BPM, musical key and Camelot code — from your terminal or your Python code.

PyPI Python License Dependencies API key

The official Python client for Song Finder, a free online song finder that identifies music from a file, a microphone recording or a link. No API key. No account. No rate card.

Standard library only — no requests, no transitive dependencies, nothing to audit.


Install

pip install songfinderdev

Python 3.9+.

Why not songfinder? An unrelated project already owns that name on PyPI, and its wheel's top-level directory is songfinder too — sharing either name would have the two installs silently overwrite each other. songfinder-cli is not an option either: PyPI's similarity check strips common suffixes like cli, api and sdk before comparing, so every such variant collides as well. Hence songfinderdev, matching the domain.

The command installs as both songfinder and songfinderdev, so it still works if something else on your PATH already claims the shorter name.


Command line

songfinder identify "https://www.youtube.com/watch?v=..."
songfinder analyze "strobe deadmau5"
I Remember (Strobelight Edit) — deadmau5
Strobelite Seduction (2013)
ISRC:           USUS10800096

Tempo:          128 BPM
Key:            B Minor (Camelot 10A, Open Key 3m)
Mixes with:     10B, 9A, 11A
Energy:         59%
Danceability:   66%

(Real output, not a mock-up.)

songfinder identify <url|file> [--start SECONDS]
songfinder search   <query>
songfinder analyze  <query|ISRC>
songfinder similar  <query|ISRC> [--limit N] [--harmonic]

Every command that names a track accepts a search phrase as readily as an ISRC — you never have to look a code up by hand first. Add --json to any command for the raw API response.

# what is playing in this video
songfinder identify "https://www.tiktok.com/@user/video/123..."

# what is this file on disk
songfinder identify ~/Music/unknown.mp3

# sample 90 seconds in, when the opening is silence or an intro
songfinder identify "https://youtu.be/..." --start 90

# five tracks that mix harmonically into this one
songfinder similar "strobe deadmau5" --harmonic --limit 5

Library

from songfinderdev import SongFinder, tempo_disagrees

sf = SongFinder()

track = sf.search("blinding lights weeknd")[0]
detail = sf.detail(track["isrc"])

print(detail["features"]["tempo"])              # 171.005
print(detail["features"]["key"]["camelot"])     # '3B'
print(detail["features"]["key"]["compatible"])  # ['3A', '2B', '4B']

if tempo_disagrees(detail):
    # a second provider read this at half or double time — see below
    ...
Method Returns
search(query) Up to 10 catalogue candidates with ISRCs
detail(isrc) Tempo, key, Camelot code, energy/danceability/valence, genre
similar(isrc, limit=…, harmonic=…) Neighbouring tracks, each with its own tempo and key
identify_url(url, start_seconds=None) Recognition from a page or media URL
identify_file(path) Recognition from a local audio file (max 10MB)
resolve_isrc(title, artist) Bridges recognition output to the analysis methods

Failures raise SongFinderError, which carries the HTTP status when there was one.


Two things this gets right

Half-time and double-time tempo. detail() returns a second provider's reading in tempoCrossCheck. When the two disagree by more than 3 BPM, one of them counted the groove at half speed — an 87/174 pair is the same track. tempo_disagrees(detail) tells you; the CLI prints a warning. Reporting the primary figure alone is how this data most often misleads people.

Recognition returns no ISRC. Every analysis method is keyed by ISRC, so the chain would dead-end right after the interesting part. resolve_isrc() closes that gap with one catalogue search, and never raises — a lookup failure must not sink a successful match.


Notes

Recognition is rate-limited per IP because it spends paid third-party quota. The analysis endpoints allow roughly one call per 1–5 seconds depending on how far they fan out upstream. A 429 means you went too fast, not that the track is missing.

The credited artist is not always the original artist. Widely re-uploaded tracks match white-label catalogue entries, so a famous song can come back credited to a label nobody has heard of. The title is still right — search that title to find the original release.

Audio you identify is uploaded to songfinder.dev and is not retained. Analysis calls send only a text query or an ISRC — no audio.

Coverage is uneven for long-tail releases. Many have a tempo but no key, or no analysis at all. Missing fields come back None rather than being invented.


Also available

License

MIT

Metadata

Release files for songfinderdev 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for songfinderdev 0.1.0
File Size Uploaded
songfinderdev-0.1.0.tar.gz 11.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for songfinderdev 0.1.0
File Interpreter ABI Platform
songfinderdev-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 24.8 kB

Release files / songfinderdev-0.1.0.tar.gz

Download URL songfinderdev-0.1.0.tar.gz
Size 11.5 kB
Tags Source
SHA-256 checksum
How to use checksums
bcbdae251bd13d918b4226fd5f09ec1a98b026a3c4c3f54cc314fa44325063d7
BLAKE2b-256 checksum
How to use checksums
c1e5b31c88b50b0952871ddec7f9d58782e1f6d31885ae84f2e9099dc3779224
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 15, 2026.

Transparency log

Release files / songfinderdev-0.1.0-py3-none-any.whl

Download URL songfinderdev-0.1.0-py3-none-any.whl
Size 13.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
961879a7cefde6d347d5ed6e0dc3412253730307c36c35a034e559f66cf0cc3b
BLAKE2b-256 checksum
How to use checksums
dd6f2b923b8a90c73e4e025b9b46459849c8850f6cc5805a6337545b344e1825
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page