{"title":"API & MCP changes","url":"https://trustgrowth.ai/developers/changelog","entries":[{"id":"campaign-human-approval","title":"Require owner browser approval for campaigns","surfaces":["app","rest","mcp"],"kind":"security","compatibility":"breaking","what":"All six human-only campaign commands now return 403 for API credentials. Owner controls support approval, plan fields, schedule constraints, capacity exceptions, and completion. API events identify the API credential.","why":"An API credential must not gain human authority from its owner.","action":"Move human decisions to the owner campaign and review pages. API submit-plan calls now return 403. Inspect current state before replacing a conflicting idempotency key.","tools":["execute_campaign_command","submit_campaign_plan","approve_review_queue_item"],"release":"2026.10.31.1","date":"2026-10-31","contract_version":"4.0.0","status":"released","url":"https://trustgrowth.ai/developers/changelog?entry=campaign-human-approval#change-campaign-human-approval"},{"id":"contract-version-in-openapi-info","title":"OpenAPI info.version reports the contract version","surfaces":["rest","mcp"],"kind":"improved","compatibility":"compatible_fix","what":"The OpenAPI document's info.version now carries the integration contract version (the same SemVer value as x-contract-version, meta.contract_version and the MCP serverInfo.version) instead of the fixed string \"v1\". The getPackageContentVariant 200 response schema now references PackageContentVariant; it was an invalid bare string. Change notes in x-change-notes are now generated from release files with unchanged text. No operation, parameter, field or MCP tool changed.","why":"\"v1\" named the URL route, not the document, so clients could not tell which contract a document describes. Versions now come from a release step, so parallel changes no longer race to bump them.","action":"If you compared info.version with \"v1\", compare x-contract-version or the /api/v1 path prefix instead. Nothing else to do.","operations":["getPackageContentVariant"],"release":"2026.10.31.1","date":"2026-10-31","contract_version":"4.0.0","status":"released","url":"https://trustgrowth.ai/developers/changelog?entry=contract-version-in-openapi-info#change-contract-version-in-openapi-info"},{"id":"prompt-review-context","title":"Prompt text in review queue responses","surfaces":["rest"],"kind":"fixed","compatibility":"additive","what":"Prompt review rows return a stable id, complete prompt text, active state, intent, and demand source.","why":"Reviewers need to read the prompt before they approve it.","action":"none","release":"2026.10.31.1","date":"2026-10-31","contract_version":"4.0.0","status":"released","url":"https://trustgrowth.ai/developers/changelog?entry=prompt-review-context#change-prompt-review-context"},{"id":"proof-ai-monthly-snapshot","title":"Proof pages show the questions AI was asked, and the leaderboard counts who AI names","surfaces":["app","rest"],"kind":"added","compatibility":"additive","what":"The AI visibility section on a proof page now lists the questions that were asked, with how many answers from each engine named the site (\"2 of 3\"). It is fed by the monthly snapshot that Free sites now get, so it shows counts instead of \"Not measured\", and it says whether the sample is a monthly snapshot or a weekly sample. Below 30 answers an engine shows only the count; a percent and its 95% range appear from 30 answers. Brands named instead are never shown on a public page. A question is quoted only when TrustGrowth's planner wrote it; a question taken from the site's own search data is shown by number, and its text is null in the API. The leaderboard and category standings have a \"Named by AI\" column, and the top three carry a badge when an AI answer named them. The public proof API adds ai_visibility.recalled questions and cadence, and ai_visibility_summary cadence and questions; recall percent, low and high are now null below 30 answers.","why":"A count of real answers is honest at small samples, and the questions show what was measured. A percent from five answers suggested a precision the sample did not have.","action":"none. Integrators that read ai_visibility_summary engines recall percent must already handle null (it was nullable); it is now null below 30 answers.","release":"2026.10.31.1","date":"2026-10-31","contract_version":"4.0.0","status":"released","url":"https://trustgrowth.ai/developers/changelog?entry=proof-ai-monthly-snapshot#change-proof-ai-monthly-snapshot"}],"pagination":{"page":1,"total_pages":1,"total_releases":1,"previous_url":null,"next_url":null}}