Changelog
Changes to the Archive API and to these guides, newest first.
About this changelog
This page records partner-visible changes to the /api/v2 surface: schema additions and removals,
authentication or header changes, rate-limit behavior, and error-shape changes. Add an entry in any
pull request that changes the GraphQL schema or guide-visible behavior, dated by its merge date, with
one bullet per change.
2026-08-14
- MCP
searchItemswithresponseFormat: "concise"now returnscreator { id }on every node. It is the join key for creator-level diffs — for example differencing a campaign roster fromsearchCreatorsagainst that campaign’s posters — where matching onaccountNameis unsafe because a workspace can hold two creator records that share a handle. The added relation raises a concisesearchItemscall’s weighted cost by 8 (a 20-row page goes from 55 to 63) and adds one batched creator lookup (~17 ms) to the request;detailedis unchanged in both respects. See conventions and rate limits.
2026-08-09
- Rate-limit capacity and refill now differ per plan instead of being the same for every paying
plan. Read your own ceiling off
RateLimit-Policy(qis the capacity,wthe seconds to refill it) rather than assuming the previous flat numbers — for some plans the capacity is lower than it was. See rate limits. - New:
Item.aiFilterReasonsreturns the explanation an AI Filter produced for each AI-generated custom-attribute value on an item. Every entry pairs to a value: akeyis only returned when the item carries a value for it incustomAttributes.reasonisnullwhen the run recorded no explanation and""when the model produced an empty one. The list is empty, never null, when an item has none. - New:
CustomAttributeSchema.aiGeneratedmarks which attribute keys are generated by an AI Filter, so you can discover which keys carry reasons before requesting them.
2026-08-06
- New: the MCP section documents Archive’s Model Context Protocol server — its read tools, write tools, and the conventions that hold across every tool. Each tool wraps exactly one public root field, and every operation’s reference page now links to the tool that wraps it.
- The seven list fields that return a plain list rather than a connection now return at most 1000 rows. The cap is silent — there is no cursor to continue from. See pagination.
itemIdsByUrlaccepts any public HTTP(S) URL. It returnsINVALID_URLonly for a malformed URL, a non-HTTP scheme, or a private/reserved host; a well-formed public URL with no matching item now returnsNOT_FOUNDrather thanINVALID_URL.- Clarified that a Social Profile View’s and a workspace Creator View’s
filtersblob is stored and echoed back but not applied when reading throughsocialProfiles(presetId:)orcreators(presetId:). This is long-standing behavior, not a change — only the documentation was wrong. See filtering.
2026-08-02
- MCP requests now charge — and refund — the same pooled organization bucket as
/api/v2, so routing load through/api/v2/mcpno longer multiplies an organization’s capacity. See rate limits.
2026-08-01
POST /api/v2acceptsvariablesas a JSON-encoded string as well as a JSON object, and honorsoperationName, so a document that defines several operations is usable. A stringvariablespreviously returned a non-JSON error page.- An unhandled resolver error now returns a coded GraphQL error envelope instead of a non-JSON error page. See errors.
- Workspaces owned by the same organization share one rate-limit bucket rather than one bucket each. See rate limits.
- Breaking (MCP only):
tools/listnow requires credentials and answers an unauthenticated call with the same RFC 9728 discovery challenge asinitialize. - MCP tool arguments now enforce the
minimum,maximum, andminLengthbounds thattools/listadvertises for them. - Revoking an MCP connection now revokes its whole refresh-token rotation lineage, so a superseded credential can no longer mint access tokens.
uploadItemFromUrlrejects URLs whose host is a private or reserved address, or that carry no host at all.
2026-07-31
- The weighted cost model is enforced: a request that exhausts the bucket is rejected with HTTP
429, a
Retry-Afterheader, and aRATE_LIMIT_EXCEEDEDerror. It previously ran in shadow mode and only reported cost in headers. See rate limits.
2026-07-30
aftercursors are bound to the connection that issued them and shape-checked per entity, so a cursor borrowed from another connection fails with the codedInvalid cursorerror rather than an internal error. See pagination.- The payload-heavy MCP read tools accept
responseFormat: "concise" | "detailed".detailedis the default and its shape is unchanged.
2026-07-29
- A query canceled by the database statement timeout now returns a GraphQL error envelope with the
stable
QUERY_TIMEOUTcode instead of a non-JSON error page. See errors. competitorBrandsandcompetitorBrandkeep returning roster data when aggregate metrics are temporarily unavailable and report the outage as aSERVICE_UNAVAILABLEerror alongside the data. Match onextensions.codeto decide whether to retry —ownMetricsStatus: UNAVAILABLEalone no longer implies a retry will help.- MCP tool responses were trimmed to the fields each tool needs for its stated purpose; 20 tools now return fewer fields.
- MCP honors the
MCP-Protocol-Versionrequest header.
2026-07-28
- A superseded MCP refresh token is now revoked when its successor is used. Superseded refresh tokens
previously stayed valid indefinitely. The OAuth discovery document also advertises the
revocation_endpoint, so clients can log out cleanly.
2026-07-27
refetchEngagementBulkis available to every API-enabled workspace — the separate engagement-refresh feature gate is gone, and itsuserErrorsno longer report “feature not enabled”. The mutation is still credit-gated.- MCP answers the
pingmethod with the protocol’s empty result instead of-32601 Method not found.
2026-07-26
competitorBrandsnow returns your own brand as one additional pinned node on the first page, namedYouand flagged by the newisOwnBrandfield, so you can compute self-vs-competitor Share of Voice.totalCountstill counts tracked competitors only, so page one returns one more edge than it reports. See pagination.CompetitorBrandgainedearnedMediaValue,engagementsTotal,impressions,influencersCount,postsCount, andreach, plusownMetricsStatus— set only on the own-brand entry, distinguishing “computed, no data in window” from “could not be computed”.competitorBrandsandcompetitorBrandacceptperiod(WEEK/MONTH, defaultMONTH) anddateto select the metric window.competitorBrandalso resolves the own-brand entry by its stable id.
2026-07-25
- Malformed or foreign pagination cursors now fail with a coded
Invalid cursorerror instead of a generic internal error, across every cursor-paginated connection. - Breaking (MCP only): every MCP tool argument is now camelCase (
itemId,presetId,viewIds), matching the GraphQL field names one-to-one. Stored keys inside the opaque saved-viewfiltersblob stay snake_case — clone them verbatim. The/api/v2GraphQL surface is unchanged.
2026-07-24
- MCP responses now carry the same IETF
RateLimitandRateLimit-Policyheaders as/api/v2. See rate limits.
2026-07-23
- Recalibrated the base rate-limit plan to a capacity of 15000 with a refill of 250 per second.
- Published the Archive API documentation site: task-oriented guides plus a schema-driven reference for every query, mutation, and type.
- Documented the generally available surface — bearer-token authentication,
the
WORKSPACE-IDworkspace model, Relay-style pagination, theitemsfiltering and search cookbook, the rate-limit layers, and the error model.