License API
Price and request rights to distribute a title in specific territories and languages. A quote is a non-binding estimate (license:read); a request starts a real agreement for NU review and execution (license:write).
Endpoints
| Method | Path | Purpose |
|---|---|---|
| POST | /licenses/quote | Price estimate and rights check; non-binding. |
| POST | /licenses/requests | Create a license request (agreement). |
| GET | /licenses | List your agreements, filterable by status. |
| GET | /licenses/{license_id} | Agreement detail. |
Business models
| business_model | Description |
|---|---|
MG_RS | Minimum guarantee plus revenue share; MG is recouped from RS |
PURE_RS | Pure revenue share with no minimum guarantee |
FLAT_LICENSE | Flat license fee per term |
API_FEE_RS | API or platform fee plus revenue share |
DATA_LICENSE | Data or metrics licensing |
UNDECIDED | Not selected yet; default before model agreement |
See Settlement API for how these models affect settlement amounts.
Quote versus request
- Quote — safe to call repeatedly; returns an estimate and
availability. Nothing is committed. - Request — submits an agreement for NU review. It enters the agreement lifecycle and may require a signed contract before becoming
active.
Get a quote
curl -X POST "https://signal-partners.newunivers.ai/v1/licenses/quote" \
-H "Authorization: Bearer nsp_live_xxx" \
-H "X-NU-Partner-Id: org_acme" \
-H "X-NU-Request-Id: req_license_0001" \
-H "Content-Type: application/json" \
-d '{
"title_id": "ttl_abc",
"territories": ["KR", "JP"],
"languages": ["ko", "en"],
"exclusive": false,
"resale_allowed": false,
"expected_monthly_views": 200000,
"business_model": "MG_RS"
}'{
"data": {
"result": "auto_quote",
"availability": {
"available": true,
"rights_status": "clear",
"conflicts": []
},
"estimated_terms": {
"business_model": "mg_rs",
"mg_amount": 25000,
"revenue_share_rate": 0.35,
"flat_license_fee": null,
"api_fee_monthly": null,
"currency": "USD"
},
"next_step": "submit_license_request"
}
}Create a request
curl -X POST "https://signal-partners.newunivers.ai/v1/licenses/requests" \
-H "Authorization: Bearer nsp_live_xxx" \
-H "X-NU-Partner-Id: org_acme" \
-H "Content-Type: application/json" \
-d '{
"title_id": "ttl_abc",
"territories": ["KR"],
"languages": ["ko"],
"exclusive": false,
"business_model": "MG_RS",
"expected_monthly_views": 200000,
"message": "Launch on Acme OTT, KR only."
}'{
"data": {
"license_deal_id": "lic_123",
"status": "requested",
"next_step": "nu_internal_review"
}
}A successful request returns HTTP 200. The endpoint is idempotent through optional X-NU-Request-Id: completed retries return the original response, while a concurrent duplicate still in progress returns 409 conflict.
Agreement status lifecycle
requested → reviewing → quoted → negotiating → approved → contracting → signed → active → expired
↘ rejected ↘ cancelled- Only an
activeagreement withproduction_api_enabled: trueauthorizes Production playback for its title, territories, and episode set.
List and filter
curl "https://signal-partners.newunivers.ai/v1/licenses?status=active" \
-H "Authorization: Bearer nsp_live_xxx" -H "X-NU-Partner-Id: org_acme"Returns agreement data[] without a pagination envelope. Both list and single-agreement responses include updated_at.
Stay synchronized (polling)
No webhooks are provided. To detect status changes such as quoted or active, poll this endpoint with updated_since. Send the greatest updated_at seen so far to receive only later changes in ascending order and advance your watermark.
curl "https://signal-partners.newunivers.ai/v1/licenses?updated_since=2026-06-24T10:00:00Z" \
-H "Authorization: Bearer nsp_live_xxx" -H "X-NU-Partner-Id: org_acme"If later playback returns license_not_active, inspect the agreement’s status and production_api_enabled here.