Skip to main content
Two read endpoints cover lines: GET /list-lines returns every line on your workspace, and GET /get-line returns one line with extra detail. Use them to pick a line before you send, to watch daily capacity, and to catch a line that needs attention. Lines are provisioned, paused, and resumed from the BlueReacher dashboard. The API is read only for lines.

What a line is

A line is a dedicated iMessage number, managed for you. One line is one phone number. It belongs to your workspace and nobody else sends from it. BlueReacher handles setup and upkeep. You get a number that sends blue bubbles, with no A2P registration required and nothing for you to configure before your first campaign. Every line has an id that starts with line_. That value is what you pass as line_id when you send a message, or you can set from to the line’s phone_number. Both point at the same line. A line also carries a delivery order. The channels array lists which channels the line can deliver on, in fallback order. The default is ["imessage", "rcs", "sms"]: iMessage first, RCS if the recipient cannot receive iMessage, SMS if neither is available.

Line status

status is one of three values. Sending to a paused line returns 409 line_paused from the send endpoint. Call GET /get-line for paused_reason to find out which kind of pause it is.

What warming means

A new line does not start at full volume. It ramps over its first 14 days, and its status is warming for that whole window. You can send from a warming line on day one. You just get a smaller daily allowance. The ramp is a documented default, applied to every new line: Two fields track where a line sits in the ramp. warming_day is the current day number, 1 through 14, and it is null once the line is active. warming_completes_at is the timestamp when the line reaches full capacity, also null once the line is active. Do not hardcode 200 as the finish line. Higher plans set a higher ceiling. Read full_daily_capacity on the line object for the real number, and read daily_capacity for what the line can send right now. Practical rule while a line is warming: send your best list to it. Reply rate and opt-out rate during the ramp shape the line’s health, and health shapes capacity later.

How capacity works

Three fields describe a line’s day.
  • daily_capacity is the ceiling for the current day.
  • messages_sent_today is how many outbound messages the line has already sent today.
  • remaining_today is daily_capacity minus messages_sent_today, floored at 0.
The counter resets at midnight in the line’s own timezone. timezone gives you the IANA zone, and capacity_resets_at gives you the exact next reset as a timestamp, so you do not have to do zone math yourself. What counts toward messages_sent_today:
  • Every outbound message the API accepts from that line, including follow-ups in an existing thread.
  • Messages that later fail delivery. They were still sent from the line.
What does not count:
  • Inbound replies.
  • Requests rejected at validation, such as a bad to number.
  • Messages sent from a different line.
When remaining_today hits 0, further sends on that line return 429 daily_capacity_reached from the send endpoint. If you send without naming a line, BlueReacher picks an eligible line for you and skips lines that are out of capacity or paused. Paused lines always report remaining_today as 0, whatever daily_capacity says.

Health indicator

health is a plain read on whether a line should keep sending. The score is a rolling 7 day read built from delivery success, reply rate, opt-out rate, and complaint signals on that line. It updates a few times an hour. A brand new warming line starts at good with a provisional score until it has enough sending history. Route around trouble instead of waiting for a pause: filter out at_risk lines when you choose where to send.

Authentication

Every request needs your API key in the Authorization header.
Keys are workspace scoped. You only ever see lines on the workspace that issued the key. Content-Type: application/json describes the response and is safe to send on these GET requests, which carry no body.

GET /list-lines

Returns every line on your workspace, newest first by created_at. Method and path
Auth: required. Bearer key in the Authorization header. Returns only the lines on the key’s workspace.

Request fields

All parameters go in the query string. All are optional.

Response fields

Each entry in lines is a line object:

Example request

Example response

Filtered request

Errors

An empty workspace is not an error. You get 200 with "lines": [].

GET /get-line

Returns one line by id, with the same fields as list-lines plus 7 day performance stats and, when the line is paused, the reason. Method and path
Auth: required. Bearer key in the Authorization header. Requesting a line on another workspace returns 404, not 403.

Request fields

Response fields

The response is a single line object. It carries every field from the list-lines line object, plus:

Example request

Example response

Errors

Error format

Every error uses the same envelope, on both endpoints.
Match on error.code, not on error.message. Messages get clearer over time; codes do not change. Include request_id when you contact support about a specific request.

Choosing a line before you send

The common pattern: list active lines, drop anything unhealthy or out of capacity, then send from the line with the most room left.
If you would rather not manage this yourself, omit line_id when you send. BlueReacher picks an eligible line, skipping paused lines, at_risk lines, and lines with no capacity left.

Rate limits and caching

Read endpoints allow 120 requests per minute per API key. Over that, you get 429 with a Retry-After header in seconds. Cache the result of list-lines for up to 60 seconds. Counters like messages_sent_today refresh within about 5 seconds of a send, so polling faster than once per second buys you nothing. For pagination, loop until has_more is false, passing next_cursor back verbatim each time. Cursors are opaque. Do not build or edit them. Defaults on this page (14 day warming ramp, 200 messages per day at full capacity, 120 reads per minute) are current as of July 24, 2026. The line object always reports your account’s real numbers, so read the fields rather than assuming the defaults.