API changelog
Changes to the Checkbox API, SDKs, CLI, MCP server and legal catalog. API versions are dates; breaking changes only ship in a new version.
API versions are dates (Checkbox-Version). Backwards-compatible changes — new endpoints, new optional parameters, new fields, new event types, new error codes — ship continuously; breaking changes only in a new version. Legal catalog updates are announced as law updates and the law.changed webhook.
Current API version: 2026-10-30.
One status on the wire
The deprecated 0-100 score is removed (there were no external integrations reading it yet).
- Removed:
scoreandinsurablefrom scans, evaluations, the site'scomplianceblock and compliance plans;score_before/score_afterfrom law-update site impacts;result.scorefrom test runs;scorefrom the public scan report. Read the status label instead:compliance.status/compliance.label. - Scans gain
compliance(status,label) once the scan's evaluation exists (null before). - Webhooks:
site.compliance_changed(data.object is the site with its currentcompliance.statusandcompliance.label) replacessite.score_changed, which is no longer sent.plan.updated'sprevious_attributescarries the previousstatusonly. verifyTaskwithhtml,emailor Stripe params:precheck.checkslists each pre-checked check (check_id,status, one-linereason,fixwhen it does not pass).- Notice schedule: a yearly terms reminder that applies to a plan of a year or longer is listed (or named in
not_required), and a price-change notice withoutprice_changeis named innot_required, so the schedule's email kinds match the compliance plan's email tasks.
Newest Checkout Session and Payment Link trials
Backwards-compatible additions; nothing renamed or removed.
- Compliance plan,
stripe_checkout_params: sessions are judged newest first bycreated, one per set of prices. The task'swhyand theverifyTasknote name the judged session (cs_… (created YYYY-MM-DD)). Sessions a Payment Link created are judged as that Payment Link, not as Checkout Session parameters. - Per-plan offers read a Payment Link's
subscription_data.trial_period_daysfor the price it sells, so plan offer blocks, Notices trial timing and test runs carry the trial. - Test runs:
subscription_createdevents carry the subscription's actual trial end, and the mirrored Checkout Session is the newest one. - Checkbox Elements
1.4.2(no behaviour change).1.4.1and earlier stay available.
Per-plan fixes, Stripe re-read and Notices expectations
Backwards-compatible additions; nothing renamed or removed.
- Compliance plan, sign-up task: with two or more plans,
change.editsholds oneinsert_beforeper plan button, each with that plan's price, interval and trial.engine_verifiedis false for per-plan patches (only the resolved plan's text is engine-verified until the page is seen live). stripe_checkout_params: engine-corrected params keep theline_itemsPrice id andsubscription_data.trial_period_days. With several failing sessions,change.contentis still the first one's params; the explanation lists the others. Sign-up checks open only on Stripe Checkout pages count under this task. Stripe-hosted styling and placement are a note, never a fix.verifyTaskre-reads Stripe (rate-limited) before judging a Stripe-dependent task. The verification'sprecheck.notesays what was re-read; when there was no other pre-check,precheck.sourceisbilling_syncwith verdictneeds_review(it only carries the note: the re-evaluation decides).observed.billing_refreshlists the re-reads.- The plan's one-click
updateNoticeSettingsconfig addscancel_urlandpolicy(confirm: true) when Notices settings do not hold them yet. - MCP
check_stripe_checkout_session: the description says Stripe-hosted conspicuousness is a note in the plan. - Improve:
SUGGESTIONS_VERSION2026.11.03.2. - Descriptions across the OpenAPI document use neutral wording ("a requirement is clearly not met" instead of "a clear violation"). Field names, including
violations, are unchanged.
One status, one to-do list
Backwards-compatible; one field deprecated.
- The 0-100
score(sitecompliance.score, evaluations, scans, compliance plans, setup sessions) is deprecated. It stays populated for existing integrations, but no Checkbox surface (dashboard, emails, Slack, MCP, CLI, Stripe App) shows it any more. Read the site's one status instead:compliance.status/compliance.label(Compliant, Needs a fix, Not set up yet, Not checked yet, Your call, counted in tasks). - The compliance plan is the only to-do list: its open required tasks, in plan order, are what the dashboard, emails, MCP
get_site_status/get_compliance_planand the CLI list. Setup sessions gaincompliance.todo(task id, key, title, status, label);compliance.failing,compliance.needs_reviewandcompliance.top_findingsare deprecated (per-check evidence, not the to-do list). - MCP
get_site_statusreturnsdata.todo(the plan's open tasks) instead oftop_findings; its headline is the status label, without a score. - The compliance plan's
stripe_checkout_paramstask follows the rules engine on Stripe Checkout: with no registered Checkout config, it judges the recent subscription Checkout Sessions read from Stripe (consent_collection, custom_text, line items) instead of asking you to register them.verifyTaskon that task checks those sessions too when the request carries no params and none are registered. checkNoticeSchedule/ notice timing: a trial-ending reminder is never scheduled before the trial started. The send day is picked on the law's window, then pulled inside the trial when the trial is shorter.- Sign-up checks: consent is judged per form (a second plan's form gated by its own required box is not a bypass); Stripe's placement and styling of custom text on Stripe-hosted pages is "Looks compliant with a note" (hidden text still fails); a trial is only expected on the plan that has one.
- Checkbox Elements 1.4.1: rebuilt on the shared per-plan offer model; no behaviour change. 1.4.0 stays served unchanged.
Structured reviews
Backwards-compatible additions.
POST /v1/feedback(createFeedback) takestype: "review"withscore(0-10),liked,disliked,wrong_verdicts(eachcheck id: reason),would_keep_usingandstack;messageis optional for reviews. A review describes Checkbox the product: no site or request id is attached and URLs are removed. Free text in all feedback is redacted (secrets and API keys, card numbers, email addresses become[redacted]); the response gainsredacted.POST /v1/sites/:site/review_prompt(claimReviewPrompt): the one-time review prompt for a compliant site (showis true once per site). The MCP toolsget_compliance_planandverify_taskcall it and add the hint;send_feedbackaccepts the review fields. Agents ask the human once and never send a review without a yes.
Retention settings and legal hold
Backwards-compatible additions.
- Account and site objects gain
retention(good_practice_years,problem_history_days; sites alsoinherited) andlegal_hold(active,scope:siteoraccount,set,reason). Good-practice records are kept 7 years by default (1-10); problem history is deleted 30 days after a problem is resolved by default (7-730 days), keeping only counts. Open problems are never deleted. updateAccountandupdateSitetakeretention(on a site,nullreturns a value to the account default) andlegal_hold: { active, reason? }. Both need an admin key. Problem history also shows how fast you fixed things; keep it longer if you want that record.- New error code
legal_hold_active(409): shortening retention (includingupdateReceiptSettingsretention_days) or erasing receipts while a legal hold covers the account or site. - Evidence exports list records deleted under retention settings as
redacted: { at, reason }withfile: null;verify.mjschecks their chain links and reports them. Not in the MCP catalog (the tool list is at its size budget); agents can usecall_api.
Stripe checkouts, several plans, cancel gaps
Backwards-compatible additions.
POST /v1/sites/:site/billing/resync(resyncBilling): re-reads the site's billing-platform settings and re-evaluates. Answersbilling_syncwith the queued platforms; 409resource_conflict(next_actionconnect_billing) when none is connected. Not in the MCP catalog yet; agents can usecall_api.- Sites:
facts.checkout_type(own_page,stripe_checkout,payment_link): where shoppers pay. - Roll-ups (
complianceon sites, evaluations and plans) gaincheckouts: one verdict per plan / checkout (name,kind,plan,status,label,open), present when a site has two or more checkouts or one on Stripe. Statuses includenot_set_upandnot_checked. Evaluations of the current site now apply the site's decisions, like the site object. /v1/checks/disclosureand the other plan terms takeintro_price/intro_amount(below the recurring price) andintro_periods; Elements 1.4.0 takesintro-amount.- Suggestions:
before.source(your_copyorexample);account_urlandsells_goodsparameters. - Compliance plan
summarytext now starts with the site status label; parsecomplianceinstead of the text. - Notices preview:
priceProblemwhen the stated amount contradicts the Stripe charge (the send is refused).
SDKs 0.1.1
@checkbox-site/node,@checkbox-site/mcpandcheckbox-site(Python) 0.1.1, regenerated from the current spec.- Suggestions:
verification.compliance_statusandverification.compliance_label(the after-example's status roll-up,compliantfor every offered suggestion) andsurfaces[].held_label("Needs a fix" while a failing check holds the surface). Backwards-compatible additions. - Internal fields are marked internal and left out of the published spec and SDK types; responses still carry them, so nothing breaks for existing callers.
Status labels and protection levels
Backwards-compatible additions. Machine verdicts (status: pass / fail / needs_review / not_applicable) and verdict are unchanged.
- Every check verdict (
/v1/checks/*) and everyfindinggainscompliance_status(needs_fix,pending_live_check,verified_live,your_call,compliant,not_applicable) andcompliance(label,reason,tier, the onefix, anote, thepending_live_check{what,completes,action,due} or thequestion{text,recommended,why}). Check results, evaluations (compliance), sites (compliance.status,compliance.label,compliance.rollup) and compliance plans (compliance) gain a roll-up: needs_fix > your_call > compliant, where pending live checks count as compliant ("Compliant · 2 live checks pending"). Mapping: Checks and verdicts. - Tasks gain status
pending_live_check(counts as compliant, never blocks the plan),tier(required,recommended,extra) andcompliance_status; plans gainprotection_level,groupsandcounts.pending_live_check. A plan iscompliantwhen every required task is done or only waits for a live check. - Sites gain
protection_level(minimum,balanced— the default — ormaximum), settable on create / update.maximumadds two optional extra tasks;minimumhides recommended ones. - SDK types regenerated; MCP
update_sitetakesprotection_level, and tool headlines use the labels. - Elements 1.3.0:
appearance="line"(default — one semibold line in the page's own size and colours) or"box".
Compliant conversion suggestions
Backwards-compatible additions.
GET /v1/sites/{site}/suggestions(listSiteSuggestions,?surfaces=) and statelessPOST /v1/suggestions(suggestImprovements; the same inputs as/v1/checks/*pluscancellation_flowandother_plans): new objectsuggestion_report(sugr_…, not stored) withsuggestions[](before / after,apply,preconditions,guardrails,verification),withheld[]and per-surface status. Scopechecks:read.- The compliance plan gains
optional_improvements.conversion_suggestions, a pointer that is never a task and never changesstatus,scoreorcounts. - SDKs:
checkbox.suggestions.forSite / generate(Python:for_site,generate). MCP toolsuggest_improvements. Guide: Compliant conversion suggestions.
Required emails you send
Backwards-compatible additions.
GET /v1/notices/due(listDueNotices),GET /v1/notices/{notice}(retrieveDueNotice),POST /v1/notices/{notice}/sent(markNoticeSent) andPOST /v1/notices/{notice}/missed(markNoticeMissed): the emails a merchant owes each subscriber (requiredtrue for legally required ones, false for the recommended cancellation confirmation), with the window, the recommended send date, the rendered email, the subscriber's name and masked address and the notice's ownbccaddress (<key>+<kind>.<token>@…); new objectdue_notice(ntd_…). Live keys see live subscribers' notices, test keys test-mode ones.markNoticeSentrefuses a send beforewindow_startand asent_atfrom before an overdue notice became overdue.GET /v1/notices/templates(listNoticeTemplates) andPOST /v1/notices/templates/check(checkNoticeTemplate).- New event types
notice.due(on the notice'ssend_at) andnotice.overdue. notice_settingsgainsmode(merchant, the default for new sites, orcheckbox) andbcc. Turning on anenabled_kindsnotice withoutmodeswitches the site tocheckbox, as before.- SDKs:
checkbox.notices.listDue / retrieve / markSent / markMissed / listTemplates / checkTemplate(Python:list_due,mark_sent,mark_missed, …). MCP toolslist_due_notices,mark_notice_sent(missed: true),get_notice_templates. - A required notice overdue without proof makes its check fail (
confirmation.email.sent,reminder.*) and adds the computed plan tasksend_overdue_notices; overdue notices older than 90 days, test-mode subscribers and recommended notices never do.
Pilot fixes
Backwards-compatible additions and fixes.
- New endpoint
POST /v1/sites/{site}/integrations(connectBillingPlatform): connect Stripe, Recharge or Shopify with read-only credentials, in test mode too. The response carries awarningwhen the key's mode does not match the site. createSite/updateSitetaketerms_urlandaccount_url;test_account.reset_urlre-activates the test subscription before each cancellation test.verifyTasktakesrecheck: true. A task verification whose checks are still needs_review isfailedwithnext_action.type = needs_review(it waspassed).updateTasktakesstatus: not_applicable(with a reason): the task closes asno_longer_applicable.updateNoticeSettingsreports every missing prerequisite at once, withnext_action.- Elements 1.2.0: receipts record a bordered disclosure as
set_off: true. listReceipts?customer_reference=also finds receipts by the reference attached withupdateConsent.
Feedback and public preview
Backwards-compatible additions.
- New endpoint
POST /v1/feedback(createFeedback, any secret or restricted key, test or live) and MCP toolsend_feedback: report a problem or a missing feature with context (site, request id, tool). 20 per key per hour. - New crawler: the public preview (
CheckboxPreview/1.0) takes one look at a newly added website's public pages, at most once per domain per day, before the domain is verified.
Consent receipts
Backwards-compatible additions.
- New resource: consent receipts —
createReceiptToken,createReceipt,listReceipts,retrieveReceipt,renderReceipt,verifyReceipt,exportReceipt,eraseReceipts,retrieveReceiptSettings,updateReceiptSettings; eventreceipt.created; error codereceipts_disabled; scopereceipts; MCP toolslist_receiptsandget_receipt. - Receipts are off until you turn them on (
updateReceiptSettings, after updating your privacy policy). Then Checkbox Elements 1.1.0 records a receipt with each consent (consent.receipt), and the snippet records receipts withdata-receipts="1"anddata-publishable-key. - Stripe-hosted Checkout and Payment Links get receipts reconstructed from Stripe's record of the session.
- Compliance plans recommend "Turn on consent receipts" (low priority, never blocking) until a site records one.
2026-10-31
Backwards-compatible additions and fixes from the first agent usability test and security review.
- Every
next_actionthat names anoperation_idalso names itsmcp_tool. New MCP toolupdate_site;setup_checkboxapplies the facts and runs the first checks in the call that receives the keys. - Plans:
blocked_on,closed_reason,coverage;change.type: "needs_facts"instead of patches with placeholders;change.operation_id/endpointfor config changes; astripe_checkout_paramstask from registered Checkout params; a notice sent outside its window is an agent task, not a human question; answers that attest a legal fact need the human's confirmation (ask_human_to_confirm). - Setup sessions:
merchant_name; test keys only see sessions created in test mode. The summary email goes out when the setup is finished (every check passes, orcompleteSetupSession), not right after setup starts. - Emails:
charge_noticekind incheckEmail/verifyTask;trial_endingaccepted as an alias; unresolved placeholders in a checked email are reported (unresolved_placeholders); inbound emails honour a+kindplus-address or theX-Checkbox-Kindheader. - Consents: browser-claimed references are
client_reference;customer_referenceis set by secret keys only. - Test mode only scans, monitors, fetches and test-runs local hosts and verified domains (plus a small daily scan budget for others): new error codes
test_mode_domain_unverified,test_mode_scan_budget_exhausted. - CLI:
checkbox answer;checkbox init --merchant-name,--plan,--account-url, and facts are remembered across a resumed login. - Every website Checkbox visits must be verified, in live mode too and per domain (details): new error code
domain_not_verified; site objects carrymonitoring.held_for_domain_verificationandmonitoring.verify_domains; plans start with averify_domaintask (verifyTaskchecks the DNS record / file); test runs can fail withdomain_not_verified. Test mode adds a deployment-wide daily budget for scans of unverified domains.
Later the same day: scan gate closed, one-click MCP
- Scan gate closed in test mode. Test mode no longer gives a daily allowance of scans of domains you have not verified: they are refused at once with
403 test_mode_domain_unverifiedandnext_action.type: "verify_domain".test_mode_scan_budget_exhaustedis no longer returned (it stays in the error catalog for older clients). Policy and homepage fetches follow the same rule. - Redirects are followed only within verified websites (page fetch, policy fetch, and the scanner's browser, which also does not open other websites by navigation). Hosted checkout pages are reached by clicking through from your page; as a direct checkout / login URL they need a connected billing account.
/.well-known/checkbox-verify.txtmust be onhttps://<domain>/(default port; an apex redirect to the same file onwww.is followed).- Setup sessions of a site whose domain is not verified start with a
domainstep andnext_action.type: "verify_domain";verifySiteanswersnext_action.type: "verify_domain"instead of "first check complete";verifyTaskwithhtmlanswers at once withnext_action.type: "deploy_and_reverify". - Domain verification of a
localhostsite: no DNS record, the file URL on the site's own origin, andnext_action.type: "local_site". - MCP: connect claude.ai, Claude Desktop, Claude Code or Cursor with one approval (OAuth); see MCP.
2026-10-30
The first public version of the API.
- API v1 at
https://app.checkbox.site/v1: secret, restricted and publishable keys; an isolated test mode for every account; live mode by domain verification; prefixed ids, cursor pagination,Idempotency-Key, dated versions,expand[], errors with stable codes andnext_action. OpenAPI 3.1 at/v1/openapi.json. - Agent setup:
checkbox initwith device-authorization login (one browser approval), setup sessions, Terms and policy checks. - Preflight checks for disclosure text, Stripe Checkout Sessions and Payment Links, lifecycle emails, checkout HTML and notice schedules; also offline in the CLI.
- Compliance plans: ordered tasks with exact changes, verification and human questions.
- Test runs: synthetic subscriptions in Stripe test mode with test clocks.
- Checkbox Elements: the
<checkbox-disclosure>web component and consent records. - Webhooks for findings, scores, scans, plans, verifications, test runs, consents, certificates, notices and law changes.
- MCP server at
https://app.checkbox.site/mcp; Node and Python SDKs (pre-release). - Free to start: no plan limits on compliance features; fair-use limits apply.
Checkbox is compliance software, not a law firm; nothing in these docs is legal advice (details). You remain solely responsible for your subscription program, and Checkbox takes on no legal liability for it (Terms). Checkbox is a System1 company; Trust center · Status. For AI agents: every page is available as Markdown at the same URL plus .md; the index is /llms.txt.