
SMS Reminder API Documentation
Complete API reference for adding contacts and managing SMS reminder campaigns programmatically.
Quick Start
Get started with the Remindlo API in 3 steps:
- Get your API key from Dashboard → Settings → API Keys
- List your campaigns to get campaign IDs
- Add contacts and enroll them in campaigns
# Example: Add a contact
curl -X POST "https://api.remindlo.co.uk/v1/contacts" \
-H "x-api-key: sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"phone_e164": "+447912345678",
"first_name": "John",
"marketing_consent": true
}'
Authentication
All API requests require an API key passed in the x-api-key header:
x-api-key: sk_live_your_key_here
Important: Keep your API key secure. Never expose it in client-side code or public repositories.
Base URL
https://api.remindlo.co.uk/v1
Endpoints
GET /v1/campaigns
List all available SMS campaigns for your account.
curl -X GET "https://api.remindlo.co.uk/v1/campaigns" \
-H "x-api-key: sk_live_xxx"
Response:
{
"campaigns": [
{
"id": "uuid",
"name": "Appointment Reminder",
"type": "recurring",
"status": "running"
}
]
}
POST /v1/contacts
Create or update a contact. If a contact with the same phone or email exists, it will be updated.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| phone_e164 | string | * | Phone in E.164 format (e.g., +447912345678) |
| string | * | Email address | |
| first_name | string | Contact's first name | |
| last_name | string | Contact's last name | |
| marketing_consent | boolean | Whether contact agreed to receive messages | |
| next_due_at | string | Next appointment date (ISO 8601) | |
| last_service_at | string | Last service date (ISO 8601) | |
| note | string | Notes about the contact | |
| tags | string[] | Tags for categorization | |
| custom_fields | object | Custom data as JSON | |
| campaign_ids | string[] | Campaign IDs to auto-enroll |
* At least one of phone_e164 or email is required.
curl -X POST "https://api.remindlo.co.uk/v1/contacts" \
-H "x-api-key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"phone_e164": "+447912345678",
"first_name": "John",
"last_name": "Smith",
"marketing_consent": true,
"next_due_at": "2025-03-15",
"campaign_ids": ["campaign-uuid"]
}'
Response:
{
"success": true,
"contact_id": "uuid",
"action": "created",
"contact": {
"id": "uuid",
"first_name": "John",
"last_name": "Smith",
"phone_e164": "+447912345678",
"marketing_consent": true,
"next_due_at": "2025-03-15"
},
"enrollments": [
{ "campaign_id": "campaign-uuid", "status": "enrolled" }
]
}
GET /v1/contacts
List contacts with filtering and pagination.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| limit | number | Max results (default 50, max 100) |
| offset | number | Skip first N results |
| search | string | Search in name, phone, email |
| has_phone | boolean | Only contacts with phone |
| marketing_consent | boolean | Filter by consent |
| next_due_before | string | Due date before (ISO 8601) |
| next_due_after | string | Due date after (ISO 8601) |
| sort_by | string | created_at, updated_at, next_due_at, first_name |
| sort_order | string | asc or desc |
curl -X GET "https://api.remindlo.co.uk/v1/contacts?limit=10&search=john" \
-H "x-api-key: sk_live_xxx"
GET /v1/contacts/:id
Get a single contact by ID, phone, or email.
# By ID
curl -X GET "https://api.remindlo.co.uk/v1/contacts/uuid" \
-H "x-api-key: sk_live_xxx"
# By phone
curl -X GET "https://api.remindlo.co.uk/v1/contacts?phone=+447912345678" \
-H "x-api-key: sk_live_xxx"
Error Handling
All errors return a consistent JSON format:
{
"success": false,
"error": {
"code": "INVALID_PHONE_FORMAT",
"message": "Phone number must be in E.164 format",
"details": {
"field": "phone_e164",
"value": "07912345678",
"suggestion": "Use format +447912345678 for UK numbers"
}
}
}
Error Codes
| HTTP | Code | Description |
|---|---|---|
| 400 | INVALID_PHONE_FORMAT | Phone not in E.164 format |
| 400 | INVALID_EMAIL_FORMAT | Invalid email address |
| 400 | MISSING_IDENTIFIER | No phone or email provided |
| 401 | INVALID_API_KEY | Missing or invalid API key |
| 401 | API_KEY_EXPIRED | API key has expired |
| 404 | CONTACT_NOT_FOUND | Contact does not exist |
| 404 | CAMPAIGN_NOT_FOUND | Campaign does not exist |
| 500 | INTERNAL_ERROR | Server error |
Use Cases
AI Assistant Integration
Perfect for AI assistants (Claude, ChatGPT) to manage contacts via chat:
User: "Add John Smith, phone 07912345678, to the birthday campaign"
AI: [calls GET /v1/campaigns to find "Birthday" campaign]
AI: [calls POST /v1/contacts with campaign_ids]
AI: "Done! John Smith has been added and enrolled in the Birthday campaign."
CRM Integration
Sync contacts from your CRM system automatically when appointments are booked.
Zapier/Make Automation
Connect Remindlo to 5000+ apps using webhook integrations.
Code Examples
JavaScript / Node.js
const response = await fetch('https://api.remindlo.co.uk/v1/contacts', {
method: 'POST',
headers: {
'x-api-key': 'sk_live_xxx',
'Content-Type': 'application/json'
},
body: JSON.stringify({
phone_e164: '+447912345678',
first_name: 'John',
marketing_consent: true
})
});
const data = await response.json();
console.log(data.contact_id);
Python
import requests
response = requests.post(
'https://api.remindlo.co.uk/v1/contacts',
headers={'x-api-key': 'sk_live_xxx'},
json={
'phone_e164': '+447912345678',
'first_name': 'John',
'marketing_consent': True
}
)
print(response.json()['contact_id'])
PHP
$ch = curl_init('https://api.remindlo.co.uk/v1/contacts');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-api-key: sk_live_xxx',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode([
'phone_e164' => '+447912345678',
'first_name' => 'John',
'marketing_consent' => true
])
]);
$response = json_decode(curl_exec($ch), true);
echo $response['contact_id'];
Need Help?
Contact us at [email protected] for API support.