Create a contact
curl --request POST \ --url https://api.sipstack.com/api/v2/contacts \ --header 'Content-Type: application/json' \ --header 'x-api-key: <x-api-key>' \ --data '{ "phoneNumber": "+14165550100", "firstName": "Jordan", "lastName": "Lee", "email": "jordan.lee@example.com", "tags": [ "newsletter" ], "consentStatus": "express", "consentMethod": "web_form", "consentDate": "2026-09-01" }'import requests
url = "https://api.sipstack.com/api/v2/contacts"
payload = { "phoneNumber": "+14165550100", "firstName": "Jordan", "lastName": "Lee", "email": "jordan.lee@example.com", "tags": ["newsletter"], "consentStatus": "express", "consentMethod": "web_form", "consentDate": "2026-09-01"}headers = { "x-api-key": "<x-api-key>", "Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.json())const url = 'https://api.sipstack.com/api/v2/contacts';const options = { method: 'POST', headers: {'x-api-key': '<x-api-key>', 'Content-Type': 'application/json'}, body: '{"phoneNumber":"+14165550100","firstName":"Jordan","lastName":"Lee","email":"jordan.lee@example.com","tags":["newsletter"],"consentStatus":"express","consentMethod":"web_form","consentDate":"2026-09-01"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}import axios from 'axios';
const options = { method: 'POST', url: 'https://api.sipstack.com/api/v2/contacts', headers: {'x-api-key': '<x-api-key>', 'Content-Type': 'application/json'}, data: { phoneNumber: '+14165550100', firstName: 'Jordan', lastName: 'Lee', email: 'jordan.lee@example.com', tags: ['newsletter'], consentStatus: 'express', consentMethod: 'web_form', consentDate: '2026-09-01' }};
try { const { data } = await axios.request(options); console.log(data);} catch (error) { console.error(error);}Creates a contact in your organization. Create-only — this endpoint
never updates an existing contact. The phone number is normalized to
E.164 before the uniqueness check; a live contact with the same number
returns 409. Requires the contacts:write scope.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”object
Contact phone number — normalized to E.164 (a leading 1 is added to 10-digit numbers).
object
Consent to text. Defaults to implied. Marketing campaigns send to
US numbers only with express consent. Every express contact
gets a consent history entry recording the method, the date and
the API key that set it.
How express consent was obtained. Used only with consentStatus: express
(ignored otherwise). Optional: if you set express without it, the
consent history records the method as api (declared by caller).
Send it whenever you know it — a stated method is stronger evidence.
Free-text detail on how consent was obtained (longer text is cut at
500 characters). Required when consentMethod is other.
When express consent was obtained: YYYY-MM-DD or a full ISO 8601
timestamp. Cannot be in the future (a YYYY-MM-DD that is today in
any timezone is accepted). Defaults to now. Used only with
consentStatus: express.
Examples
A contact with express consent
{ "phoneNumber": "+14165550100", "firstName": "Jordan", "lastName": "Lee", "email": "jordan.lee@example.com", "tags": [ "newsletter" ], "consentStatus": "express", "consentMethod": "web_form", "consentDate": "2026-09-01"}A contact with implied consent (the default)
{ "phoneNumber": "+14165550100", "firstName": "Jordan", "lastName": "Lee"}Responses
Section titled “ Responses ”Contact created. data is the compact Contact subset
(id, uuid, phone_number, names, email, tags, consent_status,
consent_date, created_at) — not the full record; read it back via
GET /api/v2/contacts/{id} for the complete contact.
object
A contact record. POST /api/v2/contacts returns the compact subset
(id, uuid, phone_number, names, email, tags, consent_status,
consent_date, created_at);
the list/get/update endpoints return the full record below.
object
object
How the contact was created (e.g. api).
Example
{ "data": { "phone_number": "+14165550100", "consent_status": "implied" }}Phone number missing or invalid, or invalid consent fields: an
unknown consentStatus or consentMethod, consentMethod: other
without consentMethodNote, or an unreadable or future consentDate.
Inline error shape used by the messaging API and management endpoints.
object
Example
{ "success": false, "error": "Recipient phone number (to) is required"}Missing or invalid API key.
Inline error shape used by the messaging API and management endpoints.
object
Example
{ "success": false, "error": "Recipient phone number (to) is required"}API access is not enabled on your plan.
Inline error shape used by the messaging API and management endpoints.
object
Example
{ "success": false, "error": "Recipient phone number (to) is required"}Organization not provisioned for contacts.
Inline error shape used by the messaging API and management endpoints.
object
Example
{ "success": false, "error": "Recipient phone number (to) is required"}A contact with this phone number already exists (including a soft-deleted one holding the key).
Inline error shape used by the messaging API and management endpoints.
object
Example
{ "success": false, "error": "Recipient phone number (to) is required"}Internal error.
Inline error shape used by the messaging API and management endpoints.
object
Example
{ "success": false, "error": "Recipient phone number (to) is required"}