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

MethodPathPurpose
POST/licenses/quotePrice estimate and rights check; non-binding.
POST/licenses/requestsCreate a license request (agreement).
GET/licensesList your agreements, filterable by status.
GET/licenses/{license_id}Agreement detail.

Business models

business_modelDescription
MG_RSMinimum guarantee plus revenue share; MG is recouped from RS
PURE_RSPure revenue share with no minimum guarantee
FLAT_LICENSEFlat license fee per term
API_FEE_RSAPI or platform fee plus revenue share
DATA_LICENSEData or metrics licensing
UNDECIDEDNot 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 active agreement with production_api_enabled: true authorizes 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.