Spaces

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 Spaces so you can read and send my 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 spaces 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 four weeks. A customer can set a lower cap. The cap cannot go above these ceilings.

ChannelBetween messagesNew chatsMessages per dayFirst week
WhatsApp15 seconds, plus a short random wait on new chats5 an hour, 10 a day200No new chats for 24 hours, then 1 an hour and 3 a day
Instagram15 seconds6 an hour, 20 a day802 an hour, 8 a day
LinkedIn20 seconds8 an hour, 30 a day1008 new chats and 5 invitations a day
Messenger20 seconds3 an hour, 8 a day401 an hour, 3 a day
X20 seconds5 an hour, 20 a day1002 an hour, 6 a day

What each channel can do

ChannelInbox and historyDownload attachmentsSend with attachmentsNotes
WhatsAppYesYesYesNew chat uses a phone number
InstagramYesYesYesNew chat uses a username. Prefer a reply after the person has written.
MessengerYesYesYesNew chat uses the user id from an existing chat
LinkedInYesYesYesA normal message goes to a 1st-degree connection. Set inmail: true for an InMail. A connection request with a note is send_invitation.
XYesYesYesNew chat uses a username

Keeping your accounts safe

Spaces reduces ban risk with enforced limits, warm-up, pacing and an automatic pause. It cannot guarantee the platform will not restrict the account. These limits apply to the API and to MCP. A 429 means nothing was sent. Wait retry_after_seconds, then retry with the same idempotency key. A send includes account_safety (remaining today, remaining this week, whether sending is paused, and why). New chats on a fresh account ramp up over four weeks. The same cold text cannot be sent to many people. If someone says stop, later sends to that chat are refused. If the account needs a checkpoint, new credentials, or is restricted, sending pauses until it is reconnected. You can read current usage with GET /messaging/usage.

LinkedIn actions

ActionLimit per account
Invitations5 an hour, 20 a day, 100 a week (5 a day in the first week, then 10, then 15)
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

Free is $0, no card, one account, and 500 agent actions a month. Paid is $49 a month for the first connected account and $29 for each extra, with no contact fees. A card starts a 14-day trial, or 30 days with a trial code. The agent guide is at /docs/agents.

WhatsAppInstagramLinkedInMessengerX