imisofts Public API
Free and useful APIs for growth, ops, and automation teams worldwide.
🚀 Quick Start
Get a free API key and make your first request in under 60 seconds.
🌍 Global Scale
Region-aware endpoints that work anywhere, not limited to one country.
🔒 Safe by Design
Bearer tokens, signed webhooks, and data stays in your accounts.
Quickstart
Get up and running in 3 simple steps.
Step 1: Get your free API key
Sign up with just your email. No credit card required.
Get Free API KeyStep 2: Make your first request
Try normalizing a phone number with our API:
curl -X POST https://api.imisofts.com/v1/phone/normalize \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"raw": "+1 (415) 555-2671",
"default_region": "US",
"whatsapp": true
}'
const response = await fetch('https://api.imisofts.com/v1/phone/normalize', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
raw: '+1 (415) 555-2671',
default_region: 'US',
whatsapp: true
})
});
const data = await response.json();
console.log(data);
import requests
response = requests.post(
'https://api.imisofts.com/v1/phone/normalize',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'raw': '+1 (415) 555-2671',
'default_region': 'US',
'whatsapp': true
}
)
print(response.json())
Step 3: Get the response
You'll receive a normalized phone number in multiple formats:
{
"e164": "+14155552671",
"international": "+1 415 555 2671",
"national": "(415) 555-2671",
"country_code": "US",
"is_valid": true,
"whatsapp_compatible": true
}
Authentication
All API requests require a Bearer token in the Authorization header.
Example Request
GET /v1/whatsapp/locales HTTP/1.1
Host: api.imisofts.com
Authorization: Bearer YOUR_API_KEY
401 Unauthorized Response
{
"error": {
"code": "invalid_token",
"message": "The provided API key is invalid or expired.",
"request_id": "req_abc123"
}
}
Errors
All errors follow a consistent JSON envelope structure.
Error Response Format
{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests. See X-RateLimit-Remaining.",
"request_id": "req_abc123"
}
}
Common Error Codes
| Status | Code | Description |
|---|---|---|
| 400 | invalid_request |
Missing or invalid parameters |
| 401 | invalid_token |
Invalid or expired API key |
| 429 | rate_limit_exceeded |
Too many requests |
| 500 | internal_error |
Something went wrong on our end |
Rate Limits
Free tier includes generous limits for testing and production use.
60
Requests per minute
50,000
Requests per month
Response Headers
| Header | Description |
|---|---|
X-RateLimit-Limit |
Maximum requests per minute |
X-RateLimit-Remaining |
Requests remaining in current window |
Retry-After |
Seconds to wait before retrying (429 only) |
Webhooks
Receive real-time notifications when events occur.
Signature Verification
All webhook requests include a signature header for verification:
X-Imisofts-Signature
Retry Policy
Exponential backoff up to 6 attempts with idempotency keys.
Sample Webhook Payload
{
"event": "tracking.updated",
"data": {
"carrier": "dhl",
"tracking_id": "JD014600006543210123",
"status": "delivered",
"occurred_at": "2025-08-28T10:05:00Z"
},
"timestamp": "2025-08-28T10:06:00Z",
"idempotency_key": "evt_abc123"
}
SDKs and Tools
Official SDKs and tools to get you started quickly.
API Playground
Test API endpoints with live or mock responses.
// Response will appear here
// cURL command will appear here
API Reference
Complete documentation for all available endpoints.
Build a canonical campaign URL with UTMs
Returns a URL with validated UTM parameters and a canonical order. Useful for GA4 and ad platforms.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| base_url | string | Yes | The destination URL |
| source | string | Yes | Campaign source (e.g., google, facebook) |
| medium | string | Yes | Campaign medium (e.g., cpc, email) |
| campaign | string | Yes | Campaign name |
| term | string | No | Campaign term (for paid search) |
| content | string | No | Campaign content (for A/B testing) |
{
"base_url": "https://example.com",
"source": "google",
"medium": "cpc",
"campaign": "spring-sale"
}
{
"url": "https://example.com?utm_source=google&utm_medium=cpc&utm_campaign=spring-sale",
"warnings": []
}
curl -X POST https://api.imisofts.com/v1/utm/build \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"base_url": "https://example.com",
"source": "google",
"medium": "cpc",
"campaign": "spring-sale"
}'
const response = await fetch('https://api.imisofts.com/v1/utm/build', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
base_url: 'https://example.com',
source: 'google',
medium: 'cpc',
campaign: 'spring-sale'
})
});
import requests
response = requests.post(
'https://api.imisofts.com/v1/utm/build',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'base_url': 'https://example.com',
'source': 'google',
'medium': 'cpc',
'campaign': 'spring-sale'
}
)
Normalize and validate phone numbers globally
Returns E.164, international and national formats with country detection and WhatsApp compatibility.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| raw | string | Yes | Raw phone number input |
| default_region | string | No | ISO 3166-1 alpha-2 code (US, GB, AE) |
| boolean | No | Check WhatsApp compatibility |
Validate WhatsApp message templates
Checks placeholders, variable counts, language code, and length. Returns suggestions.
Guides and Recipes
Step-by-step tutorials for common use cases.
Build clean campaign links with the UTM API
- Request a free API key
- Use POST /utm/build to create your canonical link
- Validate naming with POST /utm/validate
- Send events to GA4 and confirm attribution
Validate WhatsApp templates before submission
- List supported locales with GET /whatsapp/locales
- Lint your body and placeholders with POST /whatsapp/templates/lint
- Fix issues and re-lint until valid
Normalize phone numbers for global messaging
- Send raw input to POST /phone/normalize
- Store E.164 for consistent delivery
- Use whatsapp_compatible for broadcast lists
Show delivery updates with normalized courier status
- List carriers with GET /couriers/carriers
- Query a shipment with GET /couriers/{carrier}/tracking/{id}
- Map status codes with GET /couriers/status-codes
Changelog
Recent updates and improvements to the API.
Initial public launch
2025-08-28- UTM, Phone, Messaging, Tax, Logistics, and AI endpoints available
- Playground with mock responses
- Rate limit headers added
Status and Uptime
99.99%
Uptime
42ms
Avg Response
0
Incidents
Frequently Asked Questions
Is the API free?
Yes. The free tier includes 60 requests per minute and 50,000 per month.
Do I need a credit card to sign up?
No. Email only for the free tier.
Can I use these APIs globally?
Yes. Endpoints are region aware and do not assume one country.
How do you handle security?
Bearer tokens, least privilege scopes, and signed webhooks. Data stays in your accounts whenever possible.
Do you provide SDKs?
Yes. Lightweight TS/JS and Python SDKs generated from the OpenAPI. Links are in the SDKs section.
What happens if I hit the rate limit?
You will receive a 429 with Retry-After. Upgrade links are shown in headers and errors.
Can I request new endpoints?
Yes. Open a request using the contact form. We prioritise public and safe use cases.
Ready to Get Started?
Get your free API key and start building today.
Email: growth@imisofts.com
Phone: +971 55 885 1645