iMessage Inbox

Text an agent on iMessage. It replies in the same chat, and the conversation keeps its context.

Not self-serve yet. iMessage is not generally available to API developers. The flow below is an early preview tied to the m8tes platform and may change. For production API use, trigger agents by email or webhook for now.

Branding. The hosted flow runs on a shared m8tes number. Dedicated numbers exist today, one per app or per end-user, and we provision the line with you: email sales@m8tes.ai.

m8tes hosts iMessage for you. There is no server to run:

  1. Provision a hosted connection. You get the m8tes number to text and a short link code.
  2. Each person texts the link code once to that number to link their phone.
  3. They text the number; the message triggers a run; the agent replies in the same chat.
Python

Everyone shares one m8tes number, so inbound is routed to your account by the sender's verified handle (that is what the link code establishes). Rotate the code with client.bridges.regenerate_link_code(bridge.id); unlink a phone with client.bridges.remove_handle(bridge.id, handle_id). provision() raises a 503 if the platform's central server is not configured.

Hosted iMessage links a handle to your account; it does not carry an end-user user_id. For per-end-user channels in an embedded app, use email instead.

A dedicated number lifts that limit. It routes by number rather than by handle, so it can carry a user_id and give one app or one end-user its own line. Ask us to provision it.

Bind an Agent to a Chat

Give a specific agent one 1:1 chat by its chatGuid. Unbound inbound messages route to your account's Company Agent instead.

Python

Allowed Senders

allowed_imessage_senders takes phone or email handles (formatting and case are normalized). Without a listed sender, inbound messages are silently dropped, so only listed handles can spend a run. Same allowlist model as every inbox channel: see Allowed Senders.

Python

Conversation Continuity

An iMessage chat is an ongoing 1:1 conversation. A follow-up message resumes the same run when the previous one was active in the last 72 hours, so the agent keeps its context. After 72 idle hours a fresh run starts with clean context (the agent can still pull earlier history on demand). A text sent while a run is mid-flight gets a short "still working" acknowledgement instead of a second parallel run.

Only 1:1 chats are supported. Binding a group chat is rejected so an agent never broadcasts replies to a group.

Multi-Tenant iMessage

Self-hosted bridges support user_id scoping per chat, following the shared model in Multi-Tenant Sender Scoping:

Python
Advanced: bring your own BlueBubbles server

Run your own server (your own Apple ID and number) by registering a self-hosted bridge. A bridge is account-scoped and can serve many of your agents, each bound to a 1:1 chat.

Register a bridge

Python

Configure the BlueBubbles webhook to POST new-message events to https://api.m8tes.ai/api/v1/webhooks/inbound/imessage with header X-Webhook-Secret: <webhook_secret>.

owner_handle lets you text your Company Agent the moment the bridge is registered, with no allowlist edit. It is honored only on the default-agent path; an agent bound to a specific chat still uses its own allowlist.

Check the connection

Python

Run this if a bridge stops receiving or replying. It confirms the Mac is reachable and the password is still accepted.

Next: Email Inbox · Webhook Triggers · Memories & Documents

Was this page helpful?