Offers
Campaign offers (a campaign matched to a podcast)
List offers for a campaign
Returns a cursor-paginated page of the campaign's offers (each an offer of this campaign to a podcast), ordered by id; use the returned cursor for the next page. Each offer carries a read-only status of pending, accepted, rejected, or negotiating. Requires the read_only network role.
Send an offer: match a podcast to the campaign and notify the podcast owner
Creates a pending offer linking the podcast to the campaign and emails the podcast owner a tokenized review link. The campaign must have all fields required to send an offer filled in and, if variant_id is given, that variant must exist; the podcast must belong to this network; and no offer may already exist for the podcast (and variant) (any of these returns 400). The email is best-effort and never fails the request (the response's email_sent reports whether it went out). Requires the administrator network role.
Directly approve a podcast for the campaign (admin bypass)
Creates (or reuses an open) offer for the podcast and approves it immediately, skipping the recipient invitation/verification flow, then renders the host-voiced creative exactly as accept does (resolving voice_id — or the podcast's primary voice — and the campaign copy, linking creative_id). Returns 400 for a missing podcast_id, an unknown variant, or a podcast outside this network; 409 if an offer already exists and is no longer open, or the podcast/campaign isn't renderable. Audio synthesis runs asynchronously (poll the creative or use the creative webhook). Requires the administrator network role.
Get a single offer
Returns one offer for the campaign, or 404 if it does not exist. The offer's status (pending, accepted, rejected, or negotiating) is read-only; transitions happen only via the accept/reject actions. Once accepted, creative_id links to the generated host-voiced creative. Requires the read_only network role.
Accept an offer and start generating its host-voiced creative
Transitions an open offer (pending or negotiating) to accepted; an offer that is already accepted or rejected returns 409. As a consequence of acceptance the server renders the host-voiced creative for you (resolving the podcast's configured voice and the campaign copy) and links it back via creative_id; if the podcast has no usable voice or the campaign isn't renderable the whole action fails 409 with no state change. The transition is synchronous and returns 200 immediately with a still-pending creative; the audio synthesis then runs asynchronously, so poll the creative for ready/failed or subscribe to the creative.ready / creative.failed webhook. Requires the administrator network role.
Reject an offer
Transitions an open offer (pending or negotiating) to rejected and returns it; an offer that is already accepted or rejected returns 409. Unlike accept, this triggers no creative generation. Requires the administrator network role.
Generate a fresh offer verification code and email it to the podcast owner
Issues a new verification code on the offer's latest invitation (valid for 30 minutes) and emails it to the podcast's primary contact, used when the owner reviews the offer via the magic link. Returns 400 if the podcast has no contact email and 404 if the offer has no invitation. The code is set even if the email send fails; the response reports email_sent and the code's expiry. Requires the administrator network role.