Send iMessages and SMS directly from your application. Integrate messaging into your CRM, workflows, or custom tools with a single API call.
https://api.tryprojectblue.com
All API requests require a Bearer token in the Authorization header. You can generate API keys from within your Project Blue dashboard under Settings → API Keys.

Authorization: Bearer YOUR_API_KEYKeep your API keys secure
Never expose your API key in client-side code or public repositories. Always make API calls from your server.
/send-api-message
Send a message to a phone number via iMessage or SMS. If the recipient has iMessage, the message is delivered as an iMessage (blue bubble). Otherwise, it falls back to SMS automatically.
| Parameter | Type | Required | Description |
|---|---|---|---|
message | string | Required | The text content of the message to send. |
phone | string | Required | Recipient phone number. Accepts many formats — we normalize to E.164 (e.g. +15551234567). |
mediaAttachmentUrl | string | Optional | URL to an image, video, or contact card attachment. |
audioAttachmentUrl | string | Optional | URL to an audio file sent as a voice memo. |
enableAiVoiceMemo | boolean | Optional | When true, generates an AI voice memo from the message text using text-to-speech. |
The phone parameter is flexible — we accept formats like (555) 123-4567, 555.123.4567, +15551234567, and more. All numbers are normalized to E.164 format before sending.
curl -X POST https://api.tryprojectblue.com/send-api-message \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": "Hey! Just following up on our conversation.",
"phone": "+15551234567"
}'curl -X POST https://api.tryprojectblue.com/send-api-message \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": "Check out this property!",
"phone": "+15551234567",
"mediaAttachmentUrl": "https://example.com/property-photo.jpg"
}'curl -X POST https://api.tryprojectblue.com/send-api-message \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": "Hey, wanted to quickly touch base about your appointment tomorrow.",
"phone": "+15551234567",
"enableAiVoiceMemo": true
}'{
"success": true,
"messageId": "msg_abc123def456"
}Use the mediaAttachmentUrl field to send rich media with your messages. The following formats are supported:
Use audioAttachmentUrl to send audio files as voice memos. The following formats are supported:
AI Voice Memos
Set enableAiVoiceMemo to true and include a message to generate a natural-sounding voice memo via text-to-speech. No audio file needed — we generate it for you.
Webhooks let you receive real-time notifications when messages are sent or received. Configure webhooks from within the Project Blue dashboard alongside your API keys.
In the Project Blue app, you can:
Paste the webhook URL you want to receive events at
Toggle whether the webhook fires for outbound messages, inbound messages, or both
Send test payloads to verify your endpoint is working

Every webhook event delivers the same payload structure. The direction field indicates whether the message was inbound or outbound.
| Parameter | Type | Required | Description |
|---|---|---|---|
message | string | Required | The text content of the message. |
destination | string | Required | The phone number the message was sent to, in E.164 format. |
receivedAt | string | Required | ISO 8601 timestamp of when the message was received. |
direction | string | Required | Either "inbound" or "outbound", based on message direction. |
messageId | number | Required | Unique numeric identifier for the message. |
guid | string | Required | Globally unique message identifier. |
linePhoneNumber | string | Required | The Project Blue line phone number associated with this message. |
{
"message": "Yes, I'm interested! When can we schedule?",
"destination": "+15551234567",
"receivedAt": "2026-03-04T18:30:00.000Z",
"direction": "inbound",
"messageId": 456,
"guid": "sample-guid-1234",
"linePhoneNumber": "+15559876543"
}{
"message": "Great! Let's book you in for Thursday at 2pm.",
"destination": "+15551234567",
"receivedAt": "2026-03-04T18:31:00.000Z",
"direction": "outbound",
"messageId": 789,
"guid": "sample-guid-5678",
"linePhoneNumber": "+15559876543"
}The API uses standard HTTP status codes. All error responses include a JSON body with an error field describing what went wrong.
{
"error": "Missing or invalid Authorization header"
}Message sent successfully
Invalid request body or missing required fields
Missing or invalid API key
Rate limit exceeded
Internal server error