API documentation

One endpoint. You POST your business details, it returns a live HTTPS site with a privacy policy, terms and SMS opt-in disclosure — the URLs you paste into PrivacyPolicyUrl and TermsAndConditionsUrl when registering your 10DLC campaign.

Free. No account. Built for agencies and developers registering many sub-accounts.

Quick start

1. Generate your key right here. 2. POST your business details. 3. Use the returned URLs in your campaign registration.

Your API key

Free. Stored only in your browser — 1 site every 5 minutes.

curl -X POST https://a2pfree.com/api/clinics \
  -H "content-type: application/json" \
  -H "x-api-key: YOUR_KEY" \
  -d '{
    "businessName": "BRIGHT SMILE DENTAL LLC",
    "ein": "12-3456789",
    "address": {
      "street": "123 Main St Suite 200",
      "city": "Austin",
      "state": "TX",
      "postalCode": "78704"
    },
    "phone": "+1 (512) 555-0142",
    "description": "Family dental clinic offering cleanings, whitening and implants."
  }'

Endpoint

POSThttps://a2pfree.com/api/clinics

Authentication

Send your key in the x-api-key header. The key is generated on demand, stored only in your browser, and tied to nothing personal — if you lose it, generate another.

Rate limits

  • With a key: 1 site every 5 minutes.
  • Without a key: 5 sites per hour, per IP.
  • Exceeding it returns 429 with a retry-after header.

Request body

JSON. Use your legal business name exactly as it appears on your IRS CP-575 / EIN letter.

FieldTypeDescription
businessNamestringrequiredLegal name, matching your EIN records character for character.
address.statestringrequired2-letter US state code (e.g. TX). Used for the subdomain and the site's location.
address.streetstringoptionalStreet line, shown on the site and in the legal pages.
address.citystringoptionalCity.
address.postalCodestringoptionalZIP code.
einstringoptionalEmployer Identification Number. Shown nowhere publicly — used only for consistency across the generated copy.
phonestringoptionalBusiness phone in E.164 or US format. Appears on the contact section.
descriptionstringoptionalOne or two sentences about the business. Improves the generated copy; a generic default is used if omitted.

Response

200 OK — the site is live immediately, with SSL.

{
  "ok": true,
  "subdomain": "brightsmiledentaltx.a2pfree.com",
  "url": "https://brightsmiledentaltx.a2pfree.com",
  "expiresAt": 1786244528401,
  "expiresInDays": 15
}

The URLs you need for campaign registration:

PrivacyPolicyUrl        https://brightsmiledentaltx.a2pfree.com/privacy
TermsAndConditionsUrl   https://brightsmiledentaltx.a2pfree.com/terms
SMS disclosure          https://brightsmiledentaltx.a2pfree.com/sms
Website                 https://brightsmiledentaltx.a2pfree.com

Errors

StatusMeaning
400businessName and address.state are required, or the JSON is malformed.
401The x-api-key you sent doesn't exist. Generate a new one.
409That business name + state already has a live site. Vary the name slightly.
429Rate limited. Check the retry-after header (seconds).
500Something failed on our side — safe to retry.

More examples

JavaScript

const res = await fetch("https://a2pfree.com/api/clinics", {
  method: "POST",
  headers: { "content-type": "application/json", "x-api-key": KEY },
  body: JSON.stringify({
    businessName: "BRIGHT SMILE DENTAL LLC",
    address: { state: "TX", city: "Austin" },
  }),
});
const { url, expiresInDays } = await res.json();

Python

import requests

r = requests.post(
    "https://a2pfree.com/api/clinics",
    headers={"x-api-key": KEY},
    json={"businessName": "BRIGHT SMILE DENTAL LLC",
          "address": {"state": "TX", "city": "Austin"}},
)
print(r.json()["url"])

Site lifetime & data

Free to use, and it stays free. If it unblocked a registration for you: