Skip to the page

API reference

Get the Mac

The Mac that sends for you: whether it is online, its setup checks, how many texts are waiting and today’s counts against the limits.

GET/v1/device

The Mac that sends for you: whether it is online, its setup checks, how many texts are waiting and today’s counts against the limits.

Needs a key with the account:read scope. Keys and scopes

Example

GET/v1/deviceGet the Mac →
curl "https://usebluebot.com/api/v1/device" \
  -H "Authorization: Bearer $BLUEBOT_API_KEY"

Response

200: The Mac.

  • idstring or nullrequired

    Null until a Mac is connected.

    Starts with dev_.

  • object"device"required
  • statusstringrequired

    online (checked in within 2 minutes), offline or never_connected.

    One of online, offline, never_connected.

  • namestring or nullrequired
  • numberstring or nullrequired

    The phone number Messages on the Mac sends from, when it can tell.

  • app_versionstring or nullrequired
  • macos_versionstring or nullrequired
  • last_seen_attimestamp or nullrequired

    The Mac’s last check-in.

  • last_sync_attimestamp or nullrequired

    The last time the Mac finished posting the texts it read from Messages.

  • offline_sincetimestamp or nullrequired

    When the Mac went quiet, while it is offline.

  • paired_attimestamp or nullrequired

    When this Mac was connected.

  • checksobjectrequired

    The Mac’s setup checks: Messages signed in, Full Disk Access, Text Message Forwarding, staying awake, FileVault.

    Show its 5 fields
    • messagesobjectrequired
      Show its 2 fields
      • statestringrequired

        ok, needs_you (something on the Mac needs fixing) or unknown.

        One of ok, needs_you, unknown.

      • detailstring or nullrequired

        What the Mac saw, in words.

    • full_disk_accessobjectrequired
      Show its 2 fields
      • statestringrequired

        ok, needs_you (something on the Mac needs fixing) or unknown.

        One of ok, needs_you, unknown.

      • detailstring or nullrequired

        What the Mac saw, in words.

    • forwardingobjectrequired
      Show its 2 fields
      • statestringrequired

        ok, needs_you (something on the Mac needs fixing) or unknown.

        One of ok, needs_you, unknown.

      • detailstring or nullrequired

        What the Mac saw, in words.

    • awakeobjectrequired
      Show its 2 fields
      • statestringrequired

        ok, needs_you (something on the Mac needs fixing) or unknown.

        One of ok, needs_you, unknown.

      • detailstring or nullrequired

        What the Mac saw, in words.

    • filevaultobjectrequired
      Show its 2 fields
      • statestringrequired

        ok, needs_you (something on the Mac needs fixing) or unknown.

        One of ok, needs_you, unknown.

      • detailstring or nullrequired

        What the Mac saw, in words.

  • checks_okboolean or nullrequired

    True when no check needs you.

  • transcriptionbooleanrequired

    Whether voice memos are transcribed on this Mac.

  • held_countintegerrequired

    Queued texts that are waiting on a hold.

  • queued_countintegerrequired

    Every queued text.

  • unconfirmed_countintegerrequired

    Texts the Mac couldn’t confirm, waiting for you to settle them.

  • paused_untiltimestamp or nullrequired

    While you have sending paused, until when.

  • todayobjectrequired

    Today’s counts against the limits.

    Show its 5 fields
    • sentintegerrequired

      Texts the Mac took today, in your time zone.

    • new_peopleintegerrequired

      People texted for the first time today.

    • new_people_limitintegerrequired

      Your new-people-per-day setting.

    • daily_limitintegerrequired

      BlueBot’s ceiling on texts a day.

    • resets_attimestamprequired

      The next local midnight, when the counts start again.

Response200
{
  "id": "dev_1Hq2LxW9cVbN3mKpRtYs0a",
  "object": "device",
  "status": "online",
  "name": "Dana’s MacBook Air",
  "number": "+15555550100",
  "app_version": "1.0.0",
  "macos_version": "15.1",
  "last_seen_at": "2026-11-13T19:41:00.000Z",
  "last_sync_at": "2026-11-13T19:41:00.000Z",
  "offline_since": null,
  "paired_at": "2026-11-01T15:00:00.000Z",
  "checks": {
    "messages": {
      "state": "ok",
      "detail": null
    },
    "full_disk_access": {
      "state": "ok",
      "detail": null
    },
    "forwarding": {
      "state": "ok",
      "detail": null
    },
    "awake": {
      "state": "ok",
      "detail": null
    },
    "filevault": {
      "state": "ok",
      "detail": null
    }
  },
  "checks_ok": true,
  "transcription": false,
  "held_count": 0,
  "queued_count": 0,
  "unconfirmed_count": 0,
  "paused_until": null,
  "today": {
    "sent": 14,
    "new_people": 3,
    "new_people_limit": 50,
    "daily_limit": 1000,
    "resets_at": "2026-11-14T05:00:00.000Z"
  }
}

Errors

Every refusal has the same envelope and a page of its own. These are the ones this operation can give.

CodeStatusWhat it means
unauthorized401The request carried no key, or a key BlueBot doesn’t know: mistyped, revoked, or a test key sent to the live API.
insufficient_scope403The key doesn’t carry the scope the endpoint needs. Each endpoint’s reference names its scope.
rate_limited429Too many requests. A key may make 120 requests a minute. The RateLimit header says how many are left, and Retry-After how long to wait.
internal500Something went wrong on BlueBot’s side. It was reported. Send the request again; with an Idempotency-Key that is always safe.

Try it

Call this operation from the page with your own key. The key stays in this tab and is forgotten when you leave.