Skip to main content
All endpoints below require:
  • X-Application-Id
  • X-Api-Key
Contracts are optional. A campaign creator can exist and have media tracked without any contract or payment terms set. Contracts define how a creator gets paid for their work on a campaign. For the human-readable contract timeline addressed by campaignCreatorRecordId, see Read contract history and Create a contract version.

Unified contract history

Contract history is an ordered timeline of complete, frozen payment-term snapshots. An effective date is an inclusive upload/published business date: media uploaded on or after that date uses that version until the next version starts. Every write supplies one complete snapshot and identifies the version it was based on; the API does not merge a partial payload with an older version. The API never creates separate fixed, performance, bonus, or pay-cycle history items. crosspost.captionFilter in a terms snapshot enables caption-based grouping. Matching posts share a local-day group using campaign timezone, then agency timezone, then UTC, overriding upload-window and duration-tolerance checks. The same setting is named crosspostRequirements.captionContains in the human-readable contract API. Use null to disable the override; use an account tracking filter if you only want to select posts to track. Reserved, settled, and ambiguous payout coverage is protected. A history mutation that could reprice, hide, or resurface that coverage returns 409 with errorCode: "CONTRACT_HISTORY_PROTECTED_BOUNDARY" and an earliestAllowedEffectiveDate explanation in the message. Previously paid items remain paid.

GET /sdk/v1/campaigns/:campaignId/creators/contract/history

Returns all active complete versions, their inclusive effective windows, the protected payout boundary, and retained revision provenance. Query parameter:
  • email (required)
protectedCoverage summarizes the reserved, settled, and ambiguous payouts that cover the contract’s upload days, and each item in versions carries the same summary for that version. protectedFromUploadDate and protectedThroughUploadDate are the earliest and latest upload days those payouts cover; both are null when there are none. A version’s summary counts the payouts in its effective window and the payouts attached to that version, and an attached payout can cover a day before the version starts. A version’s protectedFromUploadDate can therefore fall before its effectiveFromUploadDate, so do not read it as the version’s first paid day.

POST /sdk/v1/campaigns/:campaignId/creators/contract/history

Uses one mutation contract for CREATE, MOVE, REPLACE, and VOID. For CREATE, send the complete desiredTerms snapshot and the predecessorContractHistoryId returned by the timeline GET. The server rejects a stale predecessor rather than merging fields from different versions.
For MOVE, send campaignCreatorContractHistoryId, the new effective date, and one complete desiredTerms snapshot whose effective date matches the new date. The existing immutable row is superseded in the same transaction that inserts the moved version. The server rejects moves that cross another active version or overlap reserved or settled payout coverage. For REPLACE, send campaignCreatorContractHistoryId, the unchanged effective date, and one complete desiredTerms snapshot. For VOID, send the history ID, effective date, and reason, but omit desiredTerms. The response’s data includes the updated timeline, which carries the same protectedCoverage summaries as the GET. Every active bonus component in desiredTerms must use metric: "VIEWS". Other metrics are rejected because the payout calculator does not support them. For active bonuses, desiredTerms.bonus.payoutTiming accepts AT_COMPLETION, NOW, or NOW_STOP_AFTER_PAYOUT. In the public campaign-creator contract shape, these correspond to bonusPayment.pays values CAMPAIGN_COMPLETION, NOW, and NOW_AND_STOP, respectively. See bonus payout timing for scope, cancellation, and reversal behavior.

Deprecated campaign contract resource

The following legacy resource is fully deprecated:
  • GET /sdk/v1/campaigns/:campaignId/creators/contract
  • PUT /sdk/v1/campaigns/:campaignId/creators/contract
  • DELETE /sdk/v1/campaigns/:campaignId/creators/contract
Every method returns 410 Gone:
Use Read contract history and Create a contract version immediately. Those endpoints use the unified contract timeline and require a complete, explicit human-readable contract plus stale-write protection.