Checkbox Docs

Notices API

The legally required acknowledgment, trial-ending, renewal, yearly-terms, price-change and cancellation emails, timed from the legal catalog: you send them and Checkbox tracks them (mode merchant, the default), or Checkbox sends them for you (mode checkbox).

OperationEndpoint
Retrieve notice settingsGET /v1/sites/{site}/notice_settings
Update notice settingsPOST /v1/sites/{site}/notice_settings
List due noticesGET /v1/notices/due
List notice email templatesGET /v1/notices/templates
Check a notice email templatePOST /v1/notices/templates/check
Retrieve a due noticeGET /v1/notices/{notice}
Mark a due notice as sentPOST /v1/notices/{notice}/sent
Record a due notice as missedPOST /v1/notices/{notice}/missed

The NoticeSettings object

Checkbox Notices for a site: the legally required emails Checkbox sends on the merchant's behalf.

FieldTypeDescription
idstringUnique identifier of the notice settings (ntcs_…).
objectenumString representing the object's type. Always "notice_settings".
livemodebooleantrue for live-mode objects, false for test mode (ck_test_ keys act on an isolated sandbox).
sitestringThe site.
modeenummerchant ("You send", the default): you send the required emails and Checkbox tells you what and when (listDueNotices, notice.due), checks your templates and confirms each send. checkbox: Checkbox sends them for you (enabled_kinds). One of merchant, checkbox.
bccstringThe site's inbound address. Copies to it confirm a notice only when your sending domain authenticates them (DKIM/SPF, a trusted sending domain) and they go to the subscriber; to confirm any copy, BCC each due notice's own bcc address instead (listDueNotices / the notice.due webhook).
enabled_kindsarray of enummode checkbox: the notices Checkbox sends for the merchant.
brand_namestring | nullBrand shown in notices (defaults to the site name).
product_namestring | nullProduct name used in notices.
logo_urlstring | nullLogo URL (https).
support_emailstring | nullReply-to / support address.
cancel_urlstring | nullWhere subscribers cancel online (site domain, hosted cancellation page or billing portal).
brand_colorstring | nullHex brand colour.
from_local_partstringMailbox name of the sender.
subscribersobject | nullWho Checkbox can send notices to (null when unknown).
subscribers.activeintegerActive subscriptions Checkbox knows from the billing platform.
subscribers.with_emailintegerOf those, how many have a known email address (Checkbox can only send to these).
policyobject | nullConfirmed cancellation policy (required before notices go out).
policy.cancel_timingenumWhen a cancellation takes effect. One of period_end, immediately.
policy.confirmedintegerWhen the policy was confirmed. Unix timestamp in seconds.
senderobject | nullSending address, when one is available.
sender.fromstringFrom header.
sender.own_domainbooleanSent from the merchant's verified domain.
sending_domainobjectCustom sending domain status (set it up in the dashboard).
sending_domain.domainstring | nullCustom sending domain.
sending_domain.statusstringnone, pending, verified or failed.
delivery_configuredbooleanThis Checkbox deployment can send email.
kindsarray of objectsEvery notice kind.
updatedinteger | nullLast change. Unix timestamp in seconds.
next_actionNextAction | nullWhat the caller (often an AI agent) should do next.

Retrieve notice settings

GET /v1/sites/{site}/notice_settings

Who sends the site's required emails (mode), the BCC address, which notices Checkbox sends in checkbox mode, and what to do next (next_action).

Scope notices:read · Operation retrieveNoticeSettings

SDK: checkbox.noticeSettings.retrieve() (Node) · checkbox.notice_settings.retrieve() (Python). MCP / agents: operation retrieveNoticeSettings.

Parameters

ParameterInTypeDescription
site requiredpathstringUnique identifier of the site (site_…).

Returns

Returns a NoticeSettings object.

Errors use the standard envelope with a stable code and, where useful, next_action.

curl https://app.checkbox.site/v1/sites/site_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b/notice_settings \
  -u "$CHECKBOX_SECRET_KEY:"
Response
{
  "id": "ntcs_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "object": "notice_settings",
  "livemode": false,
  "site": "site_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "mode": "merchant",
  "bcc": "k_3f9a1c2e@inbound.checkbox.site",
  "enabled_kinds": [
    "acknowledgment",
    "renewal_reminder"
  ],
  "brand_name": "Acme Coffee Club",
  "product_name": "Coffee subscription",
  "logo_url": null,
  "support_email": "help@acme.example",
  "cancel_url": "https://acme.example/account/cancel",
  "brand_color": "#1f2937",
  "from_local_part": "notices",
  "subscribers": {
    "active": 12,
    "with_email": 12
  },
  "policy": {
    "cancel_timing": "period_end",
    "confirmed": 1793318400
  },
  "sender": {
    "from": "Acme Coffee Club <notices@acme.example>",
    "own_domain": true
  },
  "sending_domain": {
    "domain": "acme.example",
    "status": "verified"
  },
  "delivery_configured": true,
  "kinds": [
    {
      "kind": "renewal_reminder",
      "label": "Renewal reminder",
      "description": "Sent before an annual renewal.",
      "enabled": true,
      "check_ids": [
        "reminder.annual_renewal_notice"
      ]
    }
  ],
  "updated": 1793318400,
  "next_action": {
    "type": "verify_domain",
    "message": "Verify your site domain to turn on live mode.",
    "operation_id": "createDomainVerification",
    "mcp_tool": "call_api",
    "endpoint": "POST /v1/sites/{site}/domain_verification",
    "url": "https://checkbox.site/docs/concepts/activation#verify"
  }
}

Update notice settings

POST /v1/sites/{site}/notice_settings

Chooses who sends the required emails (mode: merchant = you send them and Checkbox tracks them, the default; checkbox = Checkbox sends them), and sets branding, cancel_url and the confirmed cancellation policy. In checkbox mode, turning a notice on (enabled_kinds) requires cancel_url, a confirmed policy, a connected Stripe or Recharge account and a sending address; otherwise resource_conflict explains what is missing.

Scope notices:write · Idempotent (send Idempotency-Key) · Live mode needs activation · Operation updateNoticeSettings

SDK: checkbox.noticeSettings.update() (Node) · checkbox.notice_settings.update() (Python). MCP / agents: operation updateNoticeSettings.

Parameters

ParameterInTypeDescription
site requiredpathstringUnique identifier of the site (site_…).

Body

FieldTypeDescription
modeenummerchant: you send the emails (Checkbox tracks them); checkbox: Checkbox sends them. Turning an enabled_kinds notice on implies checkbox. One of merchant, checkbox.
enabled_kindsarray of enumNotices to send (turning one on needs cancel_url, a confirmed policy and a connected Stripe/Recharge account). trial_reminder is accepted as an alias of trial_ending.
brand_namestring | nullBrand name.
product_namestring | nullProduct name.
logo_urlstring | nullLogo URL (https).
support_emailstring | nullSupport address.
cancel_urlstring | nullOnline cancellation URL.
brand_colorstring | nullHex colour.
from_local_partstringSender mailbox name.
policyobject | nullCancellation policy the notices state.
policy.cancel_timing requiredenumWhen a cancellation takes effect (must match your Terms). One of period_end, immediately.
policy.confirm requiredenumConfirms this matches your Terms and your cancellation flow.

Returns

Returns a NoticeSettings object.

In live mode before activation: 403 account_not_activated with next_action.operation_id: "createDomainVerification".

Errors use the standard envelope with a stable code and, where useful, next_action.

curl https://app.checkbox.site/v1/sites/site_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b/notice_settings \
  -u "$CHECKBOX_SECRET_KEY:" \
  -H "Content-Type: application/json" \
  -d '{
  "brand_name": "Acme Coffee Club"
}'
Response
{
  "id": "ntcs_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "object": "notice_settings",
  "livemode": false,
  "site": "site_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "mode": "merchant",
  "bcc": "k_3f9a1c2e@inbound.checkbox.site",
  "enabled_kinds": [
    "acknowledgment",
    "renewal_reminder"
  ],
  "brand_name": "Acme Coffee Club",
  "product_name": "Coffee subscription",
  "logo_url": null,
  "support_email": "help@acme.example",
  "cancel_url": "https://acme.example/account/cancel",
  "brand_color": "#1f2937",
  "from_local_part": "notices",
  "subscribers": {
    "active": 12,
    "with_email": 12
  },
  "policy": {
    "cancel_timing": "period_end",
    "confirmed": 1793318400
  },
  "sender": {
    "from": "Acme Coffee Club <notices@acme.example>",
    "own_domain": true
  },
  "sending_domain": {
    "domain": "acme.example",
    "status": "verified"
  },
  "delivery_configured": true,
  "kinds": [
    {
      "kind": "renewal_reminder",
      "label": "Renewal reminder",
      "description": "Sent before an annual renewal.",
      "enabled": true,
      "check_ids": [
        "reminder.annual_renewal_notice"
      ]
    }
  ],
  "updated": 1793318400,
  "next_action": {
    "type": "verify_domain",
    "message": "Verify your site domain to turn on live mode.",
    "operation_id": "createDomainVerification",
    "mcp_tool": "call_api",
    "endpoint": "POST /v1/sites/{site}/domain_verification",
    "url": "https://checkbox.site/docs/concepts/activation#verify"
  }
}

List due notices

GET /v1/notices/due

The legally required emails you owe subscribers (sites in "You send" mode, the default): kind, the subscriber (billing-platform ids), the legal window for the subscriber's state, the recommended send date, the copy-ready email and the BCC address. Default: everything not yet sent (upcoming, due, overdue), soonest first. Live keys list live subscribers' notices, test keys test-mode ones. Send each one on its send_date (inside its window), then call markNoticeSent (or BCC the notice's bcc address). Subscribe to the notice.due webhook to get each one on its send date.

Scope notices:read · Operation listDueNotices

SDK: checkbox.notices.listDue() (Node) · checkbox.notices.list_due() (Python). MCP / agents: operation listDueNotices.

Parameters

ParameterInTypeDescription
limitqueryintegerNumber of objects to return, 1-100 (default 10).
starting_afterquerystringCursor: an object id; returns the objects after it (older).
ending_beforequerystringCursor: an object id; returns the objects before it (newer).
sitequerystringOnly this site (site_…). Default: every site of the account.
statusquerystringComma-separated statuses (upcoming, due, sent, overdue, canceled, missed). Default: upcoming,due,overdue — what still needs sending.
kindquerystringComma-separated kinds (acknowledgment, trial_ending, renewal_reminder, annual_terms, price_change, cancellation_confirmation).
subscriptionquerystringOnly notices for this billing-platform subscription id.

Returns

Returns a list ({ object: "list", data, has_more, url }) of DueNotice objects.

Errors use the standard envelope with a stable code and, where useful, next_action.

curl -G https://app.checkbox.site/v1/notices/due \
  -u "$CHECKBOX_SECRET_KEY:" \
  -d limit=3
Response
{
  "object": "list",
  "data": [
    {
      "id": "ntd_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
      "object": "due_notice",
      "livemode": false,
      "site": "site_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
      "kind": "trial_ending",
      "label": "Trial-ending reminder",
      "required": true,
      "status": "due",
      "subscriber": {
        "platform": "stripe",
        "subscription": "sub_1QabcXYZ",
        "customer": "cus_Qabc123",
        "name": "Alex Rivera",
        "email_masked": "a•••@example.com",
        "region": "US-CA"
      },
      "window_start": 1793318400,
      "window_end": 1793318400,
      "send_at": 1793318400,
      "send_date": "2026-11-12",
      "anchor": 1793318400,
      "jurisdictions": [
        "US-CA"
      ],
      "requirement_ids": [
        "US-CA.17602.a.3"
      ],
      "citations": [
        "Cal. Bus. & Prof. Code § 17602(a)(3)"
      ],
      "email": {
        "template_id": "trial_ending.v1",
        "subject": "Your Acme Coffee free trial ends on November 19, 2026",
        "text": "Hi Alex,\n\nYour free trial ends on November 19, 2026. …",
        "html": "<div …><p …>Hi Alex,</p>…</div>",
        "missing_fields": []
      },
      "bcc": "k_3f9a1c2e+trial_ending.9f8e7d6c5b4a39281706f5e4d3c2b1a0@inbound.checkbox.site",
      "sent": {
        "at": 1793318400,
        "source": "bcc",
        "late": false,
        "provider_message_id": "re_9f8e7d6c",
        "evidence": null
      },
      "missed": {
        "at": 1793318400,
        "reason": "Subscriber already left; not sent."
      },
      "created": 1793318400,
      "updated": 1793318400,
      "next_action": {
        "type": "verify_domain",
        "message": "Verify your site domain to turn on live mode.",
        "operation_id": "createDomainVerification",
        "mcp_tool": "call_api",
        "endpoint": "POST /v1/sites/{site}/domain_verification",
        "url": "https://checkbox.site/docs/concepts/activation#verify"
      }
    }
  ],
  "has_more": false,
  "url": "/v1/sites"
}

List notice email templates

GET /v1/notices/templates

Copy-ready HTML + text templates for every required notice (acknowledgment with and without a trial, trial ending, renewal, yearly terms, price change, cancellation confirmation), with {{merge_fields}}. Each passes the preflight email check for its kind when filled. Pass ?site= to get each kind's BCC address too. Adapt one, then call checkNoticeTemplate.

Scope notices:read · Operation listNoticeTemplates

SDK: checkbox.notices.listTemplates() (Node) · checkbox.notices.list_templates() (Python). MCP / agents: operation listNoticeTemplates.

Parameters

ParameterInTypeDescription
sitequerystringSite (site_…) whose BCC addresses to include.

Returns

Returns a list ({ object: "list", data, has_more, url }) of NoticeTemplate objects.

Errors use the standard envelope with a stable code and, where useful, next_action.

curl https://app.checkbox.site/v1/notices/templates \
  -u "$CHECKBOX_SECRET_KEY:"
Response
{
  "object": "list",
  "data": [
    {
      "id": "trial_ending.v1",
      "kind": "trial_ending",
      "variant": "trial_ending",
      "label": "Trial-ending reminder",
      "when": "Before a free trial converts, inside the subscriber's state window.",
      "use_when": "A free trial is about to convert to a paid subscription.",
      "subject": "Your {{brand_name}} free trial ends on {{trial_end_date}}",
      "text": "Hi {{customer_name}},\n\nYour free trial ends on {{trial_end_date}}. …",
      "html": "<div …><p …>Hi {{customer_name}},</p>…</div>",
      "merge_fields": [
        "customer_name"
      ],
      "check_kind": "trial_reminder",
      "bcc": "k_3f9a1c2e+trial_ending@inbound.checkbox.site"
    }
  ],
  "merge_fields": [
    {
      "name": "trial_end_date",
      "description": "When the free trial ends and the first charge happens."
    }
  ],
  "has_more": false,
  "url": "/v1/notices/templates"
}

Check a notice email template

POST /v1/notices/templates/check

Checks your own version of a notice email: Checkbox fills the merge fields with the site's plan, brand and cancel URL (sample dates), then runs the preflight email check for the kind across the site's jurisdictions. Stateless. Fix what fails (or start from listNoticeTemplates) and check again until verdict is pass.

Scope notices:read · Operation checkNoticeTemplate

SDK: checkbox.notices.checkTemplate() (Node) · checkbox.notices.check_template() (Python). MCP / agents: operation checkNoticeTemplate.

Body

FieldTypeDescription
site requiredstringSite whose plan, brand, cancel URL and jurisdictions fill the merge fields and scope the check.
kind requiredenumWhich notice the template is for. One of acknowledgment, trial_ending, renewal_reminder, annual_terms, price_change, cancellation_confirmation.
subject requiredstringYour subject (merge fields allowed).
textstringYour plain-text body (merge fields allowed).
htmlstringYour HTML body (merge fields allowed).

Returns

Returns a NoticeTemplateCheck object.

Errors use the standard envelope with a stable code and, where useful, next_action.

curl https://app.checkbox.site/v1/notices/templates/check \
  -u "$CHECKBOX_SECRET_KEY:" \
  -H "Content-Type: application/json" \
  -d '{
  "site": "site_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "kind": "trial_ending",
  "subject": "Your {{brand_name}} free trial ends on {{trial_end_date}}",
  "text": "Hi {{customer_name}}, your free trial ends on {{trial_end_date}}. Unless you cancel before then, you will be charged {{price}} every {{billing_period}} until you cancel. Cancel online anytime at {{cancel_url}}."
}'
Response
{
  "object": "notice_template_check",
  "kind": "trial_ending",
  "verdict": "pass",
  "checks": [
    {
      "check_id": "reminder.trial_ending",
      "status": "pass",
      "explanation": "The reminder states the charge, the date and how to cancel."
    }
  ],
  "unknown_fields": [],
  "warnings": [
    {
      "code": "unknown_merge_fields",
      "message": "Unknown merge fields: {{plan}}."
    }
  ],
  "filled": {
    "subject": "Your Acme trial ends November 19, 2026",
    "text": "Hi Alex, …",
    "html": "<p>Hi Alex, …</p>"
  },
  "next_action": {
    "type": "verify_domain",
    "message": "Verify your site domain to turn on live mode.",
    "operation_id": "createDomainVerification",
    "mcp_tool": "call_api",
    "endpoint": "POST /v1/sites/{site}/domain_verification",
    "url": "https://checkbox.site/docs/concepts/activation#verify"
  }
}

Retrieve a due notice

GET /v1/notices/{notice}

One notice you owe a subscriber, with its window, recommended send date, copy-ready email, BCC address and send status.

Scope notices:read · Operation retrieveDueNotice

SDK: checkbox.notices.retrieve() (Node) · checkbox.notices.retrieve() (Python). MCP / agents: operation retrieveDueNotice.

Parameters

ParameterInTypeDescription
notice requiredpathstringUnique identifier of the due notice (ntd_…).

Returns

Returns a DueNotice object.

Errors use the standard envelope with a stable code and, where useful, next_action.

curl https://app.checkbox.site/v1/notices/ntd_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b \
  -u "$CHECKBOX_SECRET_KEY:"
Response
{
  "id": "ntd_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "object": "due_notice",
  "livemode": false,
  "site": "site_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "kind": "trial_ending",
  "label": "Trial-ending reminder",
  "required": true,
  "status": "due",
  "subscriber": {
    "platform": "stripe",
    "subscription": "sub_1QabcXYZ",
    "customer": "cus_Qabc123",
    "name": "Alex Rivera",
    "email_masked": "a•••@example.com",
    "region": "US-CA"
  },
  "window_start": 1793318400,
  "window_end": 1793318400,
  "send_at": 1793318400,
  "send_date": "2026-11-12",
  "anchor": 1793318400,
  "jurisdictions": [
    "US-CA",
    "US-FED"
  ],
  "requirement_ids": [
    "US-CA.17602.a.3"
  ],
  "citations": [
    "Cal. Bus. & Prof. Code § 17602(a)(3)"
  ],
  "email": {
    "template_id": "trial_ending.v1",
    "subject": "Your Acme Coffee free trial ends on November 19, 2026",
    "text": "Hi Alex,\n\nYour free trial ends on November 19, 2026. …",
    "html": "<div …><p …>Hi Alex,</p>…</div>",
    "missing_fields": []
  },
  "bcc": "k_3f9a1c2e+trial_ending.9f8e7d6c5b4a39281706f5e4d3c2b1a0@inbound.checkbox.site",
  "sent": {
    "at": 1793318400,
    "source": "bcc",
    "late": false,
    "provider_message_id": "re_9f8e7d6c",
    "evidence": null
  },
  "missed": {
    "at": 1793318400,
    "reason": "Subscriber already left; not sent."
  },
  "created": 1793318400,
  "updated": 1793318400,
  "next_action": {
    "type": "verify_domain",
    "message": "Verify your site domain to turn on live mode.",
    "operation_id": "createDomainVerification",
    "mcp_tool": "call_api",
    "endpoint": "POST /v1/sites/{site}/domain_verification",
    "url": "https://checkbox.site/docs/concepts/activation#verify"
  }
}

Mark a due notice as sent

POST /v1/notices/{notice}/sent

Records that you sent this notice (optionally with your email provider's message id). Idempotent: a notice already marked sent is returned unchanged. A send before window_start is refused (it does not satisfy the law: send again inside the window). An overdue notice marked sent stops failing its check and is recorded as late; a sent_at earlier than when it became overdue is refused (only the BCC copy can prove an in-window send). Canceled and missed notices cannot be marked. BCC'ing the notice's bcc address does the same with the email itself as evidence.

Scope notices:write · Idempotent (send Idempotency-Key) · Operation markNoticeSent

SDK: checkbox.notices.markSent() (Node) · checkbox.notices.mark_sent() (Python). MCP / agents: operation markNoticeSent.

Parameters

ParameterInTypeDescription
notice requiredpathstringUnique identifier of the due notice (ntd_…).

Body

FieldTypeDescription
provider_message_idstringYour email provider's message id (Resend / Postmark / SES), stored as proof.
sent_atintegerWhen it was sent (unix seconds). Default: now. A time after the window closed records the notice as sent late; a time before window_start is refused (too early to count), and so is a time before an overdue notice became overdue.

Returns

Returns a DueNotice object.

Errors use the standard envelope with a stable code and, where useful, next_action.

curl https://app.checkbox.site/v1/notices/ntd_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b/sent \
  -u "$CHECKBOX_SECRET_KEY:" \
  -H "Content-Type: application/json" \
  -d '{}'
Response
{
  "id": "ntd_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "object": "due_notice",
  "livemode": false,
  "site": "site_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "kind": "trial_ending",
  "label": "Trial-ending reminder",
  "required": true,
  "status": "due",
  "subscriber": {
    "platform": "stripe",
    "subscription": "sub_1QabcXYZ",
    "customer": "cus_Qabc123",
    "name": "Alex Rivera",
    "email_masked": "a•••@example.com",
    "region": "US-CA"
  },
  "window_start": 1793318400,
  "window_end": 1793318400,
  "send_at": 1793318400,
  "send_date": "2026-11-12",
  "anchor": 1793318400,
  "jurisdictions": [
    "US-CA",
    "US-FED"
  ],
  "requirement_ids": [
    "US-CA.17602.a.3"
  ],
  "citations": [
    "Cal. Bus. & Prof. Code § 17602(a)(3)"
  ],
  "email": {
    "template_id": "trial_ending.v1",
    "subject": "Your Acme Coffee free trial ends on November 19, 2026",
    "text": "Hi Alex,\n\nYour free trial ends on November 19, 2026. …",
    "html": "<div …><p …>Hi Alex,</p>…</div>",
    "missing_fields": []
  },
  "bcc": "k_3f9a1c2e+trial_ending.9f8e7d6c5b4a39281706f5e4d3c2b1a0@inbound.checkbox.site",
  "sent": {
    "at": 1793318400,
    "source": "bcc",
    "late": false,
    "provider_message_id": "re_9f8e7d6c",
    "evidence": null
  },
  "missed": {
    "at": 1793318400,
    "reason": "Subscriber already left; not sent."
  },
  "created": 1793318400,
  "updated": 1793318400,
  "next_action": {
    "type": "verify_domain",
    "message": "Verify your site domain to turn on live mode.",
    "operation_id": "createDomainVerification",
    "mcp_tool": "call_api",
    "endpoint": "POST /v1/sites/{site}/domain_verification",
    "url": "https://checkbox.site/docs/concepts/activation#verify"
  }
}

Record a due notice as missed

POST /v1/notices/{notice}/missed

Records that an overdue notice was not sent and will not be (for example, the subscriber already left). Nothing is attested as sent: the notice moves to missed and stops failing its compliance check, and the record stays in the history. Only overdue notices can be recorded as missed. Idempotent.

Scope notices:write · Idempotent (send Idempotency-Key) · Operation markNoticeMissed

SDK: checkbox.notices.markMissed() (Node) · checkbox.notices.mark_missed() (Python). MCP / agents: operation markNoticeMissed.

Parameters

ParameterInTypeDescription
notice requiredpathstringUnique identifier of the due notice (ntd_…).

Body

FieldTypeDescription
reasonstringWhy it was not sent (kept with the record).

Returns

Returns a DueNotice object.

Errors use the standard envelope with a stable code and, where useful, next_action.

curl https://app.checkbox.site/v1/notices/ntd_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b/missed \
  -u "$CHECKBOX_SECRET_KEY:" \
  -H "Content-Type: application/json" \
  -d '{}'
Response
{
  "id": "ntd_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "object": "due_notice",
  "livemode": false,
  "site": "site_3f9a1c2e7b4d4e0f9a8b7c6d5e4f3a2b",
  "kind": "trial_ending",
  "label": "Trial-ending reminder",
  "required": true,
  "status": "due",
  "subscriber": {
    "platform": "stripe",
    "subscription": "sub_1QabcXYZ",
    "customer": "cus_Qabc123",
    "name": "Alex Rivera",
    "email_masked": "a•••@example.com",
    "region": "US-CA"
  },
  "window_start": 1793318400,
  "window_end": 1793318400,
  "send_at": 1793318400,
  "send_date": "2026-11-12",
  "anchor": 1793318400,
  "jurisdictions": [
    "US-CA",
    "US-FED"
  ],
  "requirement_ids": [
    "US-CA.17602.a.3"
  ],
  "citations": [
    "Cal. Bus. & Prof. Code § 17602(a)(3)"
  ],
  "email": {
    "template_id": "trial_ending.v1",
    "subject": "Your Acme Coffee free trial ends on November 19, 2026",
    "text": "Hi Alex,\n\nYour free trial ends on November 19, 2026. …",
    "html": "<div …><p …>Hi Alex,</p>…</div>",
    "missing_fields": []
  },
  "bcc": "k_3f9a1c2e+trial_ending.9f8e7d6c5b4a39281706f5e4d3c2b1a0@inbound.checkbox.site",
  "sent": {
    "at": 1793318400,
    "source": "bcc",
    "late": false,
    "provider_message_id": "re_9f8e7d6c",
    "evidence": null
  },
  "missed": {
    "at": 1793318400,
    "reason": "Subscriber already left; not sent."
  },
  "created": 1793318400,
  "updated": 1793318400,
  "next_action": {
    "type": "verify_domain",
    "message": "Verify your site domain to turn on live mode.",
    "operation_id": "createDomainVerification",
    "mcp_tool": "call_api",
    "endpoint": "POST /v1/sites/{site}/domain_verification",
    "url": "https://checkbox.site/docs/concepts/activation#verify"
  }
}

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.