# Sendblue

> Text customers over iMessage and SMS with Sendblue: send messages, reactions, typing indicators and read receipts, check iMessage support, and manage contacts and webhooks.

App · 20 actions. Web page: https://docs.lodol.com/docs/integrations/sendblue

## Actions

### Add verified contact

Let a phone number be messaged from the free plan's shared line. It stays pending until the person texts the line number returned; the result says what to tell them. Returns the existing entry if the number was already added.

**Inputs**

- Phone number (`number`, text, required): The contact's phone number, like +15551234567.

**Outputs**

- `contact` (object): The verified contact
- `line` (object): The shared line they must text
- `verification_instructions` (text): What to tell them; empty once verified

**Example output**

```json
{
  "contact": {
    "created_at": "2026-10-14T10:00:00.000Z",
    "phone_number": "+15551234567",
    "updated_at": "2026-10-14T10:05:00.000Z",
    "verification_status": "pending",
    "verified": true
  },
  "line": {
    "phone_number": "+13055550100",
    "type": "shared"
  },
  "verification_instructions": "Text any message to +13055550100 to start chatting."
}
```

### Add webhook

Add an https:// address for Sendblue to post one type of event to. Existing webhooks are kept. Webhooks apply to every line on the account.

**Inputs**

- Webhook URL (`url`, text, required): The https:// address Sendblue posts events to.
- Event (`webhook_type`, text): Which events the address receives. Defaults to Message received. One of: `receive` (Message received), `outbound` (Message status (outbound)), `typing_indicator` (Typing indicator), `call_log` (Call log), `call_completed` (Call completed), `inbound_call` (Inbound call), `line_blocked` (Line blocked), `line_assigned` (Line assigned), `contact_profile` (Contact profile), `contact_created` (Contact created).
- Signing secret (`secret`, text): A secret Sendblue sends with each event so your endpoint can check it came from Sendblue.
- Only for lines (`sendblue_numbers`, list): Only send events for these Sendblue numbers. Message received webhooks only.

**Outputs**

- `added` (true/false): Always true once added
- `message` (text): Sendblue's confirmation
- `url` (text): The address added
- `webhook_type` (text): Its event type
- `webhooks` (list): Every webhook now set

**Example output**

```json
{
  "added": true,
  "message": "Webhooks added successfully",
  "url": "https://example.com/sendblue",
  "webhook_type": "receive",
  "webhooks": [
    {
      "has_secret": false,
      "sendblue_numbers": [],
      "url": "https://example.com/sendblue",
      "webhook_type": "receive"
    }
  ]
}
```

### Check iMessage support

Check whether a phone number or email address can receive iMessages. Limited to 30 checks an hour and 100 a day per line.

**Inputs**

- Phone number or email (`number`, text, required): The phone number (like +15551234567) or email.

**Outputs**

- `number` (text): The number checked
- `service` (text): iMessage or SMS
- `supports_imessage` (true/false): Whether it can receive iMessages

**Example output**

```json
{
  "number": "+15551234567",
  "service": "iMessage",
  "supports_imessage": true
}
```

### Create contact

Add a contact with name, owner, line, tags and custom variables. This does not let you message them on the free plan; use 'Add verified contact' for that.

**Inputs**

- Phone number (`number`, text, required): The contact's phone number, like +15551234567.
- First name (`first_name`, text): The contact's first name.
- Last name (`last_name`, text): The contact's last name.
- Assigned to (`assigned_to_email`, text): The email address of the teammate who owns this contact.
- Sendblue line (`sendblue_number`, text): The Sendblue number this contact talks to.
- Tags (`tags`, list): Tags to give the contact.
- Custom variables (`custom_variables`, object): Text values by label, for example plan: Pro. A new label is created for you.
- Update if it exists (`update_if_exists`, true/false): If a contact with this number exists, update it instead of failing.

**Outputs**

- `contact` (object): The contact as Sendblue has it now

**Example output**

```json
{
  "contact": {
    "assigned_to_email": null,
    "company_name": null,
    "contact_id": "c_8f2a1b",
    "created_at": "2026-10-15T10:00:00.000Z",
    "custom_variables": {
      "plan": "Pro"
    },
    "first_name": "Jo",
    "last_name": "Rivera",
    "opt_out": false,
    "phone": "+15551234567",
    "sendblue_number": "+13055550100",
    "tags": [
      "lead"
    ]
  }
}
```

### Delete contact

Delete a contact by phone number.

**Inputs**

- Phone number (`number`, text, required): The contact's phone number, like +15551234567.

**Outputs**

- `deleted` (true/false): Always true once deleted
- `number` (text): The contact deleted
- `status` (text): Sendblue's status

**Example output**

```json
{
  "deleted": true,
  "number": "+15551234567",
  "status": "OK"
}
```

### Delete webhook

Remove one webhook address for one event type.

**Inputs**

- Webhook URL (`url`, text, required): The https:// address Sendblue posts events to.
- Event (`webhook_type`, text): Which events the address receives. Defaults to Message received. One of: `receive` (Message received), `outbound` (Message status (outbound)), `typing_indicator` (Typing indicator), `call_log` (Call log), `call_completed` (Call completed), `inbound_call` (Inbound call), `line_blocked` (Line blocked), `line_assigned` (Line assigned), `contact_profile` (Contact profile), `contact_created` (Contact created).

**Outputs**

- `deleted` (true/false): Always true once deleted
- `message` (text): Sendblue's confirmation
- `url` (text): The address removed
- `webhook_type` (text): Its event type

**Example output**

```json
{
  "deleted": true,
  "message": "Webhooks deleted successfully",
  "url": "https://example.com/sendblue",
  "webhook_type": "receive"
}
```

### Get contact

Get a contact by phone number.

**Inputs**

- Phone number (`number`, text, required): The contact's phone number, like +15551234567.

**Outputs**

- `contact` (object): The contact as Sendblue has it now

**Example output**

```json
{
  "contact": {
    "assigned_to_email": null,
    "company_name": null,
    "contact_id": "c_8f2a1b",
    "created_at": "2026-10-15T10:00:00.000Z",
    "custom_variables": {
      "plan": "Pro"
    },
    "first_name": "Jo",
    "last_name": "Rivera",
    "opt_out": false,
    "phone": "+15551234567",
    "sendblue_number": "+13055550100",
    "tags": [
      "lead"
    ]
  }
}
```

### Get message

Get one sent or received message by its handle, with its content, service, status and any error.

**Inputs**

- Message handle (`message_handle`, text, required): The message's handle, from 'Send message', 'List messages' or an earlier step.

**Outputs**

- `account_email` (text)
- `content` (text)
- `date_sent` (text)
- `date_updated` (text)
- `error_code` (number)
- `error_detail` (text)
- `error_key` (text)
- `error_message` (text)
- `error_reason` (text)
- `from_number` (text)
- `group_display_name` (text)
- `group_id` (text)
- `is_outbound` (true/false)
- `media_url` (text)
- `message_handle` (text)
- `message_type` (text)
- `number` (text)
- `opted_out` (true/false)
- `participants` (list)
- `plan` (text)
- `reply_to` (object)
- `send_style` (text)
- `sendblue_number` (text)
- `sender_email` (text)
- `service` (text)
- `status` (text)
- `to_number` (text)
- `was_downgraded` (true/false)

**Example output**

```json
{
  "account_email": "owner@example.com",
  "content": "Hello from Lodol",
  "date_sent": "2026-10-15T10:00:00.000Z",
  "date_updated": "2026-10-15T10:00:02.000Z",
  "from_number": "+13055550100",
  "is_outbound": true,
  "message_handle": "5a17319e-2a6c-4c3e-9f1e-7b8d2c1a0f11",
  "message_type": "message",
  "number": "+15551234567",
  "sendblue_number": "+13055550100",
  "service": "iMessage",
  "status": "DELIVERED",
  "to_number": "+15551234567",
  "was_downgraded": false
}
```

### Get message status

Check whether a sent message is queued, sent, delivered or failed, by its handle.

**Inputs**

- Message handle (`message_handle`, text, required): The message's handle, from 'Send message', 'List messages' or an earlier step.

**Outputs**

- `account_email` (text)
- `content` (text)
- `date_created` (text)
- `date_updated` (text)
- `error_code` (number)
- `error_key` (text)
- `error_message` (text)
- `from_number` (text)
- `is_outbound` (true/false)
- `media_url` (text)
- `message_handle` (text)
- `message_type` (text)
- `number` (text)
- `reply_to` (object)
- `send_style` (text)
- `sender_email` (text)
- `status` (text)

**Example output**

```json
{
  "account_email": "owner@example.com",
  "content": "Hello from Lodol",
  "date_created": "2026-10-15T10:00:00.000Z",
  "date_updated": "2026-10-15T10:00:01.000Z",
  "error_code": null,
  "error_message": null,
  "from_number": "+13055550100",
  "is_outbound": true,
  "media_url": null,
  "message_handle": "5a17319e-2a6c-4c3e-9f1e-7b8d2c1a0f11",
  "message_type": "message",
  "number": "+15551234567",
  "send_style": null,
  "status": "DELIVERED"
}
```

### List contacts

List a page of your contacts, optionally by phone number, contact id or creation time.

**Inputs**

- Phone number (`phone_number`, text): Only the contact with this phone number.
- Contact ID (`contact_id`, text): Only the contact with this Sendblue id.
- Created after (`created_after`, date and time): Only contacts created at or after this time.
- Sort by (`order_by`, text): The field to sort by. Defaults to created. One of: `created_at` (Created), `firstName` (First name), `lastName` (Last name), `phone`.
- Sort direction (`order_direction`, text): Ascending or descending. One of: `asc` (Ascending), `desc` (Descending).
- Limit (`limit`, number): How many contacts to return, up to 1000 (default 100). From 1 to 1000.
- Offset (`offset`, number): How many contacts to skip, up to 10000. From 0 to 10000.

**Outputs**

- `contacts` (list): The contacts
- `count` (number): How many on this page
- `has_more` (true/false): Whether a full page came back, so more may remain
- `limit` (number): The page size
- `offset` (number): How many were skipped

**Example output**

```json
{
  "contacts": [
    {
      "assigned_to_email": null,
      "company_name": null,
      "contact_id": "c_8f2a1b",
      "created_at": "2026-10-15T10:00:00.000Z",
      "custom_variables": {
        "plan": "Pro"
      },
      "first_name": "Jo",
      "last_name": "Rivera",
      "opt_out": false,
      "phone": "+15551234567",
      "sendblue_number": "+13055550100",
      "tags": [
        "lead"
      ]
    }
  ],
  "count": 1,
  "has_more": false,
  "limit": 100,
  "offset": 0
}
```

### List lines

List the Sendblue phone numbers you can send from.

**Inputs**: None.

**Outputs**

- `count` (number): How many
- `numbers` (list): The line numbers

**Example output**

```json
{
  "count": 1,
  "numbers": [
    "+13055550100"
  ]
}
```

### List messages

List messages sent and received on your account, filtered by line, contact, direction, service, status or time.

**Inputs**

- Sendblue line (`sendblue_number`, text): Only messages on this Sendblue number.
- Contact number (`number`, text): Only messages to or from this phone number.
- Direction (`direction`, text): Only received or only sent messages. One of: `inbound` (Received (inbound)), `outbound` (Sent (outbound)).
- Service (`service`, text): Only messages sent over this service. One of: `iMessage`, `SMS`, `RCS`.
- Status (`status`, text): Only messages with this status. One of: `REGISTERED`, `PENDING`, `SENT`, `DELIVERED`, `RECEIVED`, `QUEUED`, `ERROR`, `DECLINED`, `ACCEPTED`, `SUCCESS`.
- Conversation type (`message_type`, text): Only one-to-one or only group messages. One of: `message` (One-to-one), `group`.
- Group ID (`group_id`, text): Only messages in this group conversation.
- Created after (`created_after`, date and time): Only messages created at or after this time.
- Created before (`created_before`, date and time): Only messages created at or before this time.
- Updated after (`updated_after`, date and time): Only messages updated at or after this time.
- Sort by (`order_by`, text): Which time to sort by. One of: `createdAt` (Created), `updatedAt` (Updated), `sentAt` (Sent).
- Sort direction (`order_direction`, text): Ascending or descending. One of: `asc` (Ascending), `desc` (Descending).
- Limit (`limit`, number): How many messages to return, up to 100. From 1 to 100.
- Offset (`offset`, number): How many messages to skip, for the next page. At least 0.

**Outputs**

- `count` (number): How many on this page
- `has_more` (true/false): Whether more remain
- `limit` (number): The page size
- `messages` (list): The messages
- `offset` (number): How many were skipped
- `total` (number): How many match in all

**Example output**

```json
{
  "count": 1,
  "has_more": false,
  "limit": 50,
  "messages": [
    {
      "account_email": "owner@example.com",
      "content": "Hello from Lodol",
      "date_sent": "2026-10-15T10:00:00.000Z",
      "date_updated": "2026-10-15T10:00:02.000Z",
      "from_number": "+13055550100",
      "is_outbound": true,
      "message_handle": "5a17319e-2a6c-4c3e-9f1e-7b8d2c1a0f11",
      "message_type": "message",
      "number": "+15551234567",
      "sendblue_number": "+13055550100",
      "service": "iMessage",
      "status": "DELIVERED",
      "to_number": "+15551234567",
      "was_downgraded": false
    }
  ],
  "offset": 0,
  "total": 1
}
```

### List verified contacts

List the numbers added for the free plan's shared line, with whether each is verified yet, and the line itself.

**Inputs**

- Status (`verification_status`, text): Only verified or only pending contacts. One of: `verified`, `pending`.

**Outputs**

- `contacts` (list): The contacts
- `count` (number): How many
- `line` (object): The shared line

**Example output**

```json
{
  "contacts": [
    {
      "created_at": "2026-10-14T10:00:00.000Z",
      "phone_number": "+15551234567",
      "updated_at": "2026-10-14T10:05:00.000Z",
      "verification_status": "verified",
      "verified": true
    }
  ],
  "count": 1,
  "line": {
    "phone_number": "+13055550100",
    "type": "shared"
  }
}
```

### List webhooks

List the addresses Sendblue posts events to, with each one's event type. Signing secrets are not shown.

**Inputs**

- Event (`webhook_type`, text): Only webhooks for this event. One of: `receive` (Message received), `outbound` (Message status (outbound)), `typing_indicator` (Typing indicator), `call_log` (Call log), `call_completed` (Call completed), `inbound_call` (Inbound call), `line_blocked` (Line blocked), `line_assigned` (Line assigned), `contact_profile` (Contact profile), `contact_created` (Contact created).

**Outputs**

- `count` (number): How many
- `has_global_secret` (true/false): Whether an account-wide signing secret is set
- `webhooks` (list): The webhooks

**Example output**

```json
{
  "count": 1,
  "has_global_secret": false,
  "webhooks": [
    {
      "has_secret": false,
      "sendblue_numbers": [],
      "url": "https://example.com/sendblue",
      "webhook_type": "receive"
    }
  ]
}
```

### Mark conversation read

Send a read receipt for a one-to-one conversation, so the person sees their messages as read.

**Inputs**

- Sendblue line (`from_number`, text, required): The Sendblue number to use. A free account has one shared line.
- Recipient (`number`, text, required): The person's phone number, like +15551234567. On the free plan they must have texted your Sendblue line first.

**Outputs**

- `message` (text): Sendblue's confirmation
- `number` (text): The contact
- `status` (text): OK

**Example output**

```json
{
  "message": "Mark read request sent",
  "number": "+15551234567",
  "status": "OK"
}
```

### Send message

Send a one-to-one iMessage from your Sendblue line, with text, a picture or file link, or both. Sendblue falls back to SMS when the person has no iMessage. On the free plan the person must have texted your line first.

**Inputs**

- Sendblue line (`from_number`, text, required): The Sendblue number to use. A free account has one shared line.
- Recipient (`number`, text, required): The person's phone number, like +15551234567. On the free plan they must have texted your Sendblue line first.
- Message (`content`, text): The text to send (up to 18,996 characters). Optional when a media URL is given.
- Media URL (`media_url`, text): A public link to a picture, video or file to attach. It must end with the file extension (like .jpg); signed links are not supported.
- Effect (`send_style`, text): An iMessage bubble or screen effect. One of: `celebration`, `shooting_star` (Shooting star), `fireworks`, `lasers`, `love`, `confetti`, `balloons`, `spotlight`, `echo`, `invisible` (Invisible ink), and 3 more.
- Status callback URL (`status_callback`, text): An https:// address Sendblue posts this message's delivery updates to.
- Reply to message (`reply_to_message_handle`, text): The handle of a message to reply to in a thread. Only on Sendblue's newer (V2) iMessage lines.
- Reply to part (`reply_to_part_index`, number): Which part of that message to reply to, counting from 0. Defaults to the first. At least 0.
- Let one message through before a reply (`pre_reply_override`, true/false): Send even though the person has not replied yet. Allowed once per contact, per line, per day.

**Outputs**

- `account_email` (text)
- `content` (text)
- `date_created` (text)
- `date_updated` (text)
- `error_code` (number)
- `error_key` (text)
- `error_message` (text)
- `from_number` (text)
- `is_outbound` (true/false)
- `media_url` (text)
- `message_handle` (text)
- `message_type` (text)
- `number` (text)
- `reply_to` (object)
- `send_style` (text)
- `sender_email` (text)
- `status` (text)

**Example output**

```json
{
  "account_email": "owner@example.com",
  "content": "Hello from Lodol",
  "date_created": "2026-10-15T10:00:00.000Z",
  "date_updated": "2026-10-15T10:00:01.000Z",
  "error_code": null,
  "error_message": null,
  "from_number": "+13055550100",
  "is_outbound": true,
  "media_url": null,
  "message_handle": "5a17319e-2a6c-4c3e-9f1e-7b8d2c1a0f11",
  "message_type": "message",
  "number": "+15551234567",
  "send_style": null,
  "status": "QUEUED"
}
```

### Send reaction

React to a message you received over iMessage in the last few days, with a tapback (love, like, laugh...) or one emoji, or remove a tapback. Not every line supports reactions.

**Inputs**

- Sendblue line (`from_number`, text, required): The Sendblue number to use. A free account has one shared line.
- Message handle (`message_handle`, text, required): The handle of the received iMessage, from 'List messages' with direction Received.
- Tapback (`reaction`, text): The tapback to send. Choose this or an emoji. One of: `love`, `like`, `dislike`, `laugh`, `emphasize`, `question`.
- Emoji (`emoji`, text): Exactly one emoji to react with, instead of a tapback.
- Remove this tapback (`remove`, true/false): Take the chosen tapback off the message instead.
- Message part (`part_index`, number): Which part of the message to react to, counting from 0. Defaults to the first. At least 0.

**Outputs**

- `message` (text): Sendblue's confirmation
- `message_handle` (text): The message reacted to
- `reaction` (text): The reaction sent
- `status` (text): OK

**Example output**

```json
{
  "message": "Reaction request sent",
  "message_handle": "5a17319e-2a6c-4c3e-9f1e-7b8d2c1a0f11",
  "reaction": "love",
  "status": "OK"
}
```

### Send typing indicator

Show or hide the typing bubble in an existing one-to-one iMessage conversation. Best effort; not in group chats.

**Inputs**

- Sendblue line (`from_number`, text, required): The Sendblue number to use. A free account has one shared line.
- Recipient (`number`, text, required): The person's phone number, like +15551234567. On the free plan they must have texted your Sendblue line first.
- Typing (`state`, text): Start or stop the typing bubble. Defaults to start. One of: `start` (Start typing), `stop` (Stop typing).
- Show for up to (ms) (`max_duration_ms`, number): How long the bubble may show, in milliseconds (1 to 300000). Sendblue's default is 60000. From 1 to 300000.

**Outputs**

- `number` (text): The recipient
- `state` (text): start or stop
- `status` (text): SENT

**Example output**

```json
{
  "number": "+15551234567",
  "state": "start",
  "status": "SENT"
}
```

### Set contact opt-out

Opt a contact out of your messages, or back in. Opted-out contacts cannot be messaged.

**Inputs**

- Phone number (`number`, text, required): The contact's phone number, like +15551234567.
- Opted out (`opted_out`, true/false): On to opt them out, off to opt them back in. Default: `true`.

**Outputs**

- `number` (text): The contact
- `opted_out` (true/false): Whether opted out now
- `status` (text): Sendblue's status

**Example output**

```json
{
  "number": "+15551234567",
  "opted_out": true,
  "status": "OK"
}
```

### Update contact

Change a contact's name, company, owner, line, tags or custom variables. Tags given replace all of the contact's tags; custom variables are merged with the existing ones. Fields left empty are not changed.

**Inputs**

- Phone number (`number`, text, required): The contact's phone number, like +15551234567.
- First name (`first_name`, text): The contact's first name.
- Last name (`last_name`, text): The contact's last name.
- Company (`company_name`, text): The contact's company.
- Assigned to (`assigned_to_email`, text): The email address of the teammate who owns this contact.
- Sendblue line (`sendblue_number`, text): The Sendblue number this contact talks to.
- Tags (`tags`, list): The contact's tags. These replace every tag it has now.
- Custom variables (`custom_variables`, object): Text values by label, for example plan: Pro. A new label is created for you.

**Outputs**

- `contact` (object): The contact as Sendblue has it now

**Example output**

```json
{
  "contact": {
    "assigned_to_email": null,
    "company_name": "Acme",
    "contact_id": "c_8f2a1b",
    "created_at": "2026-10-15T10:00:00.000Z",
    "custom_variables": {
      "plan": "Pro"
    },
    "first_name": "Jo",
    "last_name": "Rivera",
    "opt_out": false,
    "phone": "+15551234567",
    "sendblue_number": "+13055550100",
    "tags": [
      "lead"
    ]
  }
}
```
