Text4Profit REST API

Create campaigns and send texts from Zapier, your CRM, or any HTTP client. After you create a campaign, pick either step 3 or step 4 — not both.

1 Generate a key

Create an API key on this page. Copy it once. Send it as Authorization: Bearer ezpz_… or X-Api-Key.

2 Create a campaign

POST /api/v1/campaigns with a name and message. It starts paused. Default window is 08:00–21:00 today in the campaign timezone, all days.

Then choose either step 3 or step 4

3 Add contacts (schedule)

POST /api/v1/campaigns/:id/contacts with start: true. Those people go on the campaign schedule (default 08:00–21:00).

4 Send now

POST /api/v1/campaigns/:id/send with contacts or phones. Skip step 3. Sends immediately. Same daily, monthly, and credit limits. Campaign can stay off.

1. API key

Checking login…

Treat the key like a password. Anyone with it can create campaigns and import contacts on your account.

Loading…

Current key prefix

New API key — copy it now; it is not shown again unless you generate another.

Base URL

Test response

2. Create a campaign

Required: campaignName. Optional: outboundText, timezone, dailyLimit, schedule, autoReplyEnabled, autoReplyText, filterKeywords, positiveKeywords. If you omit schedule, sending is set to today, 08:00–21:00 in the campaign timezone, all 7 days. Do not put a raw website or phone number in the message — use [domain] and [callback] placeholders.

The response includes uniqueId (for example CMP-AB12CD) and id (Mongo). Use either on later calls. Create stays paused. Next, use either step 3 or step 4 — schedule (3) or send immediately (4).

3. Add contacts (schedule)

Either this step or step 4 — not both. Use this when people should go out on the campaign schedule (default 08:00–21:00). Each row needs a phone. Optional: firstName, lastName, email, city, state, address, zip, tags. New rows are stored as pending. Pass start: true to turn the campaign on so the hopper sends them in the window. Or add them first, then PATCH { "status": true }. Duplicates of the same phone are skipped unless updateExisting is true. Account DNC numbers are skipped. Max 500 per request. For an immediate text, skip this step and use 4. Send now.

List campaigns

4. Send now

Either this step or step 3 — not both. Immediate send. Skip step 3 — include phones on this request. The campaign can stay off. Only these people are queued. Send-now uses the same daily limit, monthly limit, and purchase-credit balance as scheduled campaign sends. If the account is at its cap, the request is rejected (or only the remaining room is queued). Uses campaign outboundText unless you pass message.

5. Endpoint reference

All authenticated routes require the Bearer token or X-Api-Key header. :id may be a campaign Mongo id or CMP-… unique id.

MethodPathWhat it does
GET/api/v1Public catalog (no auth) — docs URL and endpoint list
GET/api/v1/meConfirm the key works; returns account id and email
GET/api/v1/campaignsList campaigns (limit, offset)
POST/api/v1/campaignsCreate a campaign
GET/api/v1/campaigns/:idGet one campaign
PATCH/api/v1/campaigns/:idUpdate name, message, schedule, daily limit, auto-reply, or status/start to send or pause
POST/api/v1/campaigns/:id/contactsAdd contacts to the campaign schedule; start: true turns the campaign on
POST/api/v1/campaigns/:id/sendSend now — include phones here; campaign can stay off
GET/api/v1/campaigns/:id/contactsList contacts (limit, offset)
GET/api/v1/campaigns/:id/contacts/statsContact totals

CRM webhook (Integrations)

To push contacts from Zapier or a CRM when an event happens, you can still use Integrations → Event pull (POST /api/integrations/hooks/event-pull) with the webhook secret. That path is for event-driven imports. This REST API is for scripts that also create campaigns and manage lists.

Open Integrations