CUA Copyright Evidence Infrastructure

Developers

API Documentation

Integrate CUA's copyright evidence infrastructure into your platform. One REST API to register original work, verify a registration and issue a certificate — for every upload, automatically.

Base URL https://cua.herownsky.com/api/v1 Get an API key

Overview

The CUA API lets you programmatically register copyrights, verify registrations and manage certificates. All requests and responses use JSON. Writes are authenticated with an API key; verification endpoints are public.

Base URL: https://cua.herownsky.com/api/v1

Authentication

Requests that create or change something — registering a work, anchoring it, generating a notice, running a scan — require an API key. Verification is deliberately public: anyone must be able to check a registration independently, without credentials.

Pass your key in the Authorization header:

HTTP
Authorization: Bearer YOUR_API_KEY

To obtain an API key, contact request API access.

Endpoints

Four endpoints cover the full lifecycle: register a work, poll its status, verify it, and download its certificate.

POST /api/v1/register API key

Register a new copyright for an audio file.

Request body multipart/form-data

Form fields
audio:         [audio file]     required
title:         "Song Title"     required
artist_name:   "Artist Name"    required
artist_id:     "uuid"           required
album:         "Album Name"     optional
release_year:  2025             optional

Or send a URL application/json

If the audio already sits in your own storage, send its URL instead of the bytes. CUA fetches it directly, so you don’t have to download and re-upload the file to register it.

JSON
{
  "file_url": "https://yourapp.com/uploads/song.mp3",
  "title": "Song Title",
  "artist_name": "Artist Name",
  "artist_id": "uuid",
  "use_blockchain": true
}

The URL must be publicly reachable over http or https and serve an audio content type. Addresses that resolve to private or internal networks are refused, as are redirects to them.

Response

JSON
{
  "success": true,
  "registration_id": "db8fa3d7-0908-46a3-a1a7-d55bd8ce1b24",
  "status": "processing",
  "message": "Registration started"
}
GET /api/v1/register/status/:id Public

Check the status of a registration. Returns processing while the fingerprint is being generated, then completed or failed. Completion fields appear only once the status is completed.

Response

JSON
{
  "registration_id": "db8fa3d7-0908-46a3-a1a7-d55bd8ce1b24",
  "status": "completed",
  "title": "Stand By Me",
  "artist_name": "Logan and Steph",
  "created_at": "2025-12-25T23:21:43.443Z",
  "completed_at": "2025-12-25T23:21:44.749Z",
  "registered_via": "Your Platform",
  "certificate_url": "https://cua.herownsky.com/certificates/db8fa3d7-....pdf",
  "verification_url": "https://cua.herownsky.com/api/v1/verify/db8fa3d7-...",
  "verify_url": "https://cua.herownsky.com/verify/db8fa3d7-...",
  "fingerprint": "SHA256:a00aae06882667de...",
  "blockchain_verified": true,
  "blockchain_tx_id": "0x1e3f..."
}

Notes

  • verification_url returns JSON; verify_url is the page a person can open and read.
  • registered_via names the platform the work was submitted through, taken from the key that submitted it. It is what the certificate reads: “Your Platform in partnership with CUA, a product of Her Own Sky LLC”. It is null for a key issued to no platform.
  • The blockchain fields appear only when the registration was anchored.
  • duplicate_of appears when another registration holds byte-for-byte identical audio. It is a file match, not an acoustic one, and not a finding of infringement — registering your own master twice produces the same signal.
  • When the status is failed, error carries the reason.
GET /api/v1/verify/:id Public

Verify a copyright registration. Returns JSON.

Response

JSON
{
  "verified": true,
  "registration": {
    "id": "db8fa3d7-0908-46a3-a1a7-d55bd8ce1b24",
    "title": "Stand By Me",
    "artist_name": "Logan and Steph Vang",
    "registered_at": "2025-12-25T00:00:00Z",
    "registered_via": "Your Platform",
    "fingerprint": "SHA256:abc123..."
  }
}
GET /api/v1/certificate/:id Public

Download the PDF certificate for a registration.

Response

Returns the PDF file with the appropriate Content-Type headers.

GET /api/v1/auth/whoami API key

Confirms your key works and tells you which key it is. Useful when a credential was configured a while ago and you need to know what is actually in use. Unlike the other read endpoints, this one requires a key — the credential is the subject of the request.

Response

JSON
{
  "success": true,
  "authenticated": true,
  "key_type": "issued",
  "name": "Your Platform",
  "client_id": "eac6d8ee-84e2-4837-bef5-63fd7dfc22dd",
  "partner": {
    "slug": "your-platform",
    "name": "Your Platform"
  }
}

Notes

  • key_type is issued for a key issued to you, which can be attributed and revoked on its own.
  • partner is the platform your registrations are attributed to and the name printed on their certificates. A null partner means the key authenticates but attributes nothing — worth checking before registering a catalogue.
  • An invalid or revoked key returns 401, so this is the quickest way to tell a stale credential from a misconfigured request.

Rate Limits

API requests are rate limited based on your plan.

Plan Price Registrations
Free Tier — 100 / month
Starter $99/mo 500 / month
Pro $299/mo 2,000 / month
Enterprise Custom Custom limits

Error Handling

All errors return JSON with an error code and message:

JSON
{
  "error": "Invalid API key",
  "code": "AUTH_ERROR",
  "status": 401
}

Important: CUA provides supplemental copyright evidence, not official US Copyright Office registration. For full legal protection, register at copyright.gov.

Build what creators believe in

Ready to integrate?

Creators build tomorrow.
We help protect it.