TCPA Consent-Record Defense Runbook
When a recipient disputes consent, the strongest response is a dated chain of records rather than a single screenshot. This runbook shows how to assemble the tenant-owned evidence of an inbound opt-in: the consent row, the event that recorded it, the tenant audit entry, the suppression state, and the language the recipient saw. Keep the original API responses, request timestamps, export parameters, and hash-verification results together. Do not edit an export in place. If you need to redact a copy for a recipient, preserve the unredacted tenant copy and record who made the redacted copy and why.1. When the burden lands on you
A TCPA complaint or demand letter often makes the consent record the dispositive evidence. Start this runbook when the claim says that:- the recipient never opted in, or the opt-in was not express or written;
- consent was obtained for a different sender, product, purpose, or channel;
- the number was reassigned, the form was completed by somebody else, or the recipient could not have seen the notice at the asserted time;
- the sender continued after a revocation, or treated an SMS revocation as unrelated to voice; or
- the campaign’s registration and opt-in language do not match the traffic that reached the recipient.
opted_in lookup can hide an earlier revoke and re-grant; an active suppression
row can prove a later no-send control but not the original grant. Pull the
history and the bounded exports so the timeline remains visible.
This is a control-usage runbook for tenant operators. Preserve the demand
letter, identify the disputed address and UTC window, and involve counsel before
responding to a legal request.
2. Build the evidentiary chain
Assemble the links below in chronological order. Each link answers a different question; do not substitute one surface for another.
The consent history is the timeline witness: it shows grants, revocations, and
later re-permission without rewriting the original event. The suppression
ledger is the send-control witness: it shows the address fence and its scope.
The audit export is the integrity witness for the actions that Orbit recorded.
Capture context and the opt-in vocabulary
source, purpose, consent_text_version, and consent_proof_url are part of
the consent record when your capture flow supplied them. ip_address is
available for web-captured consent. User-agent and other capture details are
available only when your own form or integration sent them in the supported
proof or metadata fields; do not infer a missing value. A missing field is a
limitation to disclose, not a reason to reconstruct the record.
Keep the exact opt-in text and versioned notice from the form, landing page, or
preference flow that called the API. The consent row’s consent_text_version
should point your reviewer to that tenant-owned artifact.
3. Worked example: subpoena for +1555XXXXXXX
Assume a subpoena identifies +1555XXXXXXX and asks for records from
2026-04-01 through 2026-04-30 UTC. Replace the placeholder with the full
E.164 number in your private shell; do not place a redacted number in an API
request.
Set the common values first:
Step 1: Read the current record and complete history
Start with the point lookup, then pull the full cross-channel history. Save the raw responses before interpreting them. The lookup is a current-state view; the history is the timeline needed for discovery.next_cursor is non-null, request another history page with the same
identifier and cursor, and retain every page. Do not treat unknown as proof
that an earlier row never existed.
Step 2: Export the consent rows for the address and window
The export is scoped bycontact_id, not by phone identifier. Read
contact_id from the lookup response, then export all channels and states for
the bounded created_at window. If the lookup has no contact_id, export the
window with the narrowest available channel filter and document that limitation
for counsel; never guess a contact ID.
truncated and count in the JSON envelope. If truncated is true,
pull consecutive narrower windows until each response is complete. The export
is bounded by created_at; the history response remains the source for the
full grant/revoke sequence.
Step 3: Export the tenant audit window and verify it
Queue the audit export for the subpoena window. Include the surrounding UTC days if the request asks for the event that created the grant or the later suppression change. Poll until the job iscomplete, download inside the
signed-URL lifetime, and preserve the job response alongside the bundle.
complete, download its download_url, and
then verify the same job:
Step 4: Project the suppression ledger for the address
The suppression export is tenant-wide and supports channel, status, and time filters rather than an address parameter. Request the full relevant ledger slice, preserve the raw file, and project the matching address locally. Usestatus=all so a later revocation does not hide the state that existed in the
requested window.
truncated before relying on the projection. If it is true, repeat the
export over smaller consecutive windows and combine the matching rows. Record
the export filters and the time you ran the projection; a point-in-time
historical state cannot be recreated if the tenant did not retain the relevant
export.
Step 5: Package and label the chain
Put these artifacts in one tenant-controlled evidence store:- the consent lookup and every consent-history page;
- the consent export and its filters/truncation result;
- the audit job, downloaded bundle, and chain-verification response;
- the raw suppression export and the address projection;
- the original HTTP request/response metadata and the exact opt-in text
identified by
consent_text_version; and - a manifest with the disputed number, UTC window, retrieval timestamps, operator, and any missing fields or redactions.
4. Carrier-side corroboration
The consent chain answers how your tenant captured permission. Add the carrier context that shows what traffic the permission covered:- 10DLC sender and campaign record: the brand and campaign compliance profiles live under 10DLC brand and campaign compliance profiles. Pull the campaign profile and preserve its status, approved brand reference, use case, message-flow description, sample messages, and HELP/STOP responses. The campaign profile’s message-flow and consent-language fields are the tenant-owned record of what you submitted for the 10DLC campaign.
- Sender registration: where the traffic used a market-specific sender ID, preserve the tenant’s registration record from Sender-ID Registration, including the sender, country, status, document references, and provider registration reference.
- Opt-in vocabulary: preserve the exact form, prompt, checkbox copy, and
versioned notice used by your capture surface. For a double opt-in flow,
include the prompt and recipient confirmation as well as the confirmed
consent row; a pending handshake is not a consent grant. The
consent_text_versionfield is the join from the ledger to your stored copy.
5. Limitations and tenant-owned posture
- This is not legal advice. Counsel decides what TCPA or state-law standard applies, what to produce, and whether the assembled records satisfy it.
- Consent rows are tenant data. Access is limited to owner/admin surfaces, and exports contain recipient identifiers. Redact only a working copy; keep the original, the redaction log, and the reason for each redaction.
- No retroactive evidence repair. Do not edit a consent row, invent a missing IP address or user-agent, or re-record a grant to make an old event look newer. A later write is a new event and does not repair the historical chain.
- Exports have limits. Consent and suppression exports cap at 50,000 rows and report truncation. Audit download URLs expire after seven days. Narrow windows, retain the raw responses, and queue a fresh export when a URL expires.
- A current state is not historical proof. Use
/history, bounded exports, and the audit chain together. A suppression row proves the ledger state and scope recorded by Orbit; it does not prove the recipient’s original consent. - Tenant-owned controls stay tenant-owned. Orbit provides the API, ledger, audit trail, and carrier-profile surfaces. You choose the capture flow, keep the opt-in copy and proof artifacts, configure suppression, and retain the evidence pack.
Related
- Consent Management & Receipts — Consent API fields, lookup, history, and proof-of-record export.
- Export Consent & Suppression Records — export schemas, filters, truncation, and suppression projections.
- Audit log export and chain verification — queue, download, and verify the tenant audit bundle.
- TCPA Evidence Pack in the Binder — outbound posture evidence for quiet hours, DNC, and send gates.
- 10DLC brand and campaign compliance profiles — sender registration and campaign language records.