API and MCP reference

Campaigns

32 operations. Each REST operation is also an MCP tool of the same name. REST https://tlntconnect.com/api/v1

GET/api/v1/campaignsList campaigns/deals in this workspace, newest first. Filter by deal_status, deal_type, or a name search. Money fields are integer cents.

Campaigns visible to the key's member (admins: all; managers: owned, assigned or creator-linked campaigns; others: campaigns they collaborate on). Rows carry id, name, status, deal_status, deal_type, deal_value_cents (admin members on keys with finance:read only), start_date, end_date, created_at, updated_at and brand {id, name}. Paged with page/limit (limit ≤ 100, default 50).

MCP tool
list_campaigns
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1

Input

deal_status query"pitching" | "negotiating" | "contract_sent" | "in_progress" | "paid" | "completed" | "lost"
deal_type query"one_time" | "multi_round"
limit queryinteger — Page size, default 50.
page queryinteger — 1-based page, default 1.
q querystring — Name search.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/campaignsCreate a deal. Requires name and at least one roster creator id; every referenced brand/creator must belong to this workspace.

Create a deal through the same canonical helper as the app (validation, cross-tenant brand/creator checks, campaign_creators/campaign_managers bookkeeping, live-campaign plan limits). deal_value is DOLLARS on input. deal_value and agency_fee_pct need an admin member AND a key with finance:read; otherwise the request is refused with 403 (role_forbidden for a non-admin member, missing_scope for a key without finance:read) naming the field (nothing is written). Returns 201 with the campaign row (financial fields only for admin members on keys with finance:read).

MCP tool
create_campaign
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
agency_fee_pct bodynumber — Agency fee percentage (0-100). Needs an admin member and a key with the finance:read scope (403 role_forbidden / missing_scope otherwise).
brand_id bodystring (uuid) | null — Brand in this workspace to attach the deal to. Admin members only on update.
color bodystring | null — #rrggbb
deal_status body"pitching" | "negotiating" | "contract_sent" | "in_progress" | "paid" | "completed" | "lost"
deal_type body"one_time" | "multi_round"
deal_value bodynumber — Deal value in DOLLARS (stored as cents). Needs an admin member and a key with the finance:read scope (403 role_forbidden / missing_scope otherwise).
end_date bodystring | null
name body, requiredstring
notes bodystring | null
payment_terms bodystring | null
start_date bodystring | null
usage_rights bodystring | null
creator_ids body, requiredarray of string (uuid) — Roster creator ids in this workspace.
duration_months bodyinteger — Multi-round deals only.

Responses

201Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
GET/api/v1/campaigns/{campaign_id}Full detail for one campaign: fields, attached creators (rate_cents with finance access), and deliverables with due dates.

Campaign detail plus creators (id, status, rate_cents, creator {id, display_name, primary_platform}) and deliverables (id, status, draft_due, post_due). Unknown, cross-workspace or not-visible ids return 404. A manager who does not own the campaign sees only the rows of creators assigned to them, as in the app. deal_value_cents and per-creator rate_cents need an active admin member who is not only a collaborator, on a key with finance:read.

MCP tool
get_campaign
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
PATCH/api/v1/campaigns/{campaign_id}Update fields on an existing deal (status, dates, value, notes, brand). Only send the fields to change.

Partial update through the canonical campaign helper: allowlisted fields, enum and date-order validation, field gating (brand_id, manager_id, contract/invoice status need an admin member; deal_value and agency_fee_pct need an admin member AND a key with finance:read — 403 role_forbidden / missing_scope naming the field otherwise) and deal-outcome stamping credited to the key's member. Managers can only update campaigns they can see; others read as 404. brand_id / manager_id must reference this workspace (404 brand_not_found / manager_not_found).

MCP tool
update_campaign
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
agency_fee_pct bodynumber — Agency fee percentage (0-100). Needs an admin member and a key with the finance:read scope (403 role_forbidden / missing_scope otherwise).
brand_id bodystring (uuid) | null — Brand in this workspace to attach the deal to. Admin members only on update.
color bodystring | null — #rrggbb
deal_status body"pitching" | "negotiating" | "contract_sent" | "in_progress" | "paid" | "completed" | "lost"
deal_type body"one_time" | "multi_round"
deal_value bodynumber — Deal value in DOLLARS (stored as cents). Needs an admin member and a key with the finance:read scope (403 role_forbidden / missing_scope otherwise).
end_date bodystring | null
name bodystring
notes bodystring | null
payment_terms bodystring | null
start_date bodystring | null
usage_rights bodystring | null
contract_status body"none" | "sent" | "signed" | "expired"
invoice_status body"none" | "sent" | "paid" | "overdue"
manager_id bodystring (uuid) | null — Team member in this workspace. Admin members only.
outcome_reason bodystring | null — Only on closed deals (paid, completed, lost).
status body"draft" | "active" | "paused" | "completed" | "cancelled"

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member) / brand_not_found / manager_not_found
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
DELETE/api/v1/campaigns/{campaign_id}Delete a campaign/deal. Runs directly within the daily delete cap unless this credential asks for approval in TLNT for deletes (202 pending_approval: poll get_action for the outcome).

Deletes one campaign/deal exactly as the app's Delete deal does: in one transaction its invoices, payouts, files, casting calls and email threads are UNLINKED (they survive), its creators, deliverables and managers go with it, and its open Home cards are resolved. A Brand deal with money, a signature or history keeps the whole campaign (409 conflict). A `delete`-class action: by default it deletes at once and answers 200 { status: "deleted" }, within the credential's daily delete cap (429 daily_delete_cap_reached past it). When the credential asks for approval in TLNT for deletes, the call answers 202 { status: "pending_approval", action_id, approval_url } instead and a workspace admin approves or rejects it in TLNT; poll GET /actions/{action_id}. The approver signs off on the campaign as it was when you asked: one edited before approval is not deleted (the action reports failed). Optional expected_updated_at: a campaign changed since you read it is 409 stale_target. Requires the campaigns:read and delete scopes, an Idempotency-Key, and an admin member (as in the app).

MCP tool
delete_campaign
Scopes
campaigns:read + delete
Members
admin
Approval
Runs directly; queued when the credential asks for approval for delete
Idempotency-Key
required
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
expected_updated_at querystring — The campaign's updated_at as you last read it. Optional: when given, a campaign changed since then is refused (409 stale_target). In a query string, URL-encode it (+ as %2B).
Idempotency-Key header, requiredstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.

Responses

200Success
202pending_approval — queued for approval in TLNT (only when the credential asks for approval for this action class; it runs directly by default)
400invalid_input / invalid_json / invalid_id / idempotency_key_required
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409stale_target / conflict / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After) / daily_delete_cap_reached
500internal_error / idempotent_replay_of_failure
503service_unavailable
POST/api/v1/campaigns/{campaign_id}/creatorsAttach roster creators (by id) to an existing campaign.

Attach roster creators to a deal through the canonical platform-mutation RPC, which re-verifies the acting member, checks every creator belongs to this workspace and applies manager scope. Body: creator_ids (1-100), optional status, rate (DOLLARS — needs an admin member and a key with finance:read, 403 role_forbidden / missing_scope naming it otherwise) and notes.

MCP tool
add_campaign_creators
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
creator_ids body, requiredarray of string (uuid)
notes bodystring | null
rate bodynumber — Per-creator rate in DOLLARS (stored as cents). Needs an admin member and a key with the finance:read scope (403 role_forbidden / missing_scope otherwise).
status body"invited" | "confirmed" | "declined" | "completed"

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member) / campaign_not_found / creator_not_found
409conflict / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
POST/api/v1/campaigns/{campaign_id}/duplicateCopy a campaign as a new draft deal (same brand, dates, terms and creators), optionally renamed.

Copies a campaign the key's member can see through the app's own duplicate helper: a new draft (deal_status pitching) owned by the key's member, with the source's brand, deal type, dates, payment terms, usage rights and creators (as invited). The deal value and agency fee are copied only for an admin member on a key with finance:read; otherwise the copy starts at 0. Optional name (default "<name> (copy)"), notes and color override the source. Returns 201 with the new campaign row. A source the member cannot see is 404.

MCP tool
duplicate_campaign
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
color bodystring | null — #rrggbb; null clears it.
name bodystring
notes bodystring | null

Responses

201Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
POST/api/v1/campaigns/importImport up to 500 existing deals at once (one campaign, creator link and deliverables per row).

Bulk-imports an agency's existing deal book through the app's own importer (POST /api/campaigns/import): each valid row becomes a campaign, a link to an EXISTING roster creator (matched by name, handle, profile URL or email — never created) and its catalog deliverables, written in transactional chunks. Brands are matched by name or created. Per-row problems are reported, not fatal: the answer is { imported, failed, total, errors (first 25), errors_truncated, warnings }. Admin members only (deals carry money); deal_value, rate and agency_fee_pct also need a key with finance:read (403 missing_scope naming deals.<n>.<field> otherwise). Requires an Idempotency-Key: a retried import never creates the deals twice.

MCP tool
import_campaigns
Scopes
campaigns:write
Members
admin
Idempotency-Key
required
Rate weight
5

Input

Idempotency-Key header, requiredstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
deals body, requiredarray of object

Responses

200Success
400invalid_input / invalid_json / invalid_id / idempotency_key_required
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
GET/api/v1/campaigns/{campaign_id}/reportThe campaign performance report a brand sees: views, engagements, engagement rate, posts and creators. No money, clicks or reach.

The same client-safe payload as the shared campaign report page (built by the same code, TLN-919): campaign {id, name, status, start_date, end_date, usage_rights}, brand {name, logo_url, website}, report {status live|final (null before any post is tracked), as_of, settings}, totals {views, engagements, engagement_rate, likes, comments, shares, saves, posts_live, posts_total}, views_over_time [{date, views}], posts (id, creator {id, display_name, handle} or null, platform, format, posted_at, post_url, thumbnail_url, live, from_deliverable, views, likes, comments, shares, saves, engagements, engagement_rate), creators (id, status, creator {id, display_name, handle, primary_platform}, posts, views, engagements, engagement_rate), deliverables (an empty array unless the agency shows the checklist; then type, status, quantity, post_due, posted_at, content_url, creator) and stats {total_deliverables, completed_deliverables, completion_rate, total_creators, finance_visible: false}. It honours the report's 'what the brand sees' settings exactly as the shared page does: a metric the agency hid is null. Each metric is the post's latest reported value inside this campaign's tracking window; engagement rate = (likes + comments + shares) / views as a fraction; an unreported metric is null, as are engagements and rate when the like count is hidden. Money, link clicks, reach and impressions are never included, whatever the key's scopes. A manager who does not own the campaign sees only their assigned creators' rows and posts. A campaign the member cannot see is 404. content_url and post_url are creator-submitted and labelled untrusted.

MCP tool
get_campaign_report
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1
Untrusted fields
content_url post_url

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
PATCH/api/v1/campaigns/{campaign_id}/creators/{creator_id}Change one creator's status, notes or rate on a campaign.

Updates one campaign creator (the deal row) through the app's own per-creator update: status (invited, confirmed, declined, completed), notes, and rate (DOLLARS, stored as integer cents). Admin members only, as in the app; rate also needs a key with finance:read (403 missing_scope naming rate otherwise). A Brand V5 deal whose status follows its deal state, or whose sent offer locks its rate, answers 409 conflict. A campaign or creator outside this workspace, or a creator not on the campaign, is 404. The answer is the updated row (rate_cents only on keys with finance:read).

MCP tool
update_campaign_creator
Scopes
campaigns:write
Members
admin
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
creator_id path, requiredstring (uuid) — Roster creator id in this workspace.
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
notes bodystring | null
rate bodynumber — Rate in DOLLARS (stored as cents). Needs a key with finance:read.
status body"invited" | "confirmed" | "declined" | "completed"

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409conflict / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
DELETE/api/v1/campaigns/{campaign_id}/creators/{creator_id}Take one creator off a campaign (they stay on the roster).

Removes one creator from a campaign through the app's own per-creator delete: the deal row goes, the creator stays on the roster. Admin members only, as in the app. A Brand V5 deal with money, a signature or history — or one a payment, hold or other record still references — is kept (409 conflict). A campaign or creator outside this workspace, or a creator not on the campaign, is 404.

MCP tool
remove_campaign_creator
Scopes
campaigns:write
Members
admin
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
creator_id path, requiredstring (uuid) — Roster creator id in this workspace.
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409conflict / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
GET/api/v1/campaigns/{campaign_id}/creators/{creator_id}/rate-suggestionSuggested pay for one creator on a campaign, from their rate card and assigned deliverables (cents).

The app's rate suggestion: the creator's own rate-card price for each deliverable they are assigned on this campaign, times its quantity, summed (suggested_cents), plus the lines and how many deliverables have no rate-card price (missing_count). Read-only. Money: admin members only, on a key with finance:read. A campaign or creator outside this workspace, or a creator not on the campaign, is 404.

MCP tool
get_creator_rate_suggestion
Scopes
campaigns:read + finance:read
Members
admin
Idempotency-Key
Ignored (read)
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
creator_id path, requiredstring (uuid) — Roster creator id in this workspace.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
GET/api/v1/campaigns/{campaign_id}/collaboratorsTeammates invited onto a campaign as read-only collaborators, and who else could be invited.

The campaign team panel: current collaborators (read-only teammates invited onto this campaign, with who invited them and when), and — for a member who can manage the campaign — the active teammates eligible to invite (not admins, who see everything already, and not the campaign's managers). Anyone who can see the campaign may read it; a campaign the member cannot see is 404.

MCP tool
list_campaign_collaborators
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/campaigns/{campaign_id}/collaboratorsInvite teammates (by team member id) onto a campaign as read-only collaborators.

Invites 1-100 teammates as read-only collaborators, through the app's own panel logic. Each must be an active member of this workspace who is not the key's member, not an admin and not one of the campaign's managers (400 invalid_input otherwise; nothing is written). Re-inviting a current collaborator changes nothing. Admins and the managers who can see the campaign may invite; a read-only collaborator gets 403 role_forbidden; a campaign the member cannot see is 404. Answers 201 with the updated team.

MCP tool
add_campaign_collaborators
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
member_ids body, requiredarray of string (uuid) — Team member ids in this workspace.

Responses

201Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
DELETE/api/v1/campaigns/{campaign_id}/collaborators/{member_id}Take one teammate off a campaign's read-only collaborators.

Removes one read-only collaborator from the campaign (removing a teammate who is not a collaborator changes nothing; a member id outside this workspace is 404). Admins and the managers who can see the campaign may remove; a campaign the member cannot see is 404. Answers with the updated team.

MCP tool
remove_campaign_collaborator
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
member_id path, requiredstring (uuid) — Team member id of the collaborator.
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
GET/api/v1/deal-categoriesThis workspace's deal categories (used to tag brand deals and exclusivities).

The workspace's deal-category catalog, by sort order then label (seeded with the defaults the first time it is read, as in the app). active_only=true hides removed categories.

MCP tool
list_deal_categories
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1

Input

active_only queryboolean — true: active categories only.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/deal-categoriesAdd a deal category to this workspace's catalog.

Adds a category at the end of the catalog (admins and managers, as in the app). The label is trimmed and collapsed (up to 80 characters); one that already exists is 409 conflict. Answers 201 with the category.

MCP tool
create_deal_category
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
label body, requiredstring

Responses

201Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409conflict / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
GET/api/v1/campaigns/{campaign_id}/tracked-postsPosts this campaign tracks, with their metric captures over time.

The posts tracked for a campaign the key's member can see (404 otherwise), newest first: cadence (standard = daily, hourly), the tracking window, last capture, stopped/gone state, the post (platform, post_url, caption, thumbnail_url, posted_at) and its metric captures (likes, comments, views, shares, saves over time). caption and post_url are authored outside the agency and labelled untrusted. calls_spent is the provider spend so far (calls, not money).

MCP tool
list_campaign_tracked_posts
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1
Untrusted fields
caption post_url

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/campaigns/{campaign_id}/tracked-postsStart tracking an Instagram, TikTok or YouTube post's metrics on a campaign (one provider lookup).

Starts tracking one post URL (Instagram, TikTok or YouTube) on a campaign for the app's standard window, through the app's own path: one provider lookup reads the post, its cover is stored durably, and the post is captured daily (cadence standard) or hourly (cadence hourly — a paid plan feature, 403 feature_not_available without it). Each campaign tracks at most the app's maximum of posts at a time (409 conflict past it; stop one first). An unreadable or unsupported URL is 400 invalid_input; a provider outage is 503 service_unavailable (retry later). Adding a post the campaign already tracks restarts it. Weighs 5 rate slots. Admins and the managers who can see the campaign; 404 for a campaign the member cannot see. Answers 201.

MCP tool
track_campaign_post
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
5

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
cadence body"standard" | "hourly" — standard (daily, default) or hourly (paid plan feature).
url body, requiredstring — The post's public URL.

Responses

201Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden / feature_not_available
404not_found (unknown, cross-workspace or not visible to the key's member)
409conflict / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
PATCH/api/v1/campaigns/{campaign_id}/tracked-posts/{tracked_post_id}Pause (stop) or restart (resume) capture for one tracked post, keeping its history.

action "stop" pauses capture (the row and its history stay); "resume" restarts it, extending the tracking window from now if it already ended. A post the platform has removed cannot resume (409 conflict) — remove it and re-add it if the creator restores it. Admins and the managers who can see the campaign; a campaign or tracked post outside the member's view is 404.

MCP tool
update_campaign_tracked_post
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
tracked_post_id path, requiredstring (uuid) — Tracked post id (from list_campaign_tracked_posts).
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
action body, required"stop" | "resume"

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409conflict / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
DELETE/api/v1/campaigns/{campaign_id}/tracked-posts/{tracked_post_id}Take a post off a campaign's tracking list (its captured history is kept).

Removes one post from the campaign's tracking list. Its captured metrics are not lost: they belong to the post, and tracking it again picks the history back up (which is why a mistyped URL is simply removed). Admins and the managers who can see the campaign; a campaign or tracked post outside the member's view is 404.

MCP tool
remove_campaign_tracked_post
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
tracked_post_id path, requiredstring (uuid) — Tracked post id (from list_campaign_tracked_posts).
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
GET/api/v1/campaigns/{campaign_id}/tracking-keywordsWords and @mentions a campaign tracks across its creators' posts, with match counts.

The words and @mentions tracked for a campaign the key's member can see (404 otherwise), oldest first, each with how many stored posts matched it so far.

MCP tool
list_campaign_tracking_keywords
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/campaigns/{campaign_id}/tracking-keywordsTrack a word or @mention across a live campaign's creator posts.

Tracks one whole word or @mention (not substrings or punctuation — 400 invalid_input otherwise) on a LIVE campaign (deal_status in_progress; 409 conflict otherwise), then matches it against the posts already stored. Re-adding a tracked keyword returns it unchanged. Admins and the managers who can see the campaign; 404 for a campaign the member cannot see. Answers 201.

MCP tool
add_campaign_tracking_keyword
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
keyword body, requiredstring — A word or an @mention.

Responses

201Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409conflict / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
DELETE/api/v1/campaigns/{campaign_id}/tracking-keywords/{keyword_id}Stop tracking one keyword on a campaign.

Stops tracking one keyword (its stored matches go with it). Admins and the managers who can see the campaign; a campaign or keyword outside the member's view is 404.

MCP tool
remove_campaign_tracking_keyword
Scopes
campaigns:write
Members
admin, manager
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
keyword_id path, requiredstring (uuid) — Keyword id (from list_campaign_tracking_keywords).
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After)
500internal_error / idempotent_replay_of_failure
503service_unavailable
GET/api/v1/campaigns/{campaign_id}/creators/{creator_id}/scriptA campaign creator's latest script and any generation in progress.

Returns the latest saved script version for one campaign creator (null before the first), whether a generation is queued or running, and whether the last one failed. Poll it after generate_creator_script. The script is generated from the creator's own posts and facts: labelled untrusted. Requires campaigns:read; the campaign must be visible to the key's member. Another workspace's (or a hidden) campaign or creator is 404.

MCP tool
get_creator_script
Scopes
campaigns:read
Members
admin, manager, scout, viewer
Idempotency-Key
Ignored (read)
Rate weight
1
Untrusted fields
script

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
creator_id path, requiredstring (uuid) — Roster creator id on that campaign.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/campaigns/{campaign_id}/creators/{creator_id}/scriptWrite a campaign creator's next script version with a quote from preflight_creator_script (1 credit; first signed script free).

Queues the next script version for one campaign creator, presenting the version and quote_token from preflight_creator_script. Pricing is the app's: a signed creator's first script is included (0 credits); every other version is 1 credit (script_regenerate), reserved now and settled when the script is saved (released if generation fails). The charge is keyed by the version, so a retry is never charged twice. Returns status queued (with job_id; poll get_creator_script), pending (a generation is already running), or completed (that version already exists: nothing charged). On a key left on "Ask for approval in TLNT" (the default) a charged regeneration is queued for an admin (202 pending_approval); an included first script runs directly. 409 quote_stale when the version moved on. Requires campaigns:write and discovery:spend, an Idempotency-Key, and a member who may manage the creator on that campaign.

MCP tool
generate_creator_script
Scopes
campaigns:write + discovery:spend
Members
admin, manager
Approval
Runs directly; queued when the credential asks for approval for discovery_spend
Idempotency-Key
required
Rate weight
1

Input

campaign_id path, requiredstring (uuid)
creator_id path, requiredstring (uuid)
Idempotency-Key header, requiredstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
version body, requiredinteger
quote_token body, requiredstring — The quote_token from preflight_creator_script.

Responses

200Success
202pending_approval — queued for approval in TLNT (only when the credential asks for approval for this action class; it runs directly by default)
400invalid_input / invalid_json / invalid_id / idempotency_key_required
401missing_token / invalid_token / revoked_token / expired_token
402insufficient_credits
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409quote_expired / quote_invalid / quote_stale / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After) / daily_credit_cap_reached
500internal_error / idempotent_replay_of_failure
503service_unavailable
POST/api/v1/campaigns/{campaign_id}/creators/{creator_id}/script/preflightThe next script version for a campaign creator and its price (0 for a signed creator's first), with a quote_token.

Free. Answers which script version generate_creator_script would write next and what it costs: 0 credits for a signed creator's first script (it is included), 1 credit (script_regenerate) for any other version. Returns a quote_token (5 minutes, this key only) bound to that campaign creator and version: pass version and quote_token to generate_creator_script. Requires campaigns:write and discovery:spend and a member who may manage the creator on that campaign (403 otherwise). Another workspace's (or a hidden) campaign or creator is 404.

MCP tool
preflight_creator_script
Scopes
campaigns:write + discovery:spend
Members
admin, manager
Idempotency-Key
Ignored (read)
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
creator_id path, requiredstring (uuid) — Roster creator id on that campaign.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
429rate_limited (honour Retry-After)
500internal_error
POST/api/v1/campaigns/{campaign_id}/report/sharePublish a campaign's client report link (never money). Runs directly (one of the credential's public links per day) unless it asks for approval in TLNT for public links. Admin members only.

Publishes the campaign's client report (/report/campaign/<token>) exactly as the app does — including the brand's collaboration room for the campaign — and the same public endpoint serves it: campaign name, status, dates and usage rights, brand, creators and deliverables, completion stats; never deal value, rates or payouts. A `public_share`-class action under share:public: by default it runs at once and answers 200 { status: "shared", data: { share_url } }, for API keys and connected apps alike, counting one of the credential's public links per day (default 25, up to 200; 429 daily_public_link_cap_reached past it). When the credential asks for approval in TLNT for public links, the call answers 202 { status: "pending_approval", action_id, approval_url } instead and a person approves or rejects it in TLNT — the card names exactly what becomes public and to whom; once approved, GET /actions/{action_id} carries result.share_url. Requires an Idempotency-Key. Admin members only, as in the app. Another workspace's campaign is 404.

MCP tool
share_campaign_report
Scopes
campaigns:read + share:public
Members
admin
Approval
Runs directly; queued when the credential asks for approval for public_share
Idempotency-Key
required
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
Idempotency-Key header, requiredstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.
expected_updated_at bodystring — Optional: the updated_at you last read. A record changed since is refused (409 stale_target).

Responses

200Success
202pending_approval — queued for approval in TLNT (only when the credential asks for approval for this action class; it runs directly by default)
400invalid_input / invalid_json / invalid_id / idempotency_key_required
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409stale_target / idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After) / daily_public_link_cap_reached
500internal_error / idempotent_replay_of_failure
503service_unavailable
DELETE/api/v1/campaigns/{campaign_id}/report/shareTurn off a campaign's public client report; the link stops working from the next request. Admin members only.

Revokes the report link through the same path as the app (report_share_enabled off): the public report endpoint 404s from the next request. Runs directly (it only narrows exposure) under share:public and counts against the key's daily delete cap (429 daily_delete_cap_reached past it); idempotent; admin members only.

MCP tool
unshare_campaign_report
Scopes
campaigns:read + share:public
Members
admin
Idempotency-Key
optional
Rate weight
1

Input

campaign_id path, requiredstring (uuid) — Campaign id in this workspace.
Idempotency-Key headerstring — Retry-safe key (1-255 printable ASCII; a UUID is recommended; an RFC 8941 quoted string is accepted). The same key with the same request within 24h replays the stored response byte for byte (Idempotent-Replayed: true) without running again; the replay still consumes the operation's rate weight.

Responses

200Success
400invalid_input / invalid_json / invalid_id
401missing_token / invalid_token / revoked_token / expired_token
403missing_scope / actor_unavailable / plan_upgrade_required / role_forbidden
404not_found (unknown, cross-workspace or not visible to the key's member)
409idempotency_key_reused / idempotency_in_progress / idempotency_context_changed / idempotency_response_too_large
429rate_limited (honour Retry-After) / daily_delete_cap_reached
500internal_error / idempotent_replay_of_failure
503service_unavailable