spacesOS

Docs

Quickstart

  1. Create an account with your email and the code we send.
  2. In the dashboard, connect WhatsApp (scan a QR code), or Instagram, LinkedIn, Messenger or X (sign in).
  3. Create an API key. It starts with spc_live_ and is shown once.
  4. Add the MCP server to your agent, or call the REST API.

MCP server: https://api.spacesos.com/mcp · REST base URL: https://api.spacesos.com/v1 · Auth: Authorization: Bearer spc_live_xxxxxxxxxxxxxxxx

Sign up and set up from an agent

An agent can do the whole setup over the API or MCP. Only two steps need the person: reading the code from their inbox, and opening the links to add a card and connect an account.

  1. POST /signup with the email (or the create_account tool). We email a 6-digit code.
  2. POST /signup/verify with the code (or verify_account). You get an API key.
  3. POST /messaging/billing/checkout (or create_messaging_billing_checkout) returns a link. The person adds a card to start the 14-day trial. The subscription renews automatically. Connect an account only after Checkout finishes.
  4. POST /messaging/accounts/connect-link (or create_messaging_connect_link) returns a link where the person scans a QR code or signs in.
  5. GET /messaging/accounts (or list_messaging_accounts) confirms the account is live. Keys: GET, POST and DELETE /keys.

Paste this into Claude Code, Claude Desktop or any agent that can browse and run commands.

Set me up on spacesOS so you can read and send my WhatsApp messages. Instructions: https://www.spacesos.com/llms.txt

Start the trial and connect, with a key

curl -X POST https://api.spacesos.com/v1/messaging/billing/checkout \
  -H "Authorization: Bearer spc_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{ "success_url": "https://app.spacesos.com/dashboard", "cancel_url": "https://app.spacesos.com/dashboard" }'
curl -X POST https://api.spacesos.com/v1/messaging/accounts/connect-link \
  -H "Authorization: Bearer spc_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{ "channel": "whatsapp" }'

Connect your agent

The MCP server gives your agent tools to list accounts and chats, read messages, reply and start chats.

Run this once in your terminal. Claude Code can then read and send your messages.

claude mcp add --transport http spacesos https://api.spacesos.com/mcp --header "Authorization: Bearer spc_live_xxxxxxxxxxxxxxxx"

Which key permissions do I need?

New keys can read and send. A read-only key is enough for agents that only summarise or search your messages.

MCP tools

Two servers. https://api.spacesos.com/mcp/start needs no key and signs people up. https://api.spacesos.com/mcp takes Authorization: Bearer spc_live_xxxxxxxxxxxxxxxx and does everything else. Each tool describes its own limits, so Claude and Grok can plan around them.

ToolArgumentsWhat it does
create_accountemailOnboarding server, no key. Emails the person a 6-digit code.
verify_accountsignup_id, codeOnboarding server. Returns the API key and how to connect.
list_messaging_accountsnoneConnected accounts on every channel.
list_messaging_chatsaccount_id, cursor?, limit?, unread?Chats on an account, newest first.
list_messaging_messagesaccount_id, chat_id, cursor?, limit?Messages in a chat.
get_messaging_attachmentaccount_id, chat_id, message_id, attachment_idOne attachment as base64 (up to 5 MB).
reply_in_chataccount_id, chat_id, text, idempotency_key, attachments?Reply in an existing chat. Needs a key that can send.
start_chataccount_id, to (phone, username or user_id), text, idempotency_keyStart a new chat. Subject to the new-chat limits.
create_messaging_connect_linkchannel or account_idA link the person opens to connect (QR code or login), or to reconnect.
disconnect_messaging_accountaccount_idDisconnect an account; billing for it stops.
get_messaging_billingnoneSubscription status, connected accounts and monthly total.
create_messaging_billing_checkoutnoneA link where the person starts the free trial and adds a card.
get_profileaccount_id, identifierA profile on any channel. On LinkedIn it counts as a profile view.
send_invitationaccount_id, identifier, message?, idempotency_keyLinkedIn: invite someone to connect.
list_invitationsaccount_idLinkedIn: pending invitations you sent.
cancel_invitationaccount_id, invitation_idLinkedIn: withdraw an invitation.
search_linkedinaccount_id, keywords, category?LinkedIn: search people or companies.
list_user_postsaccount_id, identifierLinkedIn: recent posts of a person or company.
get_postaccount_id, post_idLinkedIn: one post.
list_commentsaccount_id, post_idLinkedIn: comments on a post.
create_postaccount_id, text, idempotency_keyLinkedIn: publish a post.
comment_on_postaccount_id, post_id, text, comment_id?, idempotency_keyLinkedIn: comment, or reply to a comment.
react_to_postaccount_id, post_id, reaction?, idempotency_keyLinkedIn: like, celebrate, support, love, insightful or funny.

REST API

Every request needs your key. Account ids come from GET /messaging/accounts.

MethodPathWhat it does
GET/messaging/accountsYour connected accounts
GET/messaging/accounts/{account_id}/chatsChats, newest first (cursor, limit, unread)
GET/messaging/accounts/{account_id}/chats/{chat_id}/messagesMessages in a chat
POST/messaging/accounts/{account_id}/chats/{chat_id}/messagesReply in a chat
POST/messaging/accounts/{account_id}/chatsStart a chat (WhatsApp: to.phone; Instagram, X, LinkedIn: to.username; Messenger: to.user_id)
GET/messaging/accounts/{account_id}/users/{identifier}A profile (on LinkedIn, counts as a profile view)
GET/messaging/accounts/{account_id}/chats/{chat_id}/messages/{message_id}/attachments/{attachment_id}Download an attachment
POST/messaging/webhooksGet a signed POST for every new message
GET/messaging/usageSends and new chats per account against its limits
POST/messaging/accounts/{account_id}/invitationsLinkedIn: send an invitation { to, message? }
GET / DELETE/messaging/accounts/{account_id}/invitations[/{invitation_id}]LinkedIn: sent invitations, withdraw one
POST/messaging/accounts/{account_id}/searchLinkedIn: search { keywords, category: people | companies }
GET/messaging/accounts/{account_id}/users/{identifier}/postsLinkedIn: posts of a person or company
GET/messaging/accounts/{account_id}/posts/{post_id}[/comments]LinkedIn: a post, its comments
POST/messaging/accounts/{account_id}/postsLinkedIn: publish a post { text }
POST/messaging/accounts/{account_id}/posts/{post_id}/commentsLinkedIn: comment { text, comment_id? }
POST/messaging/accounts/{account_id}/posts/{post_id}/reactionsLinkedIn: react { reaction }
GET / POST / DELETE/keysList, create and revoke keys
POST/keys/{key_id}/pause, /keys/{key_id}/resumeSwitch a key off and on again

List chats

curl "https://api.spacesos.com/v1/messaging/accounts/ACCOUNT_ID/chats?limit=20" \
  -H "Authorization: Bearer spc_live_xxxxxxxxxxxxxxxx"

Reply in a chat

curl https://api.spacesos.com/v1/messaging/accounts/ACCOUNT_ID/chats/CHAT_ID/messages \
  -H "Authorization: Bearer spc_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: reply-7781" \
  -d '{ "text": "Thanks, see you at 3." }'

Start a WhatsApp chat

curl https://api.spacesos.com/v1/messaging/accounts/ACCOUNT_ID/chats \
  -H "Authorization: Bearer spc_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-1042-confirmation" \
  -d '{ "to": { "phone": "+15551234567" }, "text": "Your order is ready." }'

Every send needs an Idempotency-Key (8 to 128 letters, digits, dots, dashes or colons). Retrying with the same key never sends twice. If we cannot tell whether a message went out, the send is marked UNKNOWN and is not retried for you.

Limits

Every account stays inside the limits each channel allows, enforced on our side for every key and every agent, however it is prompted. New accounts start lower and warm up over their first week.

ChannelBetween messagesNew chatsMessages per dayFirst week
WhatsApp15 seconds5 an hour, 10 a day200No new chats for 24 hours after connecting, then 1 an hour and 3 a day
Instagram15 seconds10 an hour, 50 a day1005 new chats an hour, 20 a day
LinkedIn20 seconds8 an hour, 30 a day10015 new chats and 10 invitations a day
Messenger20 seconds5 an hour, 15 a day505 new chats a day
X20 seconds5 an hour, 20 a day10010 new chats a day

LinkedIn actions

ActionLimit per account
Invitations5 an hour, 20 a day, 100 a week (10 a day in the first week)
Profile views20 an hour, 80 a day
Searches10 an hour, 30 a day
Reading posts, comments and invitations30 an hour, 100 a day
Comments5 an hour, 30 a day
Reactions10 an hour, 50 a day
Posts3 a day

Profile lookups on other channels: up to 100 a day on WhatsApp and 50 a day on Instagram, Messenger and X.

Replies in existing chats are never held back by the first-week limits. Over a limit you get 429 with a Retry-After header and retry_after_seconds in the body; nothing was sent. Agents should wait that long and try again. See your live numbers with GET /messaging/usage or on the dashboard.

Errors

StatusMeaning
401Missing, wrong or revoked key
403The key lacks the permission for this call; KEY_SUSPENDED means the key is paused, ACCOUNT_SUSPENDED means the workspace is suspended
404Account, chat or recipient not found
409Idempotency key reused for a different message, or a send in progress
429Over a limit; wait retry_after_seconds (also in Retry-After)
502, 503The channel is unavailable right now; nothing was sent, retry later

Pricing and channels

49 USD per connected account per month, prorated, after a 14-day trial. A card is required. The subscription renews automatically.

WhatsAppInstagramLinkedInMessengerX