Skip to main content

songbrain

Song in, video plan out. The official Python client for the Songbrain API, the music analysis API for AI video.

One call returns the song DNA (genre, tempo, key, mood, instruments, loudness), a beat grid, sections, the best moments with reasons, word-timed lyrics, the story, world and palette, and a beat-synced shot plan with a ready prompt for every scene.

pip install songbrain

Python 3.9+. One dependency: requests.

Quickstart

Get a key at app.songbrain.ai/developers. 5 songs a month are free.

from songbrain import Songbrain

sb = Songbrain()  # reads SONGBRAIN_API_KEY

song = sb.analyze("song.mp3")  # or analyze(audio_url="https://…/song.mp3")

print(song["song_dna"]["genre"], song["song_dna"]["tempo_bpm"], song["song_dna"]["key"])
for scene in song["shot_plan"]["clip"]["scenes"]:
    print(f'{scene["start_sec"]:.2f}-{scene["end_sec"]:.2f} [{scene["act"]}] {scene["prompt"]}')

analyze() uploads the song, waits until the analysis is done (typically 60–90 s) and returns the full document.

Try it without a key

The example endpoints return real analyses of Songbrain's own songs, in exactly the format your songs get.

from songbrain import Songbrain

sb = Songbrain()
print([e["id"] for e in sb.examples()["data"]])
plan = sb.example_shot_plan("old-truck-home")
print(plan["shot_plan"]["clip"]["scenes"][0]["prompt"])

Methods

Every method returns the JSON body of the response as a dict. Types for editors live in songbrain.types (Song, SongDNA, Timeline, BestMoment, Lyrics, Scores, Story, ShotPlan, Scene, …).

Method API call Key
analyze(file=None, *, audio_url=None, title=None, artist=None, webhook_url=None, external_ref=None, filename=None, wait=True, poll_interval=5, timeout=300) POST /songs, then polls GET /songs/{id} yes
wait_for(song_id, *, poll_interval=5, timeout=300) polls GET /songs/{id} yes
get_song(id, view=None, include=None) GET /songs/{id} yes
shot_plan(id) GET /songs/{id}/shot-plan yes
list_songs(limit=20) GET /songs yes
delete_song(id) DELETE /songs/{id} yes
account() GET /account yes
pricing() GET /pricing no
examples() GET /examples no
example(id, view=None, include=None) GET /examples/{id} no
example_shot_plan(id) GET /examples/{id}/shot-plan no
  • file can be a path, bytes or an open binary file. MP3, WAV, FLAC, M4A, AAC, OGG or AIFF, up to 100 MB, 30 s to 10 min. The file name's extension has to match the audio; for bytes without a name the client detects the format or you pass filename="song.mp3".
  • wait=False returns the 202 body right away: {"id", "status": "processing", "eta_sec", "billing"}. Use wait_for(id) or a webhook later.
  • view="summary" drops word timings and beat arrays (about 3x smaller). include=["song_dna", "shot_plan"] returns only those sections.
sb = Songbrain(api_key="sb_live_…", timeout=60, max_retries=3)

Errors

API errors raise SongbrainError with .status, .code and .message. Subclasses:

Exception When
AuthenticationError 401 missing_api_key, invalid_api_key
InsufficientCredits 402: free songs used up and fewer than 25 credits
NotFound 404: unknown id, or not yours
RateLimited 429, with .retry_after in seconds
AnalysisFailed the song was accepted but failed (credits are refunded)
WaitTimeout analyze(wait=True) gave up; the song keeps processing

The client retries 429 and 5xx responses up to 3 times with backoff and honours Retry-After (up to 60 s). Uploads are only retried when nothing can have been created (429, 502, 503).

from songbrain import Songbrain, InsufficientCredits, RateLimited

try:
    song = Songbrain().analyze(audio_url="https://example.com/song.mp3")
except InsufficientCredits:
    print("Top up at https://app.songbrain.ai/developers/billing")
except RateLimited as e:
    print("Try again in", e.retry_after, "s")

Webhooks

Pass webhook_url and Songbrain POSTs song.done or song.failed (and account.low_balance). Verify the Songbrain-Signature header against the raw body:

from songbrain import webhooks

ok = webhooks.verify(raw_body, request.headers["Songbrain-Signature"], secret)  # bool
event = webhooks.construct_event(raw_body, header, secret)  # verified dict, or raises

The default tolerance is 300 s. A full Flask receiver is in examples/python/webhook_server.py.

Pricing

5 free songs per account per month. Then 25 credits per song (about $0.50). No subscription. Everything is included: analysis, story and shot plan. Results are yours, also in a paid or white-label product. See Terms §17.

MIT License.

Metadata

Release files for songbrain 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 songbrain 0.1.0
File Size Uploaded
songbrain-0.1.0.tar.gz 18.3 kB Details

Built distribution (wheel)

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

Total release size: 35.4 kB

Release files / songbrain-0.1.0.tar.gz

Download URL songbrain-0.1.0.tar.gz
Size 18.3 kB
Tags Source
SHA-256 checksum
How to use checksums
e82a777428a1b1a684cec59699d0184416a9cfa3f492af7b485b066c72cad198
BLAKE2b-256 checksum
How to use checksums
4f381e9ff5865c64233aa1bbdb330a61e99cbc0536ebbcab471cda9163c7e012
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 Oct 6, 2026.

Transparency log

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

Download URL songbrain-0.1.0-py3-none-any.whl
Size 17.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
47c8de0c42c9d5e6ec9ad9edfcb1085fcd3e8e61f754d03852644d3f236e450e
BLAKE2b-256 checksum
How to use checksums
9e760f60faeceedc2560d68323e49f8838779a0017d9db827f544497683c225b
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 Oct 6, 2026.

Transparency log

Release history Release notifications | RSS feed

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

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