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 anid 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 iswarming 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_capacityis the ceiling for the current day.messages_sent_todayis how many outbound messages the line has already sent today.remaining_todayisdaily_capacityminusmessages_sent_today, floored at 0.
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.
- Inbound replies.
- Requests rejected at validation, such as a bad
tonumber. - Messages sent from a different line.
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 theAuthorization header.
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 bycreated_at.
Method and path
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 aslist-lines plus 7 day performance stats and, when the line is paused, the reason.
Method and path
Authorization header. Requesting a line on another workspace returns 404, not 403.
Request fields
Response fields
The response is a singleline 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.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.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 get429 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.