· By smsroute editorial · 8 min read

smsroute delivers SMS to any Mexican mobile number from $0.015 per message, LFPDPPP-compliant and in the post-2019 10-digit format (no "1" after +52). Routes cover Telcel (58% share), AT&T Mexico, Movistar Mexico, and the Altán Redes wholesale MVNO with 98.9% delivery success and 204 ms median latency. Pay in Bitcoin, USDT, Ethereum, Litecoin, Monero, or Solana. No KYC, no RFC required at signup.

The 2019 "Lose-the-1" Change — Why Old Integrations Still Break on Mexican Numbers

On 3 August 2019 the Instituto Federal de Telecomunicaciones (IFT) activated a numbering-plan amendment (announced 16 July 2019 as press communication 34/2019) that retired the mobile "1" prefix that had differentiated Mexican cellphones from landlines for decades. Before the change, a Mexico City mobile dialed from abroad was +52 1 55 xxxx xxxx; after the change, the same number dials as +52 55 xxxx xxxx. Mobile and landline now share an indistinguishable 10-digit format after the +52 country code. The reform was branded "Marcación Unificada" and was driven by the IFT's finding that the split dialing was confusing consumers and fragmenting carrier routing tables.

Six years later, this remains the single most common integration bug we see on inbound Mexico traffic. The reason is depressingly simple: tutorials, Stack Overflow answers, sample-code gists, and open-source libraries written before August 2019 all hard-coded the "1" into number-normalization helpers. Those helpers still ship, still get forked, still get copy-pasted into new projects in 2026 — and the person copy-pasting has no reason to suspect the example is obsolete. The bug then presents in two distinct failure modes.

Silent drop on Telcel. Telcel is the strictest of the four operators on international inbound format and now drops messages addressed to +521 55 xxxx xxxx silently at the MSC layer. The delivery receipt reports submitted to the aggregator but never transitions to delivered — the message simply evaporates. Because Telcel carries 58% of Mexican subscribers, a team that does not notice the "1" bug sees a 58% delivery rate and spends weeks blaming their aggregator.

Intermittent delivery on AT&T / Movistar. AT&T Mexico and Movistar are more tolerant of the legacy format and still accept +521 inbound on some routes but not others, producing the worst possible debugging experience: the bug is reproducible on some numbers and not others, appears to work in manual tests, and fails at scale. If your success rate looks like 85-90% with no obvious pattern, check the normalizer.

The migration pattern. The canonical fix, in whichever language your normalizer is written in, is to strip exactly one leading "1" after a "+52" country code prefix, but only when the remaining subscriber portion is 10 digits. In Python:

import re

def normalize_mx(e164: str) -> str:
    """Strip the legacy '1' after +52 per IFT 2019 plan."""
    m = re.match(r"^\+521(\d{10})$", e164)
    return f"+52{m.group(1)}" if m else e164

assert normalize_mx("+5215512345678") == "+525512345678"
assert normalize_mx("+525512345678") == "+525512345678"

smsroute's API also auto-normalizes this at the edge — if you send a +521-prefixed destination we rewrite to +52 before handing off to the operator — but we still recommend fixing it upstream so your logs and analytics stay clean.

Mobile operators in Mexico

Mexico's mobile market is dominated by Telcel — América Móvil's flagship, owned by Carlos Slim's holding group — with a 58% subscriber share that has been remarkably stable for a decade. Three other operators split the remaining 42%:

Telcel. 58% share. National 4G/5G footprint, including coverage in remote and rural areas no other operator reaches. Strictest on inbound SMS format (drops +521 legacy). Sender-ID rewriting is aggressive — unregistered alphanumeric senders frequently get rewritten to a generic long code. Median latency from our North American POP: 185 ms. Telcel's dominant share means "delivery to Mexico" is effectively synonymous with "delivery to Telcel" for most use cases.

AT&T Mexico. 23% share. AT&T Inc. acquired Iusacell and Nextel Mexico in 2015 and rolled them into a single network. AT&T Mexico is the most tolerant of the four operators on inbound SMS quirks — accepts most format variants, rarely rewrites sender IDs, low spam filtering. Median latency 198 ms. Strong urban-Northern coverage; weaker south of Mexico City.

Movistar Mexico. 13% share. Telefónica-owned; in 2019 Telefónica announced a gradual withdrawal from Mexico retail but continues to operate via a network-sharing deal with AT&T Mexico. A Movistar SIM in 2026 is functionally roaming on AT&T's radio layer for most purposes. Median latency 215 ms (slight penalty from the network-sharing hop).

Altán Redes. 6% wholesale-MVNO share. Altán is a public-private LTE network funded in part by the federal government under the "Red Compartida" initiative; it does not sell directly to consumers but wholesales capacity to MVNOs including Bait (Walmart), Freedom Pop, Diri, and Virgin Mobile Mexico. Altán's A2P routing is slower because of the extra wholesale hop — median 260 ms. Delivery success is lower as well, around 97.2%, because some MVNOs downstream apply their own filtering.

LFPDPPP + REPEP — Mexico's Consent Framework and Do-Not-Call Registry

Mexico's data-protection and anti-spam regime rests on two statutes and one public registry, all enforced by different agencies with overlapping but distinct jurisdiction.

LFPDPPP — the Ley Federal de Protección de Datos Personales en Posesión de los Particulares, enacted 2010 — is Mexico's analog to the EU GDPR. It applies to any private-sector entity that holds personal data about individuals physically in Mexico, irrespective of where the company is incorporated. For SMS senders the core obligations are: publish a privacy notice (aviso de privacidad) before or at the moment of data collection, obtain express consent for marketing uses of the phone number, honor ARCO rights (Access, Rectification, Cancellation, Opposition) with a documented response process, and appoint a data-protection officer if your processing meets scale thresholds. Historical enforcement was by INAI (Instituto Nacional de Transparencia, Acceso a la Información y Protección de Datos Personales), with fines ranging from 100 to 320,000 days of UMA — at the 2025 UMA value of MXN 113.14/day, that translates to an effective range of roughly MXN 11,314 to MXN 36.2 million per enforcement action. Note that the March 2025 reform to the LFPDPPP framework transferred primary enforcement authority from INAI to the Secretariat of Anti-Corruption; treat agency references as evolving and check Secretaría Anticorrupción guidance alongside INAI archives. Refresh the UMA value annually from INEGI before citing dollar equivalents.

REPEP — the Registro Público para Evitar Publicidad — is Mexico's Do-Not-Call and Do-Not-SMS registry, operated by PROFECO (the federal consumer-protection agency) under the Ley Federal de Protección al Consumidor. Consumers register their mobile number on REPEP and, by law, companies must scrub marketing contact lists against REPEP before each marketing campaign. Transactional SMS (OTP, delivery notifications, account alerts to existing customers) is exempt. The registry refreshes monthly; caching more than 30 days is non-compliant.

PROFECO enforcement is administrative and iterative. First offenses typically trigger warnings and corrective-action orders. Repeat offenders or large-scale violators face fines under LFPC Article 128 that at 2025 UMA levels (MXN 113.14/day) work out to roughly MXN 5,657 to MXN 2.83 million per enforcement proceeding. High-profile PROFECO actions in the past three years have targeted lenders sending collection SMS without disclosure, marketplaces sending promotional SMS to REPEP-listed numbers, and international platforms failing to provide Spanish-language privacy notices. If you send marketing SMS to Mexico at any meaningful scale without a REPEP scrub workflow, PROFECO is a tail-risk that materializes.

How to send SMS to Mexico in 3 steps

Step 1 — Create an account

Sign up at smsroute.cc. No RFC required, no business filings, no ID verification at signup. You reach the dashboard in about 30 seconds.

Step 2 — Top up with crypto

Minimum $5. USDT TRC-20 is fastest (~1 minute to credit); Bitcoin, Ethereum, Litecoin, Monero, and Solana also work.

Step 3 — Send the message in +52 format (no 1!)

Use the post-2019 10-digit format. A Mexico City mobile is +52 55 xxxx xxxx, a Guadalajara mobile is +52 33 xxxx xxxx, a Monterrey mobile is +52 81 xxxx xxxx.

Common mistake. Writing +5215512345678 (with a 1 after +52). That is the pre-August-2019 format. Telcel drops it silently; AT&T and Movistar accept it intermittently. Strip the "1" in your normalizer before submit. Unlike Argentina (which takes a "9" after +54 for mobile) or Brazil (which takes a "9" at the start of the subscriber number), Mexico mobiles take no magic digit at all — just +52 followed by the 10-digit number.

Sender ID rules and REPEP integration

Alphanumeric sender IDs are supported across all four Mexican operators — up to 11 characters, Latin alphabet, no spaces. No IFT pre-registration is required, but register your sender with smsroute in advance to avoid Telcel's rewriting behavior. Dynamic numeric long codes are auto-provisioned for two-way traffic.

For marketing SMS, the compliance-critical step is scrubbing against REPEP before each send. Treat REPEP as an API lookup, not a static list — PROFECO expects fresh-within-30-days scrubbing. The smsroute API exposes a pre-send scrub endpoint:

Compliance note. Always include a Spanish-language opt-out keyword (BAJA, CANCELAR, or STOP) on the last line of marketing SMS. LFPDPPP requires the ARCO-rights opposition channel to be at least as easy as the consent channel, and an SMS opt-out keyword is the industry-standard discharge of that obligation for SMS senders.

Latency and success rate per operator

From our North American POP, median round-trip latency and rolling 90-day delivery success:

OperatorShareMedian latencyP95 latencyDelivery success
Telcel58%185 ms460 ms99.2%
AT&T Mexico23%198 ms495 ms99.0%
Movistar Mexico13%215 ms570 ms98.5%
Altán / MVNOs6%260 ms720 ms97.2%
Blended100%204 ms530 ms98.9%

Failures concentrate on powered-off handsets (operator buffers and retries for 48 hours, after which the message is marked undelivered and refunded), on Altán-hosted MVNO downstream filtering, and on messages with UCS-2 content — Spanish accented characters (á, é, í, ñ, ó, ú) push a message over the 160-character GSM-7 boundary into 70-character UCS-2 segments, which some operators rate-limit more aggressively.

Pricing vs competitors

Provider Price per SMS (USD) vs. smsroute
smsroute $0.0150 best price
Twilio$0.0242baseline
Sinch$0.023737% more
Vonage$0.021831% more
Plivo$0.019824% more

smsroute is approximately 42% below Twilio and 30-35% below other tier-1 aggregators on Mexican routes. The margin reflects direct interconnect with Telcel and AT&T Mexico for the bulk of our Mexico traffic, with Movistar and Altán-hosted MVNOs reached via a single upstream partner. Prices include all operator surcharges; REPEP scrubbing is a separate $0.0005/lookup add-on if you use our endpoint.

Frequently asked questions

Why doesn't my code send to Mexican numbers?

In 9 out of 10 cases, the reason is a hard-coded '+521' prefix inherited from a pre-2019 library or tutorial. IFT retired the mobile '1' in August 2019, so Mexican mobiles are now +52 followed by the 10-digit number (e.g. +52 55 1234 5678 for Mexico City). Sending to +521 55... works sporadically because some operators still accept the legacy format on inbound international routes, but Telcel in particular now silently drops it. Fix: strip the '1' after the +52 country code in your number normalizer.

When did Mexico drop the '1' after +52?

The Instituto Federal de Telecomunicaciones (IFT) announced the numbering-plan change on 16 July 2019 (press release 34/2019), effective 3 August 2019, unifying mobile and landline dialing to plain 10 digits after the +52 country code. Before the change, mobile numbers required a '1' (so Mexico City mobiles dialed as +52 1 55 xxxx xxxx); after the change they dial as +52 55 xxxx xxxx. The reform was part of IFT's 'Marcación Unificada' project intended to simplify dialing and eliminate the mobile/fixed distinction at the prefix layer.

Is REPEP scrubbing mandatory for marketing SMS?

Yes, for any telemarketing or advertising SMS sent to Mexican consumers, PROFECO requires scrubbing against the Registro Público para Evitar Publicidad (REPEP) before dispatch. Transactional SMS (OTP, account alerts, delivery notifications) is exempt. REPEP is operated by PROFECO and refreshed monthly. smsroute offers an optional pre-send REPEP scrub as a $0.0005/lookup add-on for customers who do not maintain their own REPEP cache.

What are PROFECO fines for unconsented marketing SMS?

PROFECO can issue administrative fines of 50 to 25,000 times the Unidad de Medida y Actualización (UMA). Current UMA values are published annually by INEGI — at 2025 levels (MXN 113.14 per day) the effective range is roughly MXN 5,657 to MXN 2.83 million per enforcement action. Check the current UMA at inegi.org.mx before citing dollar equivalents. Fines escalate with volume of messages, whether the sender is a repeat violator, and whether the sender scrubbed REPEP before dispatch. Data-protection enforcement runs parallel under LFPDPPP, with fines of 100 to 320,000 days of UMA for consent violations; note that a March 2025 reform transferred enforcement from INAI to the Secretariat of Anti-Corruption, so the regulator name in published guidance may be transitioning.

My number normalizer still inserts +521 — how do I debug this?

The +521 prefix is the legacy mobile indicator that IFT retired on 3 August 2019. Modern Mexican mobile numbers are plain +52 plus 10 digits, with no separating '1'. If your normalizer is still inserting it, the two most common causes are: (1) the libphonenumber version in your dependency graph is older than 8.10.22 (the release that dropped +521 emission for new formats — upgrade to a 2023+ build); (2) you have hard-coded a '1' concatenation in legacy code that predates the reform — search your codebase for the literal string '+521' and the regex \+52\s*1. Fix: strip the '1' between the +52 country code and the 10-digit body in your normalization step, then add a post-condition assertion that every 'to' parameter matches ^\+52\d{10}$ exactly. smsroute's API will accept and auto-correct most +521 inputs, but silent upstream normalization is fragile — fix it at the source.

What is 'Marcación Unificada' and why does it affect my international SMS routing?

Marcación Unificada (Unified Dialing) is the umbrella name IFT used for its 2019 reform unifying Mexican mobile and fixed dialing to a single 10-digit national number behind the +52 country code, retiring the 044/045 domestic prefixes for mobile calls and the old +521 international mobile indicator. For international SMS routing this matters because the operator lookup that routes your message to Telcel vs AT&T vs Movistar vs Altán uses the first three digits after +52 as an LRN/HLR hint, and that hint only works when the number is in post-2019 format. A +521 55 1234 5678 inbound from a US-based sender hits the Telcel gateway, which may accept it on a grandfathered international peering route, silently drop it on a newer one, or rewrite it into a variable-charge long-code path depending on which interconnect touches the message first. Senders who still see inconsistent Mexico deliverability almost always have a partial +521 contamination in one of their lead lists or ETL pipelines. The fix is end-to-end normalization to strict post-reform E.164 on ingress, not just at the send boundary.

Can I send SMS to Mexico without a business or Mexican tax ID?

Yes. smsroute accepts personal signups with email only — no RFC (Mexican tax ID), no business registration, no ID verification at account creation. Payment is crypto-only (Bitcoin, USDT, Ethereum, Litecoin, Monero, Solana) so you do need a crypto wallet to top up. For transactional SMS (OTP, account alerts) no additional filings are needed. For marketing SMS you are responsible for LFPDPPP consent and REPEP scrubbing regardless of signup path.

What's the difference between LFPDPPP and LFPDPPSO?

LFPDPPP (Ley Federal de Protección de Datos Personales en Posesión de los Particulares) governs personal data held by private parties — companies, sole proprietors, commercial entities — and is the law that applies to almost every commercial SMS sender. LFPDPPSO is the parallel 2017 statute covering public-sector data. For SMS-platform operators and marketers, LFPDPPP is the one you need: it requires express consent for marketing, a privacy notice (aviso de privacidad) at collection, and a documented ARCO rights process (Access, Rectification, Cancellation, Opposition).

Related pages

Related

Related

Features SMS API Pricing API Docs Blog

Sender ID rules and REPEP integration

Alphanumeric sender IDs are supported across all four Mexican operators — up to 11 characters, Latin alphabet, no spaces. No IFT pre-registration is required, but register your sender with smsroute in advance to avoid Telcel's rewriting behavior. Dynamic numeric long codes are auto-provisioned for two-way traffic.

For marketing SMS, the compliance-critical step is scrubbing against REPEP before each send. Treat REPEP as an API lookup, not a static list — PROFECO expects fresh-within-30-days scrubbing. The smsroute API exposes a pre-send scrub endpoint:

Compliance note. Always include a Spanish-language opt-out keyword (BAJA, CANCELAR, or STOP) on the last line of marketing SMS. LFPDPPP requires the ARCO-rights opposition channel to be at least as easy as the consent channel, and an SMS opt-out keyword is the industry-standard discharge of that obligation for SMS senders.

Latency and success rate per operator

From our North American POP, median round-trip latency and rolling 90-day delivery success:

OperatorShareMedian latencyP95 latencyDelivery success
Telcel58%185 ms460 ms99.2%
AT&T Mexico23%198 ms495 ms99.0%
Movistar Mexico13%215 ms570 ms98.5%
Altán / MVNOs6%260 ms720 ms97.2%
Blended100%204 ms530 ms98.9%

Failures concentrate on powered-off handsets (operator buffers and retries for 48 hours, after which the message is marked undelivered and refunded), on Altán-hosted MVNO downstream filtering, and on messages with UCS-2 content — Spanish accented characters (á, é, í, ñ, ó, ú) push a message over the 160-character GSM-7 boundary into 70-character UCS-2 segments, which some operators rate-limit more aggressively.

Pricing vs competitors

Provider Price per SMS (USD) vs. smsroute
smsroute $0.0150 best price
Twilio$0.0242baseline
Sinch$0.023737% more
Vonage$0.021831% more
Plivo$0.019824% more

smsroute is approximately 42% below Twilio and 30-35% below other tier-1 aggregators on Mexican routes. The margin reflects direct interconnect with Telcel and AT&T Mexico for the bulk of our Mexico traffic, with Movistar and Altán-hosted MVNOs reached via a single upstream partner. Prices include all operator surcharges; REPEP scrubbing is a separate $0.0005/lookup add-on if you use our endpoint.

Frequently asked questions

Why doesn't my code send to Mexican numbers?

In 9 out of 10 cases, the reason is a hard-coded '+521' prefix inherited from a pre-2019 library or tutorial. IFT retired the mobile '1' in August 2019, so Mexican mobiles are now +52 followed by the 10-digit number (e.g. +52 55 1234 5678 for Mexico City). Sending to +521 55... works sporadically because some operators still accept the legacy format on inbound international routes, but Telcel in particular now silently drops it. Fix: strip the '1' after the +52 country code in your number normalizer.

When did Mexico drop the '1' after +52?

The Instituto Federal de Telecomunicaciones (IFT) announced the numbering-plan change on 16 July 2019 (press release 34/2019), effective 3 August 2019, unifying mobile and landline dialing to plain 10 digits after the +52 country code. Before the change, mobile numbers required a '1' (so Mexico City mobiles dialed as +52 1 55 xxxx xxxx); after the change they dial as +52 55 xxxx xxxx. The reform was part of IFT's 'Marcación Unificada' project intended to simplify dialing and eliminate the mobile/fixed distinction at the prefix layer.

Is REPEP scrubbing mandatory for marketing SMS?

Yes, for any telemarketing or advertising SMS sent to Mexican consumers, PROFECO requires scrubbing against the Registro Público para Evitar Publicidad (REPEP) before dispatch. Transactional SMS (OTP, account alerts, delivery notifications) is exempt. REPEP is operated by PROFECO and refreshed monthly. smsroute offers an optional pre-send REPEP scrub as a $0.0005/lookup add-on for customers who do not maintain their own REPEP cache.

What are PROFECO fines for unconsented marketing SMS?

PROFECO can issue administrative fines of 50 to 25,000 times the Unidad de Medida y Actualización (UMA). Current UMA values are published annually by INEGI — at 2025 levels (MXN 113.14 per day) the effective range is roughly MXN 5,657 to MXN 2.83 million per enforcement action. Check the current UMA at inegi.org.mx before citing dollar equivalents. Fines escalate with volume of messages, whether the sender is a repeat violator, and whether the sender scrubbed REPEP before dispatch. Data-protection enforcement runs parallel under LFPDPPP, with fines of 100 to 320,000 days of UMA for consent violations; note that a March 2025 reform transferred enforcement from INAI to the Secretariat of Anti-Corruption, so the regulator name in published guidance may be transitioning.

My number normalizer still inserts +521 — how do I debug this?

The +521 prefix is the legacy mobile indicator that IFT retired on 3 August 2019. Modern Mexican mobile numbers are plain +52 plus 10 digits, with no separating '1'. If your normalizer is still inserting it, the two most common causes are: (1) the libphonenumber version in your dependency graph is older than 8.10.22 (the release that dropped +521 emission for new formats — upgrade to a 2023+ build); (2) you have hard-coded a '1' concatenation in legacy code that predates the reform — search your codebase for the literal string '+521' and the regex \+52\s*1. Fix: strip the '1' between the +52 country code and the 10-digit body in your normalization step, then add a post-condition assertion that every 'to' parameter matches ^\+52\d{10}$ exactly. smsroute's API will accept and auto-correct most +521 inputs, but silent upstream normalization is fragile — fix it at the source.

What is 'Marcación Unificada' and why does it affect my international SMS routing?

Marcación Unificada (Unified Dialing) is the umbrella name IFT used for its 2019 reform unifying Mexican mobile and fixed dialing to a single 10-digit national number behind the +52 country code, retiring the 044/045 domestic prefixes for mobile calls and the old +521 international mobile indicator. For international SMS routing this matters because the operator lookup that routes your message to Telcel vs AT&T vs Movistar vs Altán uses the first three digits after +52 as an LRN/HLR hint, and that hint only works when the number is in post-2019 format. A +521 55 1234 5678 inbound from a US-based sender hits the Telcel gateway, which may accept it on a grandfathered international peering route, silently drop it on a newer one, or rewrite it into a variable-charge long-code path depending on which interconnect touches the message first. Senders who still see inconsistent Mexico deliverability almost always have a partial +521 contamination in one of their lead lists or ETL pipelines. The fix is end-to-end normalization to strict post-reform E.164 on ingress, not just at the send boundary.

Can I send SMS to Mexico without a business or Mexican tax ID?

Yes. smsroute accepts personal signups with email only — no RFC (Mexican tax ID), no business registration, no ID verification at account creation. Payment is crypto-only (Bitcoin, USDT, Ethereum, Litecoin, Monero, Solana) so you do need a crypto wallet to top up. For transactional SMS (OTP, account alerts) no additional filings are needed. For marketing SMS you are responsible for LFPDPPP consent and REPEP scrubbing regardless of signup path.

What's the difference between LFPDPPP and LFPDPPSO?

LFPDPPP (Ley Federal de Protección de Datos Personales en Posesión de los Particulares) governs personal data held by private parties — companies, sole proprietors, commercial entities — and is the law that applies to almost every commercial SMS sender. LFPDPPSO is the parallel 2017 statute covering public-sector data. For SMS-platform operators and marketers, LFPDPPP is the one you need: it requires express consent for marketing, a privacy notice (aviso de privacidad) at collection, and a documented ARCO rights process (Access, Rectification, Cancellation, Opposition).

Related pages

Related

Related

Related

Features SMS API Pricing API Docs Blog
import fetch from "node-fetch";

const apiKey = process.env.SMSROUTE_API_KEY;

const res = await fetch("https://api.smsroute.cc/v1/messages", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    to: "+525551234567",
    from: "smsroute",
    text: "Your verification code is 384921",
  }),
});

console.log(await res.json());
import re

def normalize_mx(e164: str) -> str:
    """Strip the legacy '1' after +52 per IFT 2019 plan."""
    m = re.match(r"^\+521(\d{10})$", e164)
    return f"+52{m.group(1)}" if m else e164

assert normalize_mx("+5215512345678") == "+525512345678"
assert normalize_mx("+525512345678") == "+525512345678"
curl -X POST https://api.smsroute.cc/v1/messages \
  -H "Authorization: Bearer $SMSROUTE_API_KEY" \
  -d '{
    "to": "+525512345678",
    "from": "smsroute",
    "body": "Tu código de verificación es 384921"
  }'
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"
)

func main() {
    payload, _ := json.Marshal(map[string]string{
        "to":   "+525551234567",
        "from": "smsroute",
        "text": "Your verification code is 384921",
    })

    req, _ := http.NewRequest("POST",
        "https://api.smsroute.cc/v1/messages",
        bytes.NewBuffer(payload))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SMSROUTE_API_KEY"))
    req.Header.Set("Content-Type", "application/json")

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
<?php
$apiKey = getenv('SMSROUTE_API_KEY');

$payload = json_encode([
    'to'   => '+525551234567',
    'from' => 'smsroute',
    'text' => 'Your verification code is 384921',
], JSON_UNESCAPED_UNICODE);

$ch = curl_init('https://api.smsroute.cc/v1/messages');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => $payload,
]);

echo curl_exec($ch);
curl_close($ch);

Sender ID rules and REPEP integration

Alphanumeric sender IDs are supported across all four Mexican operators — up to 11 characters, Latin alphabet, no spaces. No IFT pre-registration is required, but register your sender with smsroute in advance to avoid Telcel's rewriting behavior. Dynamic numeric long codes are auto-provisioned for two-way traffic.

For marketing SMS, the compliance-critical step is scrubbing against REPEP before each send. Treat REPEP as an API lookup, not a static list — PROFECO expects fresh-within-30-days scrubbing. The smsroute API exposes a pre-send scrub endpoint:

Compliance note. Always include a Spanish-language opt-out keyword (BAJA, CANCELAR, or STOP) on the last line of marketing SMS. LFPDPPP requires the ARCO-rights opposition channel to be at least as easy as the consent channel, and an SMS opt-out keyword is the industry-standard discharge of that obligation for SMS senders.

Latency and success rate per operator

From our North American POP, median round-trip latency and rolling 90-day delivery success:

OperatorShareMedian latencyP95 latencyDelivery success
Telcel58%185 ms460 ms99.2%
AT&T Mexico23%198 ms495 ms99.0%
Movistar Mexico13%215 ms570 ms98.5%
Altán / MVNOs6%260 ms720 ms97.2%
Blended100%204 ms530 ms98.9%

Failures concentrate on powered-off handsets (operator buffers and retries for 48 hours, after which the message is marked undelivered and refunded), on Altán-hosted MVNO downstream filtering, and on messages with UCS-2 content — Spanish accented characters (á, é, í, ñ, ó, ú) push a message over the 160-character GSM-7 boundary into 70-character UCS-2 segments, which some operators rate-limit more aggressively.

Latency and success rate per operator

From our North American POP, median round-trip latency and rolling 90-day delivery success:

OperatorShareMedian latencyP95 latencyDelivery success
Telcel58%185 ms460 ms99.2%
AT&T Mexico23%198 ms495 ms99.0%
Movistar Mexico13%215 ms570 ms98.5%
Altán / MVNOs6%260 ms720 ms97.2%
Blended100%204 ms530 ms98.9%

Failures concentrate on powered-off handsets (operator buffers and retries for 48 hours, after which the message is marked undelivered and refunded), on Altán-hosted MVNO downstream filtering, and on messages with UCS-2 content — Spanish accented characters (á, é, í, ñ, ó, ú) push a message over the 160-character GSM-7 boundary into 70-character UCS-2 segments, which some operators rate-limit more aggressively.

Pricing vs competitors

Provider Price per SMS (USD) vs. smsroute
smsroute $0.0150 best price
Twilio$0.0242baseline
Sinch$0.023737% more
Vonage$0.021831% more
Plivo$0.019824% more

smsroute is approximately 42% below Twilio and 30-35% below other tier-1 aggregators on Mexican routes. The margin reflects direct interconnect with Telcel and AT&T Mexico for the bulk of our Mexico traffic, with Movistar and Altán-hosted MVNOs reached via a single upstream partner. Prices include all operator surcharges; REPEP scrubbing is a separate $0.0005/lookup add-on if you use our endpoint.

Related pages

Related

Related

Features SMS API Pricing API Docs Blog
import fetch from "node-fetch";

const apiKey = process.env.SMSROUTE_API_KEY;

const res = await fetch("https://api.smsroute.cc/v1/messages", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    to: "+525551234567",
    from: "smsroute",
    text: "Your verification code is 384921",
  }),
});

console.log(await res.json());
import re

def normalize_mx(e164: str) -> str:
    """Strip the legacy '1' after +52 per IFT 2019 plan."""
    m = re.match(r"^\+521(\d{10})$", e164)
    return f"+52{m.group(1)}" if m else e164

assert normalize_mx("+5215512345678") == "+525512345678"
assert normalize_mx("+525512345678") == "+525512345678"
curl -X POST https://api.smsroute.cc/v1/messages \
  -H "Authorization: Bearer $SMSROUTE_API_KEY" \
  -d '{
    "to": "+525512345678",
    "from": "smsroute",
    "body": "Tu código de verificación es 384921"
  }'
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"
)

func main() {
    payload, _ := json.Marshal(map[string]string{
        "to":   "+525551234567",
        "from": "smsroute",
        "text": "Your verification code is 384921",
    })

    req, _ := http.NewRequest("POST",
        "https://api.smsroute.cc/v1/messages",
        bytes.NewBuffer(payload))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SMSROUTE_API_KEY"))
    req.Header.Set("Content-Type", "application/json")

    resp, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
<?php
$apiKey = getenv('SMSROUTE_API_KEY');

$payload = json_encode([
    'to'   => '+525551234567',
    'from' => 'smsroute',
    'text' => 'Your verification code is 384921',
], JSON_UNESCAPED_UNICODE);

$ch = curl_init('https://api.smsroute.cc/v1/messages');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => $payload,
]);

echo curl_exec($ch);
curl_close($ch);

Sender ID rules and REPEP integration

Alphanumeric sender IDs are supported across all four Mexican operators — up to 11 characters, Latin alphabet, no spaces. No IFT pre-registration is required, but register your sender with smsroute in advance to avoid Telcel's rewriting behavior. Dynamic numeric long codes are auto-provisioned for two-way traffic.

For marketing SMS, the compliance-critical step is scrubbing against REPEP before each send. Treat REPEP as an API lookup, not a static list — PROFECO expects fresh-within-30-days scrubbing. The smsroute API exposes a pre-send scrub endpoint:

import os, requests

API = "https://api.smsroute.cc/v1"
HEAD = {"Authorization": f"Bearer {os.environ['SMSROUTE_API_KEY']}"}

numbers = ["+525512345678", "+523312345678", "+528112345678"]

# Scrub against REPEP before send (marketing only; skip for transactional)
resp = requests.post(f"{API}/mx/repep/scrub", headers=HEAD,
                     json={"numbers": numbers}).json()

sendable = [n for n in numbers if n not in resp["blocked"]]

for to in sendable:
    requests.post(f"{API}/messages", headers=HEAD, json={
        "to": to,
        "from": "MiMarca",
        "body": "Oferta: 20% hoy. Responde BAJA para darte de baja.",
    })
Compliance note. Always include a Spanish-language opt-out keyword (BAJA, CANCELAR, or STOP) on the last line of marketing SMS. LFPDPPP requires the ARCO-rights opposition channel to be at least as easy as the consent channel, and an SMS opt-out keyword is the industry-standard discharge of that obligation for SMS senders.

Latency and success rate per operator

From our North American POP, median round-trip latency and rolling 90-day delivery success:

OperatorShareMedian latencyP95 latencyDelivery success
Telcel58%185 ms460 ms99.2%
AT&T Mexico23%198 ms495 ms99.0%
Movistar Mexico13%215 ms570 ms98.5%
Altán / MVNOs6%260 ms720 ms97.2%
Blended100%204 ms530 ms98.9%

Failures concentrate on powered-off handsets (operator buffers and retries for 48 hours, after which the message is marked undelivered and refunded), on Altán-hosted MVNO downstream filtering, and on messages with UCS-2 content — Spanish accented characters (á, é, í, ñ, ó, ú) push a message over the 160-character GSM-7 boundary into 70-character UCS-2 segments, which some operators rate-limit more aggressively.

Pricing vs competitors

Provider Price per SMS (USD) vs. smsroute
smsroute $0.0150 best price
Twilio$0.0242baseline
Sinch$0.023737% more
Vonage$0.021831% more
Plivo$0.019824% more

smsroute is approximately 42% below Twilio and 30-35% below other tier-1 aggregators on Mexican routes. The margin reflects direct interconnect with Telcel and AT&T Mexico for the bulk of our Mexico traffic, with Movistar and Altán-hosted MVNOs reached via a single upstream partner. Prices include all operator surcharges; REPEP scrubbing is a separate $0.0005/lookup add-on if you use our endpoint.

Frequently asked questions

Why doesn't my code send to Mexican numbers?

In 9 out of 10 cases, the reason is a hard-coded '+521' prefix inherited from a pre-2019 library or tutorial. IFT retired the mobile '1' in August 2019, so Mexican mobiles are now +52 followed by the 10-digit number (e.g. +52 55 1234 5678 for Mexico City). Sending to +521 55... works sporadically because some operators still accept the legacy format on inbound international routes, but Telcel in particular now silently drops it. Fix: strip the '1' after the +52 country code in your number normalizer.

When did Mexico drop the '1' after +52?

The Instituto Federal de Telecomunicaciones (IFT) announced the numbering-plan change on 16 July 2019 (press release 34/2019), effective 3 August 2019, unifying mobile and landline dialing to plain 10 digits after the +52 country code. Before the change, mobile numbers required a '1' (so Mexico City mobiles dialed as +52 1 55 xxxx xxxx); after the change they dial as +52 55 xxxx xxxx. The reform was part of IFT's 'Marcación Unificada' project intended to simplify dialing and eliminate the mobile/fixed distinction at the prefix layer.

Is REPEP scrubbing mandatory for marketing SMS?

Yes, for any telemarketing or advertising SMS sent to Mexican consumers, PROFECO requires scrubbing against the Registro Público para Evitar Publicidad (REPEP) before dispatch. Transactional SMS (OTP, account alerts, delivery notifications) is exempt. REPEP is operated by PROFECO and refreshed monthly. smsroute offers an optional pre-send REPEP scrub as a $0.0005/lookup add-on for customers who do not maintain their own REPEP cache.

What are PROFECO fines for unconsented marketing SMS?

PROFECO can issue administrative fines of 50 to 25,000 times the Unidad de Medida y Actualización (UMA). Current UMA values are published annually by INEGI — at 2025 levels (MXN 113.14 per day) the effective range is roughly MXN 5,657 to MXN 2.83 million per enforcement action. Check the current UMA at inegi.org.mx before citing dollar equivalents. Fines escalate with volume of messages, whether the sender is a repeat violator, and whether the sender scrubbed REPEP before dispatch. Data-protection enforcement runs parallel under LFPDPPP, with fines of 100 to 320,000 days of UMA for consent violations; note that a March 2025 reform transferred enforcement from INAI to the Secretariat of Anti-Corruption, so the regulator name in published guidance may be transitioning.

My number normalizer still inserts +521 — how do I debug this?

The +521 prefix is the legacy mobile indicator that IFT retired on 3 August 2019. Modern Mexican mobile numbers are plain +52 plus 10 digits, with no separating '1'. If your normalizer is still inserting it, the two most common causes are: (1) the libphonenumber version in your dependency graph is older than 8.10.22 (the release that dropped +521 emission for new formats — upgrade to a 2023+ build); (2) you have hard-coded a '1' concatenation in legacy code that predates the reform — search your codebase for the literal string '+521' and the regex \+52\s*1. Fix: strip the '1' between the +52 country code and the 10-digit body in your normalization step, then add a post-condition assertion that every 'to' parameter matches ^\+52\d{10}$ exactly. smsroute's API will accept and auto-correct most +521 inputs, but silent upstream normalization is fragile — fix it at the source.

What is 'Marcación Unificada' and why does it affect my international SMS routing?

Marcación Unificada (Unified Dialing) is the umbrella name IFT used for its 2019 reform unifying Mexican mobile and fixed dialing to a single 10-digit national number behind the +52 country code, retiring the 044/045 domestic prefixes for mobile calls and the old +521 international mobile indicator. For international SMS routing this matters because the operator lookup that routes your message to Telcel vs AT&T vs Movistar vs Altán uses the first three digits after +52 as an LRN/HLR hint, and that hint only works when the number is in post-2019 format. A +521 55 1234 5678 inbound from a US-based sender hits the Telcel gateway, which may accept it on a grandfathered international peering route, silently drop it on a newer one, or rewrite it into a variable-charge long-code path depending on which interconnect touches the message first. Senders who still see inconsistent Mexico deliverability almost always have a partial +521 contamination in one of their lead lists or ETL pipelines. The fix is end-to-end normalization to strict post-reform E.164 on ingress, not just at the send boundary.

Can I send SMS to Mexico without a business or Mexican tax ID?

Yes. smsroute accepts personal signups with email only — no RFC (Mexican tax ID), no business registration, no ID verification at account creation. Payment is crypto-only (Bitcoin, USDT, Ethereum, Litecoin, Monero, Solana) so you do need a crypto wallet to top up. For transactional SMS (OTP, account alerts) no additional filings are needed. For marketing SMS you are responsible for LFPDPPP consent and REPEP scrubbing regardless of signup path.

What's the difference between LFPDPPP and LFPDPPSO?

LFPDPPP (Ley Federal de Protección de Datos Personales en Posesión de los Particulares) governs personal data held by private parties — companies, sole proprietors, commercial entities — and is the law that applies to almost every commercial SMS sender. LFPDPPSO is the parallel 2017 statute covering public-sector data. For SMS-platform operators and marketers, LFPDPPP is the one you need: it requires express consent for marketing, a privacy notice (aviso de privacidad) at collection, and a documented ARCO rights process (Access, Rectification, Cancellation, Opposition).

Related pages

Related

Related

Related

Sender ID rules and REPEP integration

Alphanumeric sender IDs are supported across all four Mexican operators — up to 11 characters, Latin alphabet, no spaces. No IFT pre-registration is required, but register your sender with smsroute in advance to avoid Telcel's rewriting behavior. Dynamic numeric long codes are auto-provisioned for two-way traffic.

For marketing SMS, the compliance-critical step is scrubbing against REPEP before each send. Treat REPEP as an API lookup, not a static list — PROFECO expects fresh-within-30-days scrubbing. The smsroute API exposes a pre-send scrub endpoint:

import os, requests

API = "https://api.smsroute.cc/v1"
HEAD = {"Authorization": f"Bearer {os.environ['SMSROUTE_API_KEY']}"}

numbers = ["+525512345678", "+523312345678", "+528112345678"]

# Scrub against REPEP before send (marketing only; skip for transactional)
resp = requests.post(f"{API}/mx/repep/scrub", headers=HEAD,
                     json={"numbers": numbers}).json()

sendable = [n for n in numbers if n not in resp["blocked"]]

for to in sendable:
    requests.post(f"{API}/messages", headers=HEAD, json={
        "to": to,
        "from": "MiMarca",
        "body": "Oferta: 20% hoy. Responde BAJA para darte de baja.",
    })
Compliance note. Always include a Spanish-language opt-out keyword (BAJA, CANCELAR, or STOP) on the last line of marketing SMS. LFPDPPP requires the ARCO-rights opposition channel to be at least as easy as the consent channel, and an SMS opt-out keyword is the industry-standard discharge of that obligation for SMS senders.

Pricing vs competitors

Provider Price per SMS (USD) vs. smsroute
smsroute $0.0150 best price
Twilio$0.0242baseline
Sinch$0.023737% more
Vonage$0.021831% more
Plivo$0.019824% more

smsroute is approximately 42% below Twilio and 30-35% below other tier-1 aggregators on Mexican routes. The margin reflects direct interconnect with Telcel and AT&T Mexico for the bulk of our Mexico traffic, with Movistar and Altán-hosted MVNOs reached via a single upstream partner. Prices include all operator surcharges; REPEP scrubbing is a separate $0.0005/lookup add-on if you use our endpoint.

Frequently asked questions

Why doesn't my code send to Mexican numbers?

In 9 out of 10 cases, the reason is a hard-coded '+521' prefix inherited from a pre-2019 library or tutorial. IFT retired the mobile '1' in August 2019, so Mexican mobiles are now +52 followed by the 10-digit number (e.g. +52 55 1234 5678 for Mexico City). Sending to +521 55... works sporadically because some operators still accept the legacy format on inbound international routes, but Telcel in particular now silently drops it. Fix: strip the '1' after the +52 country code in your number normalizer.

When did Mexico drop the '1' after +52?

The Instituto Federal de Telecomunicaciones (IFT) announced the numbering-plan change on 16 July 2019 (press release 34/2019), effective 3 August 2019, unifying mobile and landline dialing to plain 10 digits after the +52 country code. Before the change, mobile numbers required a '1' (so Mexico City mobiles dialed as +52 1 55 xxxx xxxx); after the change they dial as +52 55 xxxx xxxx. The reform was part of IFT's 'Marcación Unificada' project intended to simplify dialing and eliminate the mobile/fixed distinction at the prefix layer.

Is REPEP scrubbing mandatory for marketing SMS?

Yes, for any telemarketing or advertising SMS sent to Mexican consumers, PROFECO requires scrubbing against the Registro Público para Evitar Publicidad (REPEP) before dispatch. Transactional SMS (OTP, account alerts, delivery notifications) is exempt. REPEP is operated by PROFECO and refreshed monthly. smsroute offers an optional pre-send REPEP scrub as a $0.0005/lookup add-on for customers who do not maintain their own REPEP cache.

What are PROFECO fines for unconsented marketing SMS?

PROFECO can issue administrative fines of 50 to 25,000 times the Unidad de Medida y Actualización (UMA). Current UMA values are published annually by INEGI — at 2025 levels (MXN 113.14 per day) the effective range is roughly MXN 5,657 to MXN 2.83 million per enforcement action. Check the current UMA at inegi.org.mx before citing dollar equivalents. Fines escalate with volume of messages, whether the sender is a repeat violator, and whether the sender scrubbed REPEP before dispatch. Data-protection enforcement runs parallel under LFPDPPP, with fines of 100 to 320,000 days of UMA for consent violations; note that a March 2025 reform transferred enforcement from INAI to the Secretariat of Anti-Corruption, so the regulator name in published guidance may be transitioning.

My number normalizer still inserts +521 — how do I debug this?

The +521 prefix is the legacy mobile indicator that IFT retired on 3 August 2019. Modern Mexican mobile numbers are plain +52 plus 10 digits, with no separating '1'. If your normalizer is still inserting it, the two most common causes are: (1) the libphonenumber version in your dependency graph is older than 8.10.22 (the release that dropped +521 emission for new formats — upgrade to a 2023+ build); (2) you have hard-coded a '1' concatenation in legacy code that predates the reform — search your codebase for the literal string '+521' and the regex \+52\s*1. Fix: strip the '1' between the +52 country code and the 10-digit body in your normalization step, then add a post-condition assertion that every 'to' parameter matches ^\+52\d{10}$ exactly. smsroute's API will accept and auto-correct most +521 inputs, but silent upstream normalization is fragile — fix it at the source.

What is 'Marcación Unificada' and why does it affect my international SMS routing?

Marcación Unificada (Unified Dialing) is the umbrella name IFT used for its 2019 reform unifying Mexican mobile and fixed dialing to a single 10-digit national number behind the +52 country code, retiring the 044/045 domestic prefixes for mobile calls and the old +521 international mobile indicator. For international SMS routing this matters because the operator lookup that routes your message to Telcel vs AT&T vs Movistar vs Altán uses the first three digits after +52 as an LRN/HLR hint, and that hint only works when the number is in post-2019 format. A +521 55 1234 5678 inbound from a US-based sender hits the Telcel gateway, which may accept it on a grandfathered international peering route, silently drop it on a newer one, or rewrite it into a variable-charge long-code path depending on which interconnect touches the message first. Senders who still see inconsistent Mexico deliverability almost always have a partial +521 contamination in one of their lead lists or ETL pipelines. The fix is end-to-end normalization to strict post-reform E.164 on ingress, not just at the send boundary.

Can I send SMS to Mexico without a business or Mexican tax ID?

Yes. smsroute accepts personal signups with email only — no RFC (Mexican tax ID), no business registration, no ID verification at account creation. Payment is crypto-only (Bitcoin, USDT, Ethereum, Litecoin, Monero, Solana) so you do need a crypto wallet to top up. For transactional SMS (OTP, account alerts) no additional filings are needed. For marketing SMS you are responsible for LFPDPPP consent and REPEP scrubbing regardless of signup path.

What's the difference between LFPDPPP and LFPDPPSO?

LFPDPPP (Ley Federal de Protección de Datos Personales en Posesión de los Particulares) governs personal data held by private parties — companies, sole proprietors, commercial entities — and is the law that applies to almost every commercial SMS sender. LFPDPPSO is the parallel 2017 statute covering public-sector data. For SMS-platform operators and marketers, LFPDPPP is the one you need: it requires express consent for marketing, a privacy notice (aviso de privacidad) at collection, and a documented ARCO rights process (Access, Rectification, Cancellation, Opposition).

Frequently asked questions

Why doesn't my code send to Mexican numbers?

In 9 out of 10 cases, the reason is a hard-coded '+521' prefix inherited from a pre-2019 library or tutorial. IFT retired the mobile '1' in August 2019, so Mexican mobiles are now +52 followed by the 10-digit number (e.g. +52 55 1234 5678 for Mexico City). Sending to +521 55... works sporadically because some operators still accept the legacy format on inbound international routes, but Telcel in particular now silently drops it. Fix: strip the '1' after the +52 country code in your number normalizer.

When did Mexico drop the '1' after +52?

The Instituto Federal de Telecomunicaciones (IFT) announced the numbering-plan change on 16 July 2019 (press release 34/2019), effective 3 August 2019, unifying mobile and landline dialing to plain 10 digits after the +52 country code. Before the change, mobile numbers required a '1' (so Mexico City mobiles dialed as +52 1 55 xxxx xxxx); after the change they dial as +52 55 xxxx xxxx. The reform was part of IFT's 'Marcación Unificada' project intended to simplify dialing and eliminate the mobile/fixed distinction at the prefix layer.

Is REPEP scrubbing mandatory for marketing SMS?

Yes, for any telemarketing or advertising SMS sent to Mexican consumers, PROFECO requires scrubbing against the Registro Público para Evitar Publicidad (REPEP) before dispatch. Transactional SMS (OTP, account alerts, delivery notifications) is exempt. REPEP is operated by PROFECO and refreshed monthly. smsroute offers an optional pre-send REPEP scrub as a $0.0005/lookup add-on for customers who do not maintain their own REPEP cache.

What are PROFECO fines for unconsented marketing SMS?

PROFECO can issue administrative fines of 50 to 25,000 times the Unidad de Medida y Actualización (UMA). Current UMA values are published annually by INEGI — at 2025 levels (MXN 113.14 per day) the effective range is roughly MXN 5,657 to MXN 2.83 million per enforcement action. Check the current UMA at inegi.org.mx before citing dollar equivalents. Fines escalate with volume of messages, whether the sender is a repeat violator, and whether the sender scrubbed REPEP before dispatch. Data-protection enforcement runs parallel under LFPDPPP, with fines of 100 to 320,000 days of UMA for consent violations; note that a March 2025 reform transferred enforcement from INAI to the Secretariat of Anti-Corruption, so the regulator name in published guidance may be transitioning.

My number normalizer still inserts +521 — how do I debug this?

The +521 prefix is the legacy mobile indicator that IFT retired on 3 August 2019. Modern Mexican mobile numbers are plain +52 plus 10 digits, with no separating '1'. If your normalizer is still inserting it, the two most common causes are: (1) the libphonenumber version in your dependency graph is older than 8.10.22 (the release that dropped +521 emission for new formats — upgrade to a 2023+ build); (2) you have hard-coded a '1' concatenation in legacy code that predates the reform — search your codebase for the literal string '+521' and the regex \+52\s*1. Fix: strip the '1' between the +52 country code and the 10-digit body in your normalization step, then add a post-condition assertion that every 'to' parameter matches ^\+52\d{10}$ exactly. smsroute's API will accept and auto-correct most +521 inputs, but silent upstream normalization is fragile — fix it at the source.

What is 'Marcación Unificada' and why does it affect my international SMS routing?

Marcación Unificada (Unified Dialing) is the umbrella name IFT used for its 2019 reform unifying Mexican mobile and fixed dialing to a single 10-digit national number behind the +52 country code, retiring the 044/045 domestic prefixes for mobile calls and the old +521 international mobile indicator. For international SMS routing this matters because the operator lookup that routes your message to Telcel vs AT&T vs Movistar vs Altán uses the first three digits after +52 as an LRN/HLR hint, and that hint only works when the number is in post-2019 format. A +521 55 1234 5678 inbound from a US-based sender hits the Telcel gateway, which may accept it on a grandfathered international peering route, silently drop it on a newer one, or rewrite it into a variable-charge long-code path depending on which interconnect touches the message first. Senders who still see inconsistent Mexico deliverability almost always have a partial +521 contamination in one of their lead lists or ETL pipelines. The fix is end-to-end normalization to strict post-reform E.164 on ingress, not just at the send boundary.

Can I send SMS to Mexico without a business or Mexican tax ID?

Yes. smsroute accepts personal signups with email only — no RFC (Mexican tax ID), no business registration, no ID verification at account creation. Payment is crypto-only (Bitcoin, USDT, Ethereum, Litecoin, Monero, Solana) so you do need a crypto wallet to top up. For transactional SMS (OTP, account alerts) no additional filings are needed. For marketing SMS you are responsible for LFPDPPP consent and REPEP scrubbing regardless of signup path.

What's the difference between LFPDPPP and LFPDPPSO?

LFPDPPP (Ley Federal de Protección de Datos Personales en Posesión de los Particulares) governs personal data held by private parties — companies, sole proprietors, commercial entities — and is the law that applies to almost every commercial SMS sender. LFPDPPSO is the parallel 2017 statute covering public-sector data. For SMS-platform operators and marketers, LFPDPPP is the one you need: it requires express consent for marketing, a privacy notice (aviso de privacidad) at collection, and a documented ARCO rights process (Access, Rectification, Cancellation, Opposition).

Related pages

Related

Related

Related

Related