1.25.0,
Inventory (GET /inventory, inventory) and resolve_audience (GET /audience, resolve_audience) carry bookable_nodes on each channel, the creators bookable now by the one bookable rule, the same count as creators_search priced and catalog.priced, never above verified_nodes or the network's; priced_units now counts only those creators' posts on sale at a current price (before, it counted every purchasable post, stale prices included), and the note names bookable creators before posts (DT-021, DT-292).
1.24.0,
Creator views are one pool of 300 a day per workspace, shared by the app and every API key of the brand: a creator view is one different creator shown in a list or opened since midnight UTC, and a creator already seen today, in the app or through any key, is free. Before, the app and the API each counted their own 300, and each key had its own allowance under the brand's ceiling. Past 300 a list, and an open of a creator not yet seen today, answer 429 rate_limited with details.reason daily_seen, details.scope workspace and details.limit 300; Retry-After says when midnight UTC comes. The count is exact: a page served near the end of the pool lists only the creators that fit in it, so total can be larger than the creators returned. The short-window limits are unchanged (20 creator reads a minute and the pause after 40 creators opened in ten minutes), and so are the 60 searches and 60 creators opened a day per key and per brand.
1.23.1,
The guest MCP door names only the channel on sale now: inventory and resolve_audience list x_creators only, and no channel is announced as next (the 1.21.0 note that the guest's channels are X creators and Reddit no longer holds).
1.23.0,
An approved creator with nothing on sale is reachable from the API: creator_ask_price (POST /creators/{id}/price-request, scope creators:read, optional body campaign_id) asks our team for its price, the same ask as the app's Ask for a price button, and never contacts the creator. It answers 200 with requested, already (true when an ask was already open, so nothing new was sent), status (requested or priced) and requested_at; 409 conflict reason already_priced for a creator with a format on sale; 404 for any id that is not an approved creator; 429 rate_limited reason daily_limit past 3 asks for one creator or 20 in all in any 24 hours, with retry_after (also the Retry-After header) the seconds until that limit reopens and resets_at the moment it does; 502 when the ask did not reach our team (it is not kept; try again). Opening the creator counts as one creator opened today on the creator meter, free when already opened. Each creator (GET /creators rows and GET /creators/{id}, creators_search and creator_get) carries ask_price: true when nothing is on sale and the action is creator_ask_price, false when a format is on sale. price_estimate.label reads "Est. $200 to $1,000", the range joined by to, never a dash.
1.22.0,
A creator's status value for a creator not yet reviewed is now not_reviewed (Creator.status, DT-272); a campaign a key starts that has no plan yet reads stage_id draft (GET /campaigns, campaign_status) and DELETE /campaigns/{id} deletes it, as for a draft the workspace starts (DT-270); POST /campaigns/{id}/creator-guidelines refuses a body field it does not take with 400 bad_request naming it, and set_creator_guidelines refuses an argument it does not take (DT-269); the RateLimit headers describe the fixed 60-second window (DT-271).
1.21.0,
The guest MCP door (/api/mcp/guest) answers five of its 6 tools with no key. inventory gives the whole network per channel (no audience applied: approved creators, posts on sale at a current price, strong or thin, and catalog), resolve_audience the fit for a profile you describe (product, audience, geography; intent_id needs an account and answers needs_account), brain_get the empty context a guest has (version 0) with claim, and guest_status lists them in answers_now with the guest limits. plan_quote_guest answers 3 quotes per client address in any 7 days, says quotes_left, and refuses the next with rate_limited (reason guest_quote_limit, limit, window_days, retry_after, resets_at, claim); a call that prices nothing (a bad argument, a format with nothing on sale, a failed read) spends none. feedback_send still needs an account: its guest description says so and a guest call answers 401 with claim. The guest's channels are X creators and Reddit only.
1.20.0,
A creator's X handle and profile link show only once the brand's order for the plan is paid. Before that, plan_quote (GET /plans/{id}/quote) lines carry creator.name, creator.id and creator_id with creator.handle and creator.profile_url null, and campaign_status (GET /campaigns/{id}) plan lines name no @handle in slot. creator_get (GET /creators/{id}) carries handle and url null, and its recent_posts and past_collabs carry no x.com link (url null); a paid creator's handle is on the paid plan's quote.
1.19.0,
Plan_move_dates (POST /plans/{id}/dates, body start and end as YYYY-MM-DD) moves a plan awaiting approval to new dates in one step: the plan's launch window, the campaign's dates and every creator's post date move together, each post keeping its place in the window and pulled inside a shorter one; prices do not change. Refusals are 409 conflict with reason bad_dates (a start before today, an end before the start, or more than a year apart), same_day (two posts by one creator would fall on one day; nothing moves) or plan_signed (a signed plan or one the team wrote).
1.18.0,
A creators list that names nothing (GET /creators, creators_search) from a brand with an audience on file now returns that audience's creators (200) instead of 400 filter_required; only a brand with no audience on file is refused with filter_required. Creator lists and searches are limited to an audience whenever one applies: the segments passed in match, else the brand's own audience segments, and a segment named without match replaces the audience as the filter; q, reach_band and the filters narrow it, so total counts only creators that reach that audience. A brand with no audience on file that names only q, reach_band or a filter gets every approved creator those match, with no audience limit. inventory (GET /inventory) counts in x_creators verified_nodes only creators the creator lists can show, the same number as a bare list's total.
1.17.0,
The guest MCP door (/api/mcp/guest; POST /api/mcp with no key answers 401 with the OAuth sign-in challenge, so a client that supports OAuth signs in there) lists exactly 6 tools, each with a title and its annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint): inventory, resolve_audience, brain_get and feedback_send, which need an account, and two that answer with no key, guest_status (what answers now, what needs an account, and claim) and plan_quote_guest (format post, quote or thread and posts 1 to 50: the all-in price range per post across every creator on sale now, times the posts, never a creator). A guest call to a tool that needs an account answers 401 with the claim link in the message and in error.data.claim (url, developers_url, sign_in, key): sign in at /connect, then create a key in Developers. The workspace's GET /api/keys/usage takes days=7, 30 or 90 (and key_id) and answers requests per UTC day for the whole range (range_days, timezone, days with day, ok and errors, total, errors), a day with no request as zeros and the totals the sum of the days; without days it pages the request log as before.
1.16.0,
Plan_quote (GET /plans/{id}/quote) carries over_budget: budget_cents, total_cents and over_by_cents when the plan is over its campaign's budget, at current prices when a creator's price rose past it (the plan keeps its earlier prices, so total_cents alone read as within the budget, and the quote said nothing); its policy then refuses with reason over_budget. The figures are the whole plan's overage, never the first creator's alone. Null within the budget.
1.15.0,
Creator reads through API keys are metered apart from the app's: each key has its own allowance (20 creator reads a minute, 60 searches a day, 60 creators opened a day and 300 different creators shown a day) and all of a brand's keys together, revoked ones included, share one brand ceiling of the same totals; before, the app, its chat and every key shared one per workspace, so an agent's reads could close the app with 429. A creator 429 carries details.scope, key (this key's allowance) or api (the brand's ceiling over its keys). The 3 new campaigns in 24 hours count every campaign started in the window, so archiving or deleting one no longer gives its slot back (429 rate_limited, details.reason daily_campaign_limit, with resets_at as before).
1.14.0,
No creator is added to a plan past its campaign's budget, by any key or person: plan_add_creator (POST /plans/{id}/lines, a named plan or current) and plan_swap_creator (POST /plans/{id}/lines/{line_id}/swap) refuse a creator that would take the plan's all-in total over the budget with 409 conflict, reason over_budget, budget_cents, remaining_cents, price_cents and over_by_cents, and the plan is left as it was. A swap for a creator at or under the removed creator's price still goes through on a plan at its budget. A creator's price that rose past the budget is not taken onto the plan: approve_plan answers the same over_budget conflict with the figures at current prices.
1.13.1,
Approve_plan's body (ApproveInput) lists confirm_over_budget_cents again, deprecated and ignored if sent, so a client that still sends it passes the schema; it confirms nothing.
1.13.0,
A plan over its campaign's budget is never approved, by any key or person: approve_plan (POST /plans/{id}/approve) refuses it with 409 conflict, reason over_budget and over_by_cents, until a creator is removed or the budget is raised. confirm_over_budget_cents is removed from approve_plan and from plan_quote's policy, and is ignored if sent; the mandate's may_exceed_budget is retired and always false.
1.12.0,
GET /creators and creators_search carry catalog, the whole network's counts whatever the filter (catalog.approved approved creators, catalog.priced of them bookable now), the same numbers the app and the site show; left out when the network cannot be counted.
1.11.0,
GET /creators and creators_search carry priced, how many of total have something on sale now.
1.10.0,
Every 422 carries details.problems, each a field and a message, the one error shape; details.field is removed from the 422s that carried it (POST /feedback and feedback_send, POST /campaigns/{id}/creator-guidelines and set_creator_guidelines), so read details.problems[].field instead. GET /campaigns answers 400 with details.problems to a parameter it does not take (limit, offset or anything else) or an include_archived that is not true or false; before, such a parameter was ignored.
1.9.0,
GET /creators and creators_search refuse a list that names nothing to narrow it (no match, segment, q, reach_band or filter) with 400 filter_required; pass at least one.
1.8.0,
A results item carries previous, the reading before the newest one per metric (views, likes, comments, shares and when it was captured), null with fewer than two readings.
1.7.0,
A creator carries match_reasons, why it matches (topic, reach with its as-of date, launches posted about, engagement above the median of the creators listed); an evidence and a results item carry still_up, the first reading on or after day 7 that shows the post stayed up.
1.6.0,
Each quote line (plan_quote, GET /plans/{id}/quote) carries stage_id and stage, the same post stage model as a campaign's lines_by_stage, and creator_id beside creator.id; brand_terms carries current_number and accepted_number_for_this_key (the version number the app shows, version 3), and the terms resource carries number; creator_get takes creator_id again as another name for id (it was renamed id in 1.4.0 with no note here); a 403 that is not about the key's scope (mandate_refused, for one) no longer carries WWW-Authenticate insufficient_scope.
1.5.1,
A quote line's creator carries its id (for creator_get) when known.
1.5.0,
Plan_swap_creator (POST /plans/{id}/lines/{line_id}/swap) replaces one line of a plan with another creator's format in one step, both or neither; the daily campaign limit's resets_at is when it truly reopens (a rolling 24 hours); creator status words now read Not reviewed, Reviewed and Under review.
1.4.1,
The two view medians have names that say which is which: median_views_30d_network on the creator (all their posts, as the network measures it) and posts_summary.posts_sample_median_views (the held posts only); the old median_views_30d and posts_summary.median_views carry the same numbers, deprecated, until 2027-01-11; GET /campaigns and the MCP campaigns list leave archived campaigns out unless include_archived=true.
1.4.0,
One version for the API and the MCP server; refresh_failed_at is documented on the creator.
1.3.0,
A campaign has a stored name, "<company>, <Goal>, <Month>" until it is renamed; PATCH /campaigns/{id} (rename_campaign) renames it, the campaign lists carry it as display_name, and create_campaign answers with the budget it stored.
1.2.0,
A campaign's stage is one of eight fixed values from one stage model (stage_id draft, sent, plan_ready, approved, paid, running, complete, cancelled, and stage the matching label: Draft, Sent, Plan ready, Approved, Paid, Running, Complete, Cancelled); before this, stage was free text, so branch on stage_id, never on the label. Each plan line also carries its post stage (stage_id planned, offered, creator_confirmed, scheduled, live, proof_attached, cancelled, and stage the label), the plan carries lines_by_stage, and the campaigns list carries waits_on_you (approve or pay). A refunded or cancelled order makes the campaign cancelled. Every response carries an x-request-id header (yours echoed when you send one of 8 to 128 letters, digits or . _ : -); quote it when you report a slow or failed call. A write still running after 25 seconds answers 503 with Retry-After: retry it with the same Idempotency-Key for its result.