Skip to main content
Version: v2.0

Verification API

TrackForge exposes nine certification endpoints under the /api/v1/certifications prefix. One endpoint is fully public; the remainder require authentication.

All authenticated endpoints use Clerk bearer tokens. The base URL for all endpoints is your TrackForge instance (e.g. https://api.trackforge.studio).

Endpoint summary

MethodPathAuthDescription
POST/verifyNone (public)Verify a golden record against certified data
GET/batch/{batch_id}UserBatch certification status with anchor info
GET/{catalog_id}/certificate/{isrc}UserDownload per-track certificate (JSON)
GET/{catalog_id}/reportUserDownload full catalogue certification report (JSON)
GET/{catalog_id}/chain-of-titleUserDownload chain of title export (JSON)
GET/{catalog_id}/proof-bundleUserDownload complete proof bundle (ZIP)
GET/{catalog_id}/{isrc}UserTrack certification status
GET/{catalog_id}UserCatalogue certification summary
POST/{catalog_id}/certifyAdminTrigger certification workflow

Public verification endpoint

POST /api/v1/certifications/verify

Authentication: None. This endpoint is intentionally public so that any third party can independently verify a golden record without needing a TrackForge account.

Rate limit: 100 requests per minute per IP address. Exceeding this limit returns 429 Too Many Requests.

Request body

{
"canonical_json": "<deterministic JSON string of the golden record>"
}
FieldTypeRequiredDescription
canonical_jsonstringYesThe canonical JSON representation of the golden record. Must be serialised using the exact rules defined in the Canonical JSON Schema.

Response body

{
"verified": true,
"record_hash": "a1b2c3d4e5f6...64 hex characters",
"certification": {
"isrc": "GBAYE0100538",
"certified_at": "2026-01-15T14:30:00Z",
"certification_version": "1.0",
"is_current": true,
"batch_id": "batch_01HZ...",
"merkle_root": "e7f8a9b0c1d2...64 hex characters",
"methodology_hash": "a122860e4aae34fd...64 hex characters"
},
"anchors": [
{
"chain": "bitcoin",
"status": "confirmed",
"tx_id": "3a1b2c3d4e5f...64 hex characters",
"block_number": 879234,
"block_timestamp": "2026-01-15T15:42:00Z"
}
]
}
FieldTypeDescription
verifiedbooleanWhether the submitted canonical JSON matches a certified record.
record_hashstringSHA-256 hex digest of the submitted canonical JSON. Always returned, even if verified is false.
certificationobject | nullCertification metadata. null if no matching certification exists.
certification.isrcstringThe ISRC of the certified track.
certification.certified_atstringISO 8601 timestamp of certification.
certification.certification_versionstringVersion of the certification schema (e.g. "1.0").
certification.is_currentbooleanWhether this is the current (latest) certification for the track.
certification.batch_idstringIdentifier of the certification batch.
certification.merkle_rootstringMerkle root of the batch's Merkle tree.
certification.methodology_hashstringSHA-256 of the rating methodology in effect at certification time.
anchorsarrayBlockchain anchor records. Empty if not yet anchored.
anchors[].chainstringBlockchain name (currently always "bitcoin").
anchors[].statusstringAnchor status: "pending", "submitted", or "confirmed".
anchors[].tx_idstringBlockchain transaction ID containing the timestamp.
anchors[].block_numberintegerBlock number.
anchors[].block_timestampstringBlock timestamp (ISO 8601).

Example: verified record

curl -X POST https://api.trackforge.studio/api/v1/certifications/verify \
-H "Content-Type: application/json" \
-d '{"canonical_json": "{\"artist\":\"Iron Maiden\",\"certification_version\":\"1.0\",\"duration_ms\":437000,\"isrc\":\"GBAYE0100538\",\"iswc\":\"T-010.466.720-3\",\"performers\":[{\"name\":\"Bruce Dickinson\",\"role\":\"vocals\"},{\"name\":\"Dave Murray\",\"role\":\"guitar\"}],\"release_date\":\"2000-05-29\",\"title\":\"The Wicker Man\",\"writers\":[{\"ipi\":\"00026781411\",\"name\":\"Adrian Smith\",\"role\":\"composer\",\"share\":33.33},{\"ipi\":\"00026781422\",\"name\":\"Bruce Dickinson\",\"role\":\"composer\",\"share\":33.33},{\"ipi\":\"00026781433\",\"name\":\"Steve Harris\",\"role\":\"composer\",\"share\":33.34}]}"}'

Example: unverified record

If the canonical JSON does not match any certified record, the response returns verified: false with a null certification:

{
"verified": false,
"record_hash": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"certification": null,
"anchors": []
}

Error responses

StatusCondition
422Missing or malformed canonical_json field.
429Rate limit exceeded (100 requests/minute/IP).
500Internal server error.

Authenticated endpoints

All endpoints below require a valid Clerk bearer token in the Authorization header:

Authorization: Bearer <clerk_session_token>

GET /api/v1/certifications/batch/{batch_id}

Return the certification status for a batch, including blockchain anchor information.

Path parameters

ParameterTypeDescription
batch_idstringThe certification batch identifier.

Response body

{
"batch_id": "batch_01HZ...",
"catalog_id": "cat_01HZ...",
"merkle_root": "e7f8a9b0c1d2...64 hex characters",
"track_count": 142,
"golden_record_count": 138,
"status": "confirmed",
"certified_at": "2026-01-15T14:30:00Z",
"confirmed_at": "2026-01-15T15:42:00Z",
"certification_version": "1.0",
"methodology_hash": "a122860e4aae34fd...64 hex characters",
"standard_version": "v1.0",
"anchors": [
{
"chain": "bitcoin",
"status": "confirmed",
"tx_id": "3a1b2c3d...",
"block_number": 879234,
"block_timestamp": "2026-01-15T15:42:00Z"
}
]
}
FieldTypeDescription
batch_idstringBatch identifier.
catalog_idstringCatalogue the batch belongs to.
merkle_rootstringMerkle root hash (64 hex characters).
track_countintegerTotal tracks in the catalogue.
golden_record_countintegerTracks that qualified as Golden Records.
statusstringBatch status: "certified", "anchoring", "confirmed".
certified_atstring | nullWhen certification was issued.
confirmed_atstring | nullWhen the blockchain anchor was confirmed.
certification_versionstring | nullSchema version.
methodology_hashstring | nullSHA-256 of the rating methodology ruleset in effect.
standard_versionstring | nullRating standard version (e.g. "v1.0").
anchorsarrayBlockchain anchors (same schema as /verify).

GET /api/v1/certifications/{catalog_id}/certificate/{isrc}

Download a per-track certification document as a JSON file.

Path parameters

ParameterTypeDescription
catalog_idstringCatalogue identifier.
isrcstringISRC of the track.

Response

Returns a JSON file download (Content-Disposition: attachment; filename="certificate_{isrc}.json"). The certificate document contains the track's canonical JSON, record hash, Merkle proof, and certification metadata.


GET /api/v1/certifications/{catalog_id}/report

Download the full catalogue certification report as a JSON file.

Path parameters

ParameterTypeDescription
catalog_idstringCatalogue identifier.

Response

Returns a JSON file download (Content-Disposition: attachment; filename="catalog_report_{catalog_id}.json"). The report includes all certified tracks, batch metadata, aggregate statistics, and blockchain anchor details.


GET /api/v1/certifications/{catalog_id}/chain-of-title

Download the chain of title export for a catalogue.

Path parameters

ParameterTypeDescription
catalog_idstringCatalogue identifier.

Response

Returns a JSON file download (Content-Disposition: attachment; filename="chain_of_title_{catalog_id}.json"). Contains the rights chain evidence for all certified tracks in the catalogue.


GET /api/v1/certifications/{catalog_id}/proof-bundle

Download the complete proof bundle as a self-contained ZIP archive. This archive contains everything needed for independent, offline verification.

Path parameters

ParameterTypeDescription
catalog_idstringCatalogue identifier.

Response

Returns a ZIP file download (Content-Disposition: attachment; filename="proof_bundle_{catalog_id}.zip"). See Glossary: Proof Bundle for contents.


GET /api/v1/certifications/{catalog_id}/{isrc}

Return the current certification status for a specific track.

Path parameters

ParameterTypeDescription
catalog_idstringCatalogue identifier.
isrcstringISRC of the track.

Response body

{
"isrc": "GBAYE0100538",
"record_hash": "a1b2c3d4e5f6...64 hex characters",
"canonical_json": "{...}",
"certification_version": "1.0",
"title": "The Wicker Man",
"artist": "Iron Maiden",
"iswc": "T-010.466.720-3",
"writer_count": 3,
"certified_at": "2026-01-15T14:30:00Z",
"merkle_root": "e7f8a9b0c1d2...64 hex characters",
"batch_status": "confirmed",
"anchors": [
{
"chain": "bitcoin",
"status": "confirmed",
"tx_id": "3a1b2c3d...",
"block_number": 879234,
"block_timestamp": "2026-01-15T15:42:00Z"
}
]
}
FieldTypeDescription
isrcstringThe track's ISRC.
record_hashstringSHA-256 hash of the canonical JSON (64 hex characters).
canonical_jsonstring | nullThe canonical JSON used for certification.
certification_versionstring | nullSchema version.
titlestring | nullTrack title.
artiststring | nullPrimary artist name.
iswcstring | nullPrimary ISWC.
writer_countinteger | nullNumber of credited writers.
certified_atstring | nullCertification timestamp (ISO 8601).
merkle_rootstring | nullBatch Merkle root.
batch_statusstring | nullStatus of the parent batch.
anchorsarrayBlockchain anchors.

GET /api/v1/certifications/{catalog_id}

Return a high-level certification summary for a catalogue.

Path parameters

ParameterTypeDescription
catalog_idstringCatalogue identifier.

Response body

{
"catalog_id": "cat_01HZ...",
"latest_batch_id": "batch_01HZ...",
"latest_batch_status": "confirmed",
"merkle_root": "e7f8a9b0c1d2...64 hex characters",
"certified_track_count": 138,
"total_golden_records": 138,
"certified_at": "2026-01-15T14:30:00Z"
}
FieldTypeDescription
catalog_idstringCatalogue identifier.
latest_batch_idstring | nullMost recent batch ID. null if never certified.
latest_batch_statusstring | nullStatus of the latest batch.
merkle_rootstring | nullMerkle root of the latest batch.
certified_track_countintegerNumber of currently certified tracks.
total_golden_recordsintegerTotal Golden Records in the latest batch.
certified_atstring | nullWhen the latest batch was certified.

Admin endpoint

POST /api/v1/certifications/{catalog_id}/certify

Trigger the full certification workflow for a catalogue. This is an administrative operation that fetches Golden Records, canonicalises them, constructs the Merkle tree, stores certifications, and submits the Merkle root for blockchain anchoring.

Authentication: Admin-only (requires admin role via Clerk).

Path parameters

ParameterTypeDescription
catalog_idstringCatalogue identifier.

Response body

{
"batch_id": "batch_01HZ...",
"merkle_root": "e7f8a9b0c1d2...64 hex characters",
"track_count": 142,
"golden_record_count": 138,
"status": "certified",
"certifications": [
{
"isrc": "GBAYE0100538",
"record_hash": "a1b2c3d4..."
}
],
"anchor_status": {
"submitted": true,
"calendar_response": "..."
}
}
FieldTypeDescription
batch_idstringNewly created batch identifier.
merkle_rootstringMerkle root of the certification tree.
track_countintegerTotal tracks in the catalogue.
golden_record_countintegerTracks that qualified as Golden Records.
statusstringInitial batch status (typically "certified").
certificationsarrayList of individual track certifications created.
anchor_statusobjectStatus of the OpenTimestamps submission.

Error responses

StatusCondition
400No Golden Records found, or certification prerequisites not met.
401Not authenticated.
403User does not have admin role.
404Catalogue not found.