v2 - Contents

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

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.
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)
  • Auth
    HTTP bearer

Path parameters

content_idstring required

Headers

Authorizationstring
X-JubJub-Service-Keystring
X-JubJub-Agent-Keystring
X-JubJub-Platform-Keystring
Originstring
Refererstring
X-JubJub-Trial-Tokenstring

Request body

source_video_urlstring nullable

A direct .mp4 or HLS .m3u8 URL (a Mux stream URL also counts). Null removes the file.

price_per_minutenumber nullable

USDC per minute of playback. Absent keeps the current price.

Response

Successful Response

object required

Changes

No recorded changes to this operation across all 1 revision of this API.