Licensing API

Chordal · InstantClear™ Network

Licensing API Reference

The InstantClear™ Licensing API lets approved platforms launch a synchronization-licensing product over fractionally-owned commercial songs — browse pre-cleared catalogs, build projects, download audio, and report usage back to Chordal.

Base URL
https://api.chordal.com
Version
v1 (path-prefixed)
Format
JSON over HTTPS
Auth
Bearer token (JWT)
Availability
Tiered — white-label in Enterprise
Machine-readable
OpenAPI · Postman

Overview

Chordal's InstantClear™ API enables approved platforms to quickly launch a sync-licensing product backed by fractionally-owned commercial songs. It is offered in multiple tiers depending on how deeply you integrate — from simple music pulls to a fully white-labeled user experience (Enterprise tier).

Core concepts

TermMeaning
InstantClear template
preclearedProgram
A pre-negotiated licensing program (media, territory, term, duration, pricing windows) configured for your company. Tracks are licensed under a template's terms.
ProjectA working container tied to one InstantClear template. You group tracks and run licensing inside a project.
TrackA song available within a project's catalog, with rich musical metadata, audio, and stems.
LicenseA usage confirmation you report back to Chordal for a specific track in a project.
Rate typeHow a program prices usage: FLAT (a fixed per-use fee) or METERED (variable, reported per accounting period). Set by your Chordal account manager.

Typical integration flow

#StepEndpoint
1Discover the InstantClear templates available to youGET /v1/licensing/preclearedPrograms
2Create a project under a templatePOST /v1/licensing/projects
3Browse the project's tracksGET /v1/licensing/projects/{id}/tracks
4Download audio / stems for productionGET …/{model_type}/{model_id}/download
5Report usage back to ChordalPOST …/tracks/{track_id}/licenses

Authentication

Every endpoint requires authentication. Chordal issues you a signed JSON Web Token (JWT), which the platform verifies on every request. Send it as a Bearer token in the Authorization header.

Authorization: Bearer {YOUR_AUTH_KEY}
Accept: application/json
Content-Type: application/json   # on requests with a JSON body
Keep your token secretThe token is scoped to your company. Never embed it in client-side code or public repositories. Contact your Chordal account manager to rotate a key.

Base URL & versioning

All requests go to a single host, with the version baked into the path. The current and only version is v1.

https://api.chordal.com/v1/licensing/{endpoint}

Pagination & sorting

List endpoints share a common set of query parameters and return a paginated envelope.

ParameterTypeDefaultDescription
order_bystringidField to sort by (varies per endpoint).
sort_typestringascasc or desc.
pageinteger1Page number.
per_pageinteger15Results per page.
{
  "data": [ ... ],
  "links": { "first": "…?page=1", "last": "…?page=10", "prev": null, "next": "…?page=2" },
  "meta":  { "current_page": 1, "from": 1, "last_page": 10, "per_page": 15, "to": 15, "total": 150 }
}

Errors

The API uses conventional HTTP status codes. A successful create/read returns 200; a successful delete returns 204 with an empty body. 4xx means the request was rejected; 5xx indicates a problem on Chordal's side.

StatusMeaning
200OK — request succeeded.
204No Content — delete succeeded, empty body.
401Unauthorized — missing or invalid token.
403Forbidden — token lacks access to this resource.
404Not found — the project, track or program id does not exist or is not visible to you.
422Unprocessable — payload failed validation (e.g. METERED fields missing, period_ends not after period_starts).
429Too many requests.
Heads upThe source documentation only lists success responses. The error model above follows the conventional shape implied by the stack — confirm exact codes and the validation-error body with Chordal. See Notes & open questions.

Endpoints

InstantClear templates

GET/v1/licensing/preclearedProgramsAuth required

Lists all InstantClear templates associated with your company's account.

Query paramTypeDefaultDescription
namestringSearch by program name.
order_bystringidOne of idnamecreated_at
sort_typestringascasc / desc
page / per_pageinteger1 / 15Pagination.

Response 200

{
  "data": [
    {
      "id": 1,
      "name": "Program Name",
      "description": "A brief description of the program.",
      "media": "TV and Streaming",
      "territory": "United States",
      "term": "1 Year",
      "duration": "Up to 0:60",
      "subscription_starts_at": "2025-03-21T12:00:00Z",
      "subscription_ends_at": "2026-03-21T12:00:00Z",
      "usage_starts_at": "2025-03-21T12:00:00Z",
      "usage_ends_at": "2026-03-21T12:00:00Z",
      "payment_deadline_at": "2026-03-21T12:00:00Z",
      "created_at": "2025-03-21T12:00:00Z"
    }
  ],
  "links": { "first": "…?page=1", "last": "…?page=10", "prev": null, "next": "…?page=2" },
  "meta":  { "current_page": 1, "last_page": 10, "per_page": 15, "total": 150 }
}

List projects

GET/v1/licensing/projectsAuth required

Lists the projects associated with an InstantClear template in your company's account.

Query paramTypeDefaultDescription
titlestringSearch by project title.
license_statusstringOne of all-activepending-confirmationpending-paypaid
order_bystringidOne of idtitlecreated_at
sort_typestringascasc / desc
page / per_pageinteger1 / 15Pagination.

Response 200

{
  "data": [
    {
      "id": 1,
      "title": "Project Title",
      "slug": "project-title",
      "description": "A brief description of the project.",
      "preclearedProgram": { "id": 1, "name": "Program Name" },
      "tags": [ { "id": 1, "name": "Tag Name 1" } ],
      "image_url": "https://cdn.chordal.com/image.jpg",
      "created_at": "2025-03-21T12:00:00Z"
    }
  ],
  "links": { "first": "…?page=1", "last": "…?page=10", "prev": null, "next": "…?page=2" },
  "meta":  { "current_page": 1, "last_page": 10, "per_page": 15, "total": 150 }
}

Create a project

POST/v1/licensing/projectsAuth required

Creates a project under an InstantClear template. Sent as multipart/form-data so you can upload a cover image.

FieldTypeDescription
titlestringrequiredThe project title.
descriptionstringoptionalProject description.
precleared_program_idintegeroptionalThe InstantClear template this project belongs to.
imagefileoptionalCover image upload.
image_urlstringoptionalCover image by URL (alternative to image).
tagsstring[]optionalTags to attach (tags[] form fields).

Example request

POST /v1/licensing/projects
Content-Type: multipart/form-data

title=Euphoria
description=A brief description of the project.
precleared_program_id=1
image_url=https://cdn.chordal.com/image.jpg
tags[]=tag1
image=@cover.jpg

Response 200

{
  "data": {
    "id": 1,
    "title": "Project Title",
    "slug": "project-title",
    "description": "A brief description of the project.",
    "preclearedProgram": { "id": 1, "name": "Program Name" },
    "tags": [ { "id": 1, "name": "Tag Name 1" } ],
    "image_url": "https://cdn.chordal.com/image.jpg",
    "created_at": "2025-03-21T12:00:00Z"
  }
}

Delete a project

DELETE/v1/licensing/projects/{project_id}Auth required

Deletes a project. Returns 204 No Content on success.

Path paramTypeDescription
project_idintegerThe id of the project to delete.

Response 204

// empty body

List project tracks

GET/v1/licensing/projects/{project_id}/tracksAuth required

Lists the tracks available in a project, with full musical metadata. Supports rich search and opt-in/opt-out date filters.

ParamInTypeDescription
project_idpathintegerThe project id.
titlequerystringSearch by track title.
isrcquerystringFilter by ISRC.
iswcquerystringFilter by ISWC.
opted_in_from / opted_in_toquerydateWindow for when a track opted in.
opted_out_from / opted_out_toquerydateWindow for when a track opted out.
order_byquerystringOne of idtitlealbum.titleartist.name (default id).
sort_typequerystringasc / desc
page / per_pagequeryintegerPagination.

Response 200 (one track)

{
  "id": 1,
  "isrc": "USRC17607839",
  "iswc": "T-123.456.789-0",
  "title": "Track Title",
  "year": 2020,
  "release_date": "2020-05-20",
  "language_code": "en",
  "version_type": "original",
  "mix_type": "instrumental",
  "structure": "has-build",
  "key": "C major",
  "tempo": 120,
  "energy_level": "high",
  "emotional_tone": "bright-uplifting",
  "recognizability": 750,
  "artists":   [ { "id": 1, "name": "Artist One" } ],
  "albums":    [ { "id": 1, "title": "Album One" } ],
  "genres":    [ { "id": 1, "name": "Pop" } ],
  "subgenres": [ { "id": 1, "name": "Indie Pop" } ],
  "moods":     [ { "id": 1, "name": "Happy" } ],
  "instruments":     [ { "id": 1, "name": "Guitar" } ],
  "creativeKeywords":[ { "id": 1, "name": "Uplifting" } ],
  "lyricMoods":      [ { "id": 1, "name": "Sad" } ],
  "lyricThemes":     [ { "id": 1, "name": "Ambition" } ],
  "lyrics_summary": "A summary of the lyrics",
  "image_url": "https://cdn.chordal.com/image.jpg",
  "audio_url": "https://cdn.chordal.com/audio.mp3",
  "duration": 180,
  "stems": [
    { "id": 101, "title": "Guitar Stem", "instrument": "Guitar", "audio_url": "https://cdn.chordal.com/stems/guitar.mp3", "duration": 180 }
  ]
}

See the Track & Stem model for the meaning and allowed values of each musical field (version_type, mix_type, energy_level, emotional_tone, etc.).

Download audio

GET/v1/licensing/projects/{project_id}/{model_type}/{model_id}/downloadAuth required

Downloads the audio file for a track or a stem. Returns the binary file.

ParamInTypeDescription
project_idpathintegerThe project id.
model_typepathstringtracks or stems.
model_idpathintegerThe track or stem id to download.
track_qualityquerystringAudio quality — hi-res or mp3.

Example

GET /v1/licensing/projects/1/tracks/10/download?track_quality=hi-res
// → 200 OK, binary audio file

Report a license

POST/v1/licensing/projects/{project_id}/tracks/{track_id}/licensesAuth required

Delivers a license / usage confirmation back to Chordal for a track in a project.

FLAT vs METEREDIf your program uses the FLAT rate type, this reports an individual usage at the per-license rate. If it uses METERED, you report usage for an accounting period via total_reported_royalties, period_starts and period_ends (these three are required for METERED programs). Your rate type is configured by your Chordal account manager.
ParamInTypeDescription
project_idpathintegerrequiredThe project id.
track_idpathintegerrequiredThe track id.
brief_titlebodystringoptionalTitle of the brief. Defaults to "Usage Report DD/MM/YYYY (Period: …)".
air_datebodydateoptionalAir date of the license.
linksbodystring[]optionalReference links for the usage.
total_reported_royaltiesbodyintegerMETEREDPrice in cents (required if rate type is METERED).
period_startsbodydateMETEREDStart of the usage period (required if METERED).
period_endsbodydateMETEREDEnd of the usage period; must be after period_starts.
external_idbodystringoptionalYour own identifier for the license.
metadatabodyobjectoptionalArbitrary additional metadata.

Example request

POST /v1/licensing/projects/1/tracks/10/licenses
{
  "brief_title": "Upbeat, emotional electronic tracks",
  "air_date": "2024-09-25",
  "links": [ "https://www.youtube.com/watch?v=dQw4w9WgXc" ],
  "total_reported_royalties": 1000,
  "period_starts": "2024-10-01",
  "period_ends": "2024-12-31",
  "external_id": "EXT-12345",
  "metadata": { "key": "value" }
}

Response 200

{
  "data": {
    "id": "SYNCHID-1.1",
    "total_reported_royalties": 1000,
    "external_id": "EXT-12345",
    "period_starts": "2024-10-01",
    "period_ends": "2024-12-31",
    "air_date": "2024-09-25",
    "links": [ { "id": 1, "url": "https://www.youtube.com/watch?v=dQw4w9WgXc" } ],
    "metadata": { "key": "value" },
    "created_at": "2024-09-25T12:34:56Z"
  }
}

Data models

PreclearedProgram (InstantClear template)

FieldTypeDescription
idintegerProgram id.
name / descriptionstringProgram name and description.
mediastringPermitted media, e.g. "TV and Streaming".
territorystringLicensed territory, e.g. "United States".
termstringLicense term, e.g. "1 Year".
durationstringMax use duration, e.g. "Up to 0:60".
subscription_starts_at / subscription_ends_atdatetimeSubscription window.
usage_starts_at / usage_ends_atdatetimePermitted usage window.
payment_deadline_atdatetimeWhen payment is due.
created_atdatetimeCreation timestamp.

Project

FieldTypeDescription
idintegerProject id.
title / slugstringTitle and URL-friendly slug.
descriptionstringProject description.
preclearedProgramobjectThe linked template: { id, name }.
tagsobject[]Tags: { id, name }.
image_urlstringCover image URL.
created_atdatetimeCreation timestamp.

Track & Stem

FieldTypeDescription / allowed values
idintegerTrack id.
isrc / iswcstringRecording / work identifiers.
titlestringTrack title.
yearintegerRelease year.
release_datedateRelease date.
language_codestringISO language code, e.g. en.
version_typestringoriginalcoverremix
mix_typestringmixedinstrumentalacapellacleanradio
structurestringhas-buildconsistent
keystringMusical key, e.g. C major, C minor.
tempointegerBeats per minute.
energy_levelstringhighmediumlowvariable
emotional_tonestringbright-upliftingbright-focusedbright-emotionaldark-emotionaldark-focuseddark-disturbing
recognizabilityintegerScore from 0 to 1000.
artists / albumsobject[]{ id, name } / { id, title }.
genres / subgenres / moods / instruments / creativeKeywords / lyricMoods / lyricThemesobject[]Tag collections, each { id, name }.
lyrics_summarystringShort summary of the lyrics.
image_url / audio_urlstringArtwork and audio URLs.
durationintegerLength in seconds.
stemsobject[]Per-instrument stems (see below).

Stem

FieldTypeDescription
idintegerStem id (used as model_id for download).
titlestringStem name, e.g. "Guitar Stem".
instrumentstringInstrument, e.g. "Guitar".
audio_urlstringStem audio URL.
durationintegerLength in seconds.

License

FieldTypeDescription
idstringChordal sync id, e.g. SYNCHID-1.1.
total_reported_royaltiesintegerReported amount, in cents.
external_idstringYour identifier echoed back.
period_starts / period_endsdateUsage period.
air_datedateAir date.
linksobject[]Reference links: { id, url }.
metadataobjectEchoed metadata.
created_atdatetimeCreation timestamp.

Notes & open questions

While rewriting these docs, a few things in the auto-generated source were unclear, inconsistent or missing. They've been cleaned up here where safe; the items below are worth confirming on the backend.

TopicWhat to confirm / fixed
Error responsesSource documents only 200/204. The error model here (codes + 422 validation) is the conventional shape implied by the stack — confirm exact codes and body.
Malformed pathsSource heading read projects/{project_id/tracks/{track_id}/licenses (missing brace) — corrected to projects/{project_id}/tracks/{track_id}/licenses.
Tracks example was invalid JSONThe source response used pseudo-union values ("original" | "cover" | "remix"), a stray extra } and a trailing comma. Captured here as enums on the Track model.
DELETE paramsSource listed both project_id and a second id ("voluptate") — it is a single integer path param.
POST projects fieldSource marked title as "required optional" with a copy-pasted "to search" description — treated as a required project title.
Download uses GET + bodyThe download endpoint documented a request body (track_quality) duplicated as a query param. Use the query param.
Date examplesSeveral date examples had leading spaces (" 2024-10-01") — trimmed here.
Rate typesFLAT / METERED behavior and which fields each requires should be confirmed against your program configuration.