---
title: "Name the host a piece plays from so JubJub meters it without serving it"
method: POST
path: "/v2/contents/{content_id}/playback-source"
tags: ["v2 - Contents"]
---

# Name the host a piece plays from so JubJub meters it without serving it

`POST /v2/contents/{content_id}/playback-source`

## Request

- Base URL: `https://api.jubjubapp.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.jubjubapp.com/v2/contents/{content_id}/playback-source`
- Auth: HTTP bearer

Write `source_video_url` (and optionally the price) on a piece the
caller created.

For an import this turns "watched elsewhere" into a sellable piece:
`is_watched_elsewhere` (media_search_service) reads the field and the
streaming rail's refusal keys on it. For an upload it moves delivery off
JubJub: the tier decision (playback_url_signer.is_gated_playback, leg 2)
prefers a fetchable source over the GCS object, so the SDK leaves the
page's own src alone and the bucket serves nothing. In both cases the
public playback route emits it as a Tier 1 source. It is a money gate,
so the URL is validated with the same predicate the tier decision uses;
a watch page, a URL the page cannot play, or JubJub's own bucket is
refused, never stored.

Was import-only until 2026-09-09. The reason given ("a piece published
through JubJub already has its file") was backwards: JubJub having the
file is why JubJub pays to serve it.

Guards:
  - 404 if content not found.
  - 400 if the URL is not a playable file on another host, or the price
    is above the settlement ceiling.
  - 403 if the caller is not the creator.

## Path parameters

- `content_id` string, required

## Headers

- `Authorization` string
- `X-JubJub-Service-Key` string
- `X-JubJub-Agent-Key` string
- `X-JubJub-Platform-Key` string
- `Origin` string
- `Referer` string
- `X-JubJub-Trial-Token` string

## Request body

- PlaybackSourceRequest: Where a piece plays from: a file on the creator's own host. Two cases, one rule. An import has no file at JubJub (it lives on YouTube or TikTok, and nothing there can be metered), so without a source it is watched on its platform. An upload has a file at JubJub, and that is the problem: JubJub pays egress to serve it, more per minute than the whole viewer charge. Either way the creator names where the bytes come from (their own site, Mux, Cloudflare Stream, Bunny, S3) and the piece plays and meters from there. Tier 1: the page's own <video src> plays, the SDK counts minutes. The URL is public, so this is metered, not paywalled.
  - `source_video_url` string, nullable: A direct .mp4 or HLS .m3u8 URL (a Mux stream URL also counts). Null removes the file.
  - `price_per_minute` number, nullable: USDC per minute of playback. Absent keeps the current price.

## Response `200`

Successful Response

- object

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/jubjubapp/apis/jubjub-api.md) - [All operations](https://skmtc.dev/jubjubapp/apis/jubjub-api/llms.txt) - [OpenAPI document](https://skmtc.dev/jubjubapp/apis/jubjub-api/revisions/353157b296f2?raw)
