Skip to main content

Troubleshoot Mexico NOM-184 consent gate 422 rejects

Mexico’s NOM-184-SCFI regulation requires explicit, time-stamped consent for every promotional A2P SMS sent to a Mexican subscriber. Orbit’s Mexico consent gate runs before the send is dispatched and rejects a violation with 422 MESSAGING_MX_NOM184_CONSENT_MISSING. Because the reject fires pre-dispatch, the message never leaves Orbit, no downstream carrier sees it, and no wallet deduction happens — a rejected send costs nothing, but a blind retry re-burns the same reject. The gate is a tenant-owned control: it runs only on Mexico-bound destinations and only when your organization has opted in via the regional send-gates toggle (see Gate scope). When enabled, each Mexico-bound promotional send checks your consent records for the recipient — an opted-in record stamped with nom184 lets the send through; anything else is refused.

Symptom: a 422 on a Mexico-bound send

A send to a Mexican destination (+52…) returns HTTP 422:
The reject means your consent records carry no opted-in NOM-184 consent for the recipient’s phone number. The gate resolves the recipient by phone number (E.164), so a campaign send that carries no contact id is still matched against the same records.

Symptom → cause

Record explicit NOM-184 consent on each Mexican recipient before you send. Two surfaces write the same records:
  • APIPOST /compliance/consent with the SMS channel, the NOM-184 consent type, and the evidence fields that make the record defensible (what the recipient agreed to, the disclosure version, the lawful basis):
  • Dashboard — open the contact and use Contacts → Consent to record the same opt-in with the NOM-184 consent type.
Both surfaces stamp the record with the consent timestamp, channel, state, and source. Once the record exists and reads opted_in, retry the send — the same request body now passes. Verify the state first with GET /compliance/consent/lookup?identifier=%2B525512345678&channel=sms if a retry still 422s; the full field contract is in Consent Management & Receipts.

Transactional sends

Verification codes, account alerts, and other strictly transactional messages are not “promotional A2P SMS” under NOM-184-SCFI. Flag those sends with metadata.nom184_exempt=true on the message request and the gate skips them. Use the flag only where it accurately describes the traffic — every exemption is captured in your audit log, and applying it to promotional content undermines the legal position the gate exists to protect.

What NOT to do

  • Do not blanket-add MX NOM-184 consent to non-promotional traffic. Consent records are legal declarations; stamping transactional-only recipients with a promotional consent you never collected creates a false audit trail and expands your regulatory exposure. Exempt transactional traffic with metadata.nom184_exempt=true instead.
  • Do not import a consented list without the timestamps and evidence. A consent record you cannot tie to a time, a purpose, and a disclosure version does not survive an audit. Record purpose, consent_text_version, and consent_proof_url on every grant.
  • Do not retry the identical request in a loop after recording consent elsewhere than against the contact the gate resolved — the gate matches by phone number, so record consent on the number you are actually sending to.
  • Do not disable the MX gate to work around the 422. The toggle is your opt-in, but Mexican carriers and the regulator enforce NOM-184 regardless — a gate-disabled send that lacks consent shifts the violation from a clean API reject to carrier-side enforcement and possible fines.

Gate scope: the MX toggle

The Mexico gate guards the organization settings key:
  • Path: regional_send_gates.MX.enabled
  • Default: off — Mexico-bound sends are not gate-checked until you opt in.
If you see the 422, the toggle is on in your organization. Scope it to your production organization and keep a dedicated sandbox organization with the key off so test traffic skips the gate.

When to escalate

Open a support ticket when any of these are true:
  • The 422 persists after GET /compliance/consent/lookup returns opted_in for the recipient on the sms channel.
  • A 422 rejection produced a wallet deduction (rejections are pre-dispatch and must be charge-free).
  • You need bulk consent recording — importing a large consented list is a contact import plus per-recipient consent write; support can advise on throughput.
Include the recipient’s E.164 number, the consent_type you recorded, and the request id from the 422 response.