# Spaces docs

Connect an account, add the MCP server or call the REST API, and let your agent read and send messages.

Human page: https://www.spacesos.com/docs. Agent guide: https://www.spacesos.com/docs/agents. Pricing: https://www.spacesos.com/pricing.md.

## Addresses

- MCP server: https://api.spacesos.com/mcp
- Onboarding MCP server (no key): https://api.spacesos.com/mcp/start
- REST base URL: https://api.spacesos.com/v1
- Auth: Authorization: Bearer spc_live_xxxxxxxxxxxxxxxx. Keys start with spc_live_ and are shown once.
- OpenAPI: https://www.spacesos.com/openapi.json
- MCP server card: https://www.spacesos.com/.well-known/mcp/server-card.json
- One MCP server per channel: https://api.spacesos.com/mcp/whatsapp, https://api.spacesos.com/mcp/instagram, https://api.spacesos.com/mcp/linkedin, https://api.spacesos.com/mcp/messenger, https://api.spacesos.com/mcp/x, https://api.spacesos.com/mcp/email. Same key and limits; an account from another channel is refused.

## 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 or Facebook Messenger (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.

## Sign up and set up from an agent

Only two steps need the person: reading the code from their inbox, and opening the link to connect an account. The first connect starts the Free plan. No card needed.

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/accounts/connect-link (or create_messaging_connect_link) returns a link where the person scans a QR code or signs in. The first connect starts the Free plan: 1 account and 25 actions a day until a card is on file, then 50.
4. To save a card and stay on the Free plan, POST /messaging/billing/card. To start Pay as you go, POST /messaging/billing/checkout (or create_messaging_billing_checkout) with plan and interval. Do that for a second account or more than 50 actions a day.
5. GET /messaging/accounts (or list_messaging_accounts) confirms the account is live.

## Connect your agent

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

Cursor, Grok and Claude can also sign in with OAuth: discovery is https://api.spacesos.com/.well-known/oauth-authorization-server, PKCE S256 is required.

## MCP tools

| Tool | Arguments | What it does |
| --- | --- | --- |
| `create_account` | `email` | Onboarding server, no key. Emails the person a 6-digit code. |
| `verify_account` | `signup_id, code` | Onboarding server. Returns the API key and how to connect. |
| `list_messaging_accounts` | none | Connected accounts on every channel. |
| `list_messaging_chats` | `account_id, cursor?, limit?, unread?` | Chats on an account, newest first. |
| `list_messaging_messages` | `account_id, chat_id, cursor?, limit?` | Messages in a chat. |
| `get_messaging_attachment` | `account_id, chat_id, message_id, attachment_id` | One attachment as base64 (up to 5 MB). |
| `reply_in_chat` | `account_id, chat_id, text, idempotency_key, attachments?` | Reply in an existing chat. Needs a key that can send. |
| `start_chat` | `account_id, to (phone, username or user_id), text, idempotency_key` | Start a new chat. Subject to the new-chat limits. |
| `create_messaging_connect_link` | `channel or account_id` | A link the person opens to connect (QR code or login), or to reconnect. |
| `disconnect_messaging_account` | `account_id` | Disconnect an account; billing for it stops. |
| `get_messaging_billing` | none | Subscription status, connected accounts and monthly total. |
| `create_messaging_billing_checkout` | `plan, interval` | Choose a paid plan. Returns a link where the person adds a card. |
| `get_profile` | `account_id, identifier` | A profile on any channel. On LinkedIn it counts as a profile view. |
| `send_invitation` | `account_id, identifier, message?, idempotency_key` | LinkedIn: invite someone to connect. |
| `list_invitations` | `account_id` | LinkedIn: pending invitations you sent. |
| `cancel_invitation` | `account_id, invitation_id` | LinkedIn: withdraw an invitation. |
| `search_linkedin` | `account_id, keywords, category?` | LinkedIn: search people or companies. |
| `list_user_posts` | `account_id, identifier` | LinkedIn: recent posts of a person or company. |
| `get_post` | `account_id, post_id` | LinkedIn: one post. |
| `list_comments` | `account_id, post_id` | LinkedIn: comments on a post. |
| `create_post` | `account_id, text, idempotency_key` | LinkedIn: publish a post. |
| `comment_on_post` | `account_id, post_id, text, comment_id?, idempotency_key` | LinkedIn: comment, or reply to a comment. |
| `react_to_post` | `account_id, post_id, reaction?, idempotency_key` | LinkedIn: like, celebrate, support, love, insightful or funny. |

## REST API

Every request needs your key. Paths are under https://api.spacesos.com/v1. Account ids come from GET /messaging/accounts.

| Method | Path | What it does |
| --- | --- | --- |
| `GET` | `/messaging/accounts` | Your connected accounts |
| `GET` | `/messaging/accounts/{account_id}/chats` | Chats, newest first (cursor, limit, unread) |
| `GET` | `/messaging/accounts/{account_id}/chats/{chat_id}/messages` | Messages in a chat |
| `POST` | `/messaging/accounts/{account_id}/chats/{chat_id}/messages` | Reply in a chat |
| `POST` | `/messaging/accounts/{account_id}/chats` | Start 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/webhooks` | Get a signed POST for new messages, reads, reactions, comments, sends, posts and account status |
| `POST` | `/messaging/webhooks/{id}/test` | Send one signed example event to that webhook now |
| `GET` | `/messaging/accounts/{id}/health` | Is this account working, and what to do if not |
| `PATCH` | `/messaging/accounts/{id}` | Tag an account with your own id (external_id) |
| `GET` | `/messaging/analytics/posts` | How your LinkedIn and Instagram posts are doing |
| `GET` | `/messaging/usage` | Sends and new chats per account against its limits |
| `POST` | `/messaging/accounts/{account_id}/invitations` | LinkedIn: send an invitation { to, message? } |
| `GET / DELETE` | `/messaging/accounts/{account_id}/invitations[/{invitation_id}]` | LinkedIn: sent invitations, withdraw one |
| `POST` | `/messaging/accounts/{account_id}/search` | LinkedIn: search { keywords, category: people \| companies } |
| `GET` | `/messaging/accounts/{account_id}/users/{identifier}/posts` | LinkedIn: 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}/posts` | LinkedIn: publish a post { text } |
| `POST` | `/messaging/accounts/{account_id}/posts/{post_id}/comments` | LinkedIn: comment { text, comment_id? } |
| `POST` | `/messaging/accounts/{account_id}/posts/{post_id}/reactions` | LinkedIn: react { reaction } |
| `GET` | `/integrations/{account_id}/tiktok/account` | TikTok: account name, followers, likes and videos. Optional start_date and end_date add views and new followers |
| `GET` | `/integrations/{account_id}/tiktok/videos` | TikTok: your videos, newest first, with caption, link, views, likes and comments |
| `POST` | `/integrations/{account_id}/tiktok/videos` | TikTok: post a video from a public https link. The owner picks privacy_level and approves the exact post (owner_approved: true) |
| `POST` | `/integrations/{account_id}/tiktok/photos` | TikTok: post up to 35 photos as one post. The owner picks privacy_level and approves the exact post |
| `GET` | `/integrations/{account_id}/tiktok/videos/{video_id}/comments` | TikTok: comments on one of your videos |
| `POST` | `/integrations/{account_id}/tiktok/videos/{video_id}/comments/{comment_id}/replies` | TikTok: reply to a comment, once the owner approves the exact reply |
| `GET / POST / DELETE` | `/keys` | List, create and revoke keys |
| `POST` | `/keys/{key_id}/pause, /keys/{key_id}/resume` | Switch a key off and on again |

Every send needs an Idempotency-Key header (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.

## Every tool (181)

MCP tool name, REST route under https://api.spacesos.com, and channels (all chat channels where the platform supports it, unless listed). Writes need an Idempotency-Key and are paced by the account limits.

### Conversations

- `list_messaging_chats`: GET /v1/messaging/accounts/{account_id}/chats. Your conversations, newest first, with their tags, owner, star and whether a person has taken them over. Filter to unread, unanswered, starred, archived, message requests, handed over, a tag or an owner.
- `list_messaging_messages`: GET /v1/messaging/accounts/{account_id}/chats/{chat_id}/messages. The messages in one conversation.
- `wait_for_events`: GET /v1/events. Wait for the next new message, comment, reaction, invitation or account change, and get it the moment it arrives. It never touches the platform, so it is the safe way to check for news.
- `create_event_webhook`: POST /v1/events/webhooks. Have each new event sent to your own URL as a signed request, for an agent that runs on a server.
- `list_event_webhooks`: GET /v1/events/webhooks. The event webhooks your key has registered and how their deliveries are going.
- `delete_event_webhook`: DELETE /v1/events/webhooks/{webhook_id}. Stop sending events to one of your URLs.
- `get_messaging_attachment`: GET /v1/messaging/accounts/{account_id}/chats/{chat_id}/messages/{message_id}/attachments/{attachment_id}. A photo, video, voice note, GIF, sticker or file from a message, or a private link to it that works for ten minutes.
- `reply_in_chat`: POST /v1/messaging/accounts/{account_id}/chats/{chat_id}/messages. Reply in a conversation, with text or attachments.
- `start_chat`: POST /v1/messaging/accounts/{account_id}/chats. Start a new conversation with someone who expects to hear from you.
- `get_chat_tags`: GET /v1/messaging/accounts/{account_id}/chats/{chat_id}/tags. The tags and the owner of a conversation.
- `set_chat_tags`: PUT /v1/messaging/accounts/{account_id}/chats/{chat_id}/tags. Tag a conversation, such as lead, order or follow up. Sends nothing.
- `set_chat_owner`: PUT /v1/messaging/accounts/{account_id}/chats/{chat_id}/owner. Give a conversation to someone on your team. Sends nothing.
- `hand_to_person`: PUT /v1/messaging/accounts/{account_id}/chats/{chat_id}/handover. Hand a conversation to a person on your team. The agent stays out of it, with no replies, scheduled messages or routines there, until it is handed back.
- `hand_back_to_agent`: DELETE /v1/messaging/accounts/{account_id}/chats/{chat_id}/handover. Hand a conversation back to the agent when the person is done.
- `mark_chat_read`: POST /v1/messaging/accounts/{account_id}/chats/{chat_id}/read. Mark a conversation as read.
- `mark_chat_unread`: POST /v1/messaging/accounts/{account_id}/chats/{chat_id}/unread. Mark a conversation as unread so a person looks at it again.
- `star_chat`: PUT /v1/messaging/accounts/{account_id}/chats/{chat_id}/star. Star a conversation to find it again with list_messaging_chats starred=true.
- `unstar_chat`: DELETE /v1/messaging/accounts/{account_id}/chats/{chat_id}/star. Remove the star from a conversation.
- `archive_chat`: PUT /v1/messaging/accounts/{account_id}/chats/{chat_id}/archive. Archive a conversation: it leaves the main inbox (list_messaging_chats archived=false) and shows with archived=true.
- `unarchive_chat`: DELETE /v1/messaging/accounts/{account_id}/chats/{chat_id}/archive. Move an archived conversation back to the main inbox.
- `pin_chat`: PUT /v1/messaging/accounts/{account_id}/chats/{chat_id}/pin. Pin a conversation at the top of the platform inbox.
- `unpin_chat`: DELETE /v1/messaging/accounts/{account_id}/chats/{chat_id}/pin. Unpin a conversation.
- `mute_chat`: PUT /v1/messaging/accounts/{account_id}/chats/{chat_id}/mute. Mute notifications for a conversation on the platform.
- `unmute_chat`: DELETE /v1/messaging/accounts/{account_id}/chats/{chat_id}/mute. Turn notifications for a conversation back on.
- `rename_chat`: PATCH /v1/messaging/accounts/{account_id}/chats/{chat_id}/name. Give a group conversation a new name.
- `send_typing`: POST /v1/messaging/accounts/{account_id}/chats/{chat_id}/typing. Show "typing..." to the other person for a few seconds, before a reply.
- `set_online_status`: PUT /v1/messaging/accounts/{account_id}/presence. Show the account as online or offline in chats.
- `delete_chat`: DELETE /v1/messaging/accounts/{account_id}/chats/{chat_id}. Delete a conversation from the account.
- `list_chat_requests`: GET /v1/messaging/accounts/{account_id}/chat-requests (Instagram). Instagram message requests: conversations started by people the account does not follow, waiting to be accepted.
- `accept_chat_request`: POST /v1/messaging/accounts/{account_id}/chat-requests/{chat_id}/accept (Instagram). Accept an Instagram message request so the conversation moves to the main inbox.
- `list_inboxes`: GET /v1/messaging/accounts/{account_id}/inboxes. The account's inboxes, such as the main inbox and message requests (pending: true).
- `list_chat_attendees`: GET /v1/messaging/accounts/{account_id}/chats/{chat_id}/attendees. The people in a conversation, with username, name and picture.
- `add_chat_participant`: POST /v1/messaging/accounts/{account_id}/chats/{chat_id}/attendees. Add a person to a group conversation.
- `remove_chat_participant`: DELETE /v1/messaging/accounts/{account_id}/chats/{chat_id}/attendees/{user_id}. Remove a person from a group conversation.
- `get_chat_picture`: GET /v1/messaging/accounts/{account_id}/chats/{chat_id}/picture. The picture of a conversation or group.
- `get_user_presence`: GET /v1/messaging/accounts/{account_id}/users/{user_id}/presence. Whether a person is online now, and when they were last seen, where the platform shows it (online null when hidden).

### Messages

- `update_chat`: PATCH /v1/messaging/accounts/{account_id}/chats/{chat_id}. Mark a chat read, mute it, or take another chat action.
- `sync_chat`: GET /v1/messaging/accounts/{account_id}/chats/{chat_id}/sync. Sync a chat from the start, or read the sync status.
- `forward_message`: POST /v1/messaging/accounts/{account_id}/messages/{message_id}/forward (WhatsApp). Forward a message. WhatsApp only.
- `list_messages`: GET /v1/messaging/accounts/{account_id}/messages. Messages across all conversations, with filters.
- `list_attendees`: GET /v1/messaging/accounts/{account_id}/attendees. People the account can message.
- `get_attendee`: GET /v1/messaging/accounts/{account_id}/attendees/{attendee_id}. One person you can message.
- `get_attendee_picture`: GET /v1/messaging/accounts/{account_id}/attendees/{attendee_id}/picture. A person’s profile picture.
- `list_attendee_chats`: GET /v1/messaging/accounts/{account_id}/attendees/{attendee_id}/chats. 1:1 chats with an attendee.
- `list_attendee_messages`: GET /v1/messaging/accounts/{account_id}/attendees/{attendee_id}/messages. Messages with an attendee.
- `sync_attendee`: GET /v1/messaging/accounts/{account_id}/attendees/{attendee_id}/sync. Sync chats for an attendee.
- `delete_message`: DELETE /v1/messaging/accounts/{account_id}/messages/{message_id}. Unsend (delete) a message this account sent.
- `edit_message`: PATCH /v1/messaging/accounts/{account_id}/messages/{message_id}. Change the text of a message this account sent.
- `add_message_reaction`: POST /v1/messaging/accounts/{account_id}/messages/{message_id}/reaction. React to a message with one emoji, such as ❤️ or 👍.
- `remove_message_reaction`: DELETE /v1/messaging/accounts/{account_id}/messages/{message_id}/reaction. Remove the reaction this account put on a message.
- `list_message_reactions`: GET /v1/messaging/accounts/{account_id}/messages/{message_id}/reactions. The emoji reactions on a message and who sent each one.
- `mark_message_read`: POST /v1/messaging/accounts/{account_id}/messages/{message_id}/read. Send a read receipt for one message from the other person (they may see "Seen").
- `pin_message`: PUT /v1/messaging/accounts/{account_id}/messages/{message_id}/pin. Pin a message at the top of the chat for everyone in it.
- `unpin_message`: DELETE /v1/messaging/accounts/{account_id}/messages/{message_id}/pin. Unpin a pinned message.

### People

- `get_profile`: GET /v1/messaging/accounts/{account_id}/users/{identifier}. A person’s profile. On LinkedIn also how you are connected, shared connections, whether you can send an InMail, and on request their about text, experience, education, skills and contact details.
- `find_chat_with_user`: GET /v1/messaging/accounts/{account_id}/users/{user_id}/chat. The existing one-to-one conversation with a person, if there is one (chat_id null when there is none: use start_chat).
- `get_own_profile`: GET /v1/messaging/accounts/{account_id}/profile. The connected account's own profile.
- `edit_own_profile`: PATCH /v1/messaging/accounts/{account_id}/profile (Instagram). Change the account's bio and profile picture.
- `follow_user`: POST /v1/messaging/accounts/{account_id}/users/{user_id}/follow (Instagram, LinkedIn). Follow a person on Instagram or LinkedIn.
- `unfollow_user`: DELETE /v1/messaging/accounts/{account_id}/users/{user_id}/follow (Instagram, LinkedIn). Stop following a person on Instagram or LinkedIn.
- `list_followers`: GET /v1/messaging/accounts/{account_id}/followers (Instagram, LinkedIn). People who follow the account, or another person with user_id (their username works on Instagram).
- `list_following`: GET /v1/messaging/accounts/{account_id}/following (Instagram, LinkedIn). Accounts the connected account follows, or another person with user_id.
- `list_follow_requests`: GET /v1/messaging/accounts/{account_id}/follow-requests (Instagram). People asking to follow a private Instagram account.
- `accept_follow_request`: POST /v1/messaging/accounts/{account_id}/follow-requests/{request_id}/accept (Instagram). Let a person follow the private Instagram account.
- `decline_follow_request`: POST /v1/messaging/accounts/{account_id}/follow-requests/{request_id}/decline (Instagram). Decline a request to follow the private Instagram account.
- `block_user`: POST /v1/messaging/accounts/{account_id}/users/{user_id}/block. Block a person: they can no longer message or follow the account.
- `unblock_user`: DELETE /v1/messaging/accounts/{account_id}/users/{user_id}/block. Unblock a person.
- `list_user_comments`: GET /v1/messaging/accounts/{account_id}/users/{user_id}/comments (Instagram, LinkedIn). Recent comments written by a person, as far as the platform shows them.
- `list_user_reactions`: GET /v1/messaging/accounts/{account_id}/users/{user_id}/reactions (Instagram, LinkedIn). Recent likes and reactions by a person, as far as the platform shows them.
- `get_account_insights`: GET /v1/messaging/accounts/{account_id}/insights (Instagram). How the Instagram account is doing: reach, views, accounts engaged, interactions, likes, comments, shares, saves, follows and profile link taps over the last day, week or 28 days.

### Posts and comments

- `list_user_posts`: GET /v1/messaging/accounts/{account_id}/users/{identifier}/posts (LinkedIn, Instagram). A person’s recent posts, with likes, comments, photos and videos.
- `get_post_analytics`: GET /v1/messaging/analytics/posts (LinkedIn, Instagram). How your posts are doing across accounts: totals, a daily series, the best posts and the change against the previous period.
- `list_own_posts`: GET /v1/messaging/accounts/{account_id}/posts (LinkedIn, Instagram). Your own posts with their numbers: likes or reactions, comments, reposts, impressions, and on LinkedIn clicks, engagement and reach.
- `get_post`: GET /v1/messaging/accounts/{account_id}/posts/{post_id} (LinkedIn, Instagram). One post with its numbers, every photo and video, and LinkedIn analytics for your own posts.
- `create_post`: POST /v1/messaging/accounts/{account_id}/posts (LinkedIn, Instagram). Publish a post: text, images or video and a link preview on LinkedIn, where you can also reshare a post or post as a company page you manage; a feed post or story with a caption and location on Instagram. On LinkedIn, mention people by their profile link.
- `schedule_post`: POST /v1/messaging/accounts/{account_id}/scheduled-posts (LinkedIn, Instagram). Publish a post at a set local time, once or every week or month, with an optional first comment.
- `list_scheduled_posts`: GET /v1/messaging/scheduled-posts (LinkedIn, Instagram). Posts waiting to be published, and the ones already out.
- `update_scheduled_post`: PATCH /v1/messaging/scheduled-posts/{scheduled_post_id} (LinkedIn, Instagram). Change a scheduled post, its time or how often it repeats.
- `cancel_scheduled_post`: DELETE /v1/messaging/scheduled-posts/{scheduled_post_id} (LinkedIn, Instagram). Cancel a scheduled post.
- `list_comments`: GET /v1/messaging/accounts/{account_id}/posts/{post_id}/comments (LinkedIn, Instagram). Comments on a post.
- `comment_on_post`: POST /v1/messaging/accounts/{account_id}/posts/{post_id}/comments (LinkedIn, Instagram). Comment on a post, or answer a comment. On LinkedIn, mention people by their profile link.
- `delete_comment`: DELETE /v1/messaging/accounts/{account_id}/posts/{post_id}/comments/{comment_id} (LinkedIn, Instagram). Delete one of your comments.
- `react_to_post`: POST /v1/messaging/accounts/{account_id}/posts/{post_id}/reactions (LinkedIn, Instagram). Like or react to a post.
- `react_to_comment`: POST /v1/messaging/accounts/{account_id}/posts/{post_id}/comments/{comment_id}/reactions (LinkedIn, Instagram). React to a comment.
- `private_reply`: POST /v1/messaging/accounts/{account_id}/posts/{post_id}/comments/{comment_id}/private-reply (Instagram). Answer a comment with a private message, when the platform allows it.
- `list_post_reactions`: GET /v1/messaging/accounts/{account_id}/posts/{post_id}/reactions (Instagram, LinkedIn). The people who liked (or reacted to) a post, with username, name and picture.
- `list_comment_reactions`: GET /v1/messaging/accounts/{account_id}/posts/{post_id}/comments/{comment_id}/reactions (Instagram, LinkedIn). The people who liked a comment.
- `unlike_post`: DELETE /v1/messaging/accounts/{account_id}/posts/{post_id}/reactions (Instagram, LinkedIn). Remove the account's like from a post.
- `unlike_comment`: DELETE /v1/messaging/accounts/{account_id}/posts/{post_id}/comments/{comment_id}/reactions (Instagram, LinkedIn). Remove the account's like from a comment.
- `edit_comment`: PATCH /v1/messaging/accounts/{account_id}/posts/{post_id}/comments/{comment_id} (Instagram, LinkedIn). Change the text of a comment this account wrote.
- `hide_comment`: POST /v1/messaging/accounts/{account_id}/posts/{post_id}/comments/{comment_id}/hide (Instagram). Hide a comment on one of the account's own Instagram posts, so only its author still sees it.
- `get_post_insights`: GET /v1/messaging/accounts/{account_id}/posts/{post_id}/insights (Instagram). How one of the account's own Instagram posts, reels or stories is doing: reach, views, likes, comments, shares, saves and interactions.
- `edit_post`: PATCH /v1/messaging/accounts/{account_id}/posts/{post_id} (Instagram, LinkedIn). Change the caption of a post this account published.
- `delete_post`: DELETE /v1/messaging/accounts/{account_id}/posts/{post_id} (Instagram, LinkedIn). Delete a post this account published.
- `get_post_media`: GET /v1/messaging/accounts/{account_id}/posts/{post_id}/media (Instagram, LinkedIn). Every photo and video of a post, reel or carousel, with a thumbnail and a short-lived link.
- `search_places`: GET /v1/messaging/accounts/{account_id}/places (Instagram). Instagram places matching a name, to tag in create_post (pass the id as location).

### LinkedIn invitations and search

- `send_invitation`: POST /v1/messaging/accounts/{account_id}/invitations (LinkedIn). Send a connection request, with an optional note.
- `list_invitations`: GET /v1/messaging/accounts/{account_id}/invitations (LinkedIn). Connection requests you have sent.
- `cancel_invitation`: DELETE /v1/messaging/accounts/{account_id}/invitations/{invitation_id} (LinkedIn). Withdraw a connection request.
- `search_linkedin`: POST /v1/messaging/accounts/{account_id}/search (LinkedIn). Search LinkedIn for people, companies, posts or jobs, with filters such as location and industry, through Sales Navigator or Recruiter, or from a search link copied from LinkedIn.
- `list_received_invitations`: GET /v1/messaging/accounts/{account_id}/invitations/received (LinkedIn). Connection requests waiting for you, with any note.
- `respond_to_invitation`: POST /v1/messaging/accounts/{account_id}/invitations/received/{invitation_id} (LinkedIn). Accept or decline a connection request.
- `set_linkedin_auto_withdraw`: PATCH /v1/messaging/accounts/{account_id}/linkedin/settings (LinkedIn). Withdraw your invitations that are still waiting after a number of days you choose. Off unless you turn it on.
- `list_search_parameters`: GET /v1/messaging/accounts/{account_id}/linkedin/search/parameters (LinkedIn). Ids LinkedIn expects instead of raw search text.
- `estimate_post_audience`: GET /v1/messaging/accounts/{account_id}/linkedin/posts/audience (LinkedIn). Estimated audience for an organization post.

### LinkedIn network

- `list_profile_viewers`: GET /v1/messaging/accounts/{account_id}/linkedin/profile-viewers (LinkedIn). Who viewed your profile recently.
- `list_relations`: GET /v1/messaging/accounts/{account_id}/relations (LinkedIn). Your connections, newest first.
- `remove_connection`: DELETE /v1/messaging/accounts/{account_id}/relations/{identifier} (LinkedIn). Remove a connection.
- `endorse_skill`: POST /v1/messaging/accounts/{account_id}/linkedin/users/{identifier}/endorse (LinkedIn). Endorse a skill someone really has.
- `get_inmail_balance`: GET /v1/messaging/accounts/{account_id}/linkedin/inmail-balance (LinkedIn). How many InMail credits you have left.
- `list_company_pages`: GET /v1/messaging/accounts/{account_id}/linkedin/company-pages (LinkedIn). The company pages you manage, to post as them.
- `get_company`: GET /v1/messaging/accounts/{account_id}/linkedin/companies/{company_id} (LinkedIn). A company page: what it does, its size and followers.

### LinkedIn jobs and Recruiter

- `list_hiring_projects`: GET /v1/messaging/accounts/{account_id}/linkedin/hiring-projects (LinkedIn). Recruiter hiring projects.
- `get_hiring_project`: GET /v1/messaging/accounts/{account_id}/linkedin/hiring-projects/{project_id} (LinkedIn). One hiring project.
- `linkedin_profile_action`: POST /v1/messaging/accounts/{account_id}/linkedin/users/{identifier}/action (LinkedIn). Recruiter or Sales Navigator action on a profile, such as saving a lead.
- `list_job_postings`: GET /v1/messaging/accounts/{account_id}/linkedin/jobs (LinkedIn). Job posts on this LinkedIn account.
- `get_job_posting`: GET /v1/messaging/accounts/{account_id}/linkedin/jobs/{job_id} (LinkedIn). One job post.
- `create_job_posting`: POST /v1/messaging/accounts/{account_id}/linkedin/jobs (LinkedIn). Create a job post draft.
- `edit_job_posting`: PATCH /v1/messaging/accounts/{account_id}/linkedin/jobs/{job_id} (LinkedIn). Edit a job post.
- `publish_job_posting`: POST /v1/messaging/accounts/{account_id}/linkedin/jobs/{job_id}/publish (LinkedIn). Publish a job draft.
- `close_job_posting`: POST /v1/messaging/accounts/{account_id}/linkedin/jobs/{job_id}/close (LinkedIn). Close a job post.
- `solve_job_checkpoint`: POST /v1/messaging/accounts/{account_id}/linkedin/jobs/{job_id}/checkpoint (LinkedIn). Solve a job publishing checkpoint.
- `sign_out_recruiter`: POST /v1/messaging/accounts/{account_id}/linkedin/recruiter/sign-out (LinkedIn). Sign out the current Recruiter session.
- `sign_out_other_recruiter_sessions`: POST /v1/messaging/accounts/{account_id}/linkedin/recruiter/sign-out-others (LinkedIn). Sign out other Recruiter sessions for this seat.
- `list_applicants`: GET /v1/messaging/accounts/{account_id}/linkedin/jobs/{job_id}/applicants (LinkedIn). People who applied.
- `get_applicant`: GET /v1/messaging/accounts/{account_id}/linkedin/jobs/{job_id}/applicants/{applicant_id} (LinkedIn). One applicant.
- `get_applicant_resume`: GET /v1/messaging/accounts/{account_id}/linkedin/jobs/{job_id}/applicants/{applicant_id}/resume (LinkedIn). Download an applicant resume.
- `list_contracts`: GET /v1/messaging/accounts/{account_id}/linkedin/contracts (LinkedIn). Recruiter or Sales Navigator contracts.
- `select_contract`: POST /v1/messaging/accounts/{account_id}/linkedin/contracts/{contract_id}/select (LinkedIn). Select the contract used by this account.

### Schedules and routines

- `schedule_message`: POST /v1/messaging/schedules. Send a message at a set local time, inside working hours you choose.
- `list_schedules`: GET /v1/messaging/schedules. Messages waiting to be sent.
- `update_schedule`: PATCH /v1/messaging/schedules/{schedule_id}. Change a scheduled message.
- `cancel_schedule`: DELETE /v1/messaging/schedules/{schedule_id}. Cancel a scheduled message.
- `create_routine`: POST /v1/messaging/routines. An automation: answer from your notes, reply to comments and message the commenter once, tag chats, call a webhook or email a summary, on a schedule or when a message or comment arrives.
- `list_routines`: GET /v1/messaging/routines. Your automations.
- `update_routine`: PATCH /v1/messaging/routines/{routine_id}. Change or pause an automation.
- `delete_routine`: DELETE /v1/messaging/routines/{routine_id}. Delete an automation.
- `list_routine_runs`: GET /v1/messaging/routines/{routine_id}/runs. What an automation did, and when.

### Pause and approvals

- `pause_all_sending`: POST /v1/messaging/pause. Stop every message, post, comment, invitation, scheduled message and routine at once. Reading keeps working.
- `resume_all_sending`: POST /v1/messaging/resume. Start sending again after a pause. Waiting scheduled messages and routines carry on.
- `set_approvals`: PATCH /v1/messaging/settings. Ask your AI agent to hold replies, new chats, posts and comments as drafts until you approve them, only posts and comments, or nothing.
- `list_approvals`: GET /v1/messaging/approvals. Replies, new chats, posts and comments waiting for you to approve them.
- `approve`: POST /v1/messaging/approvals/{approval_id}/approve. Send a waiting message or post as it is, or after you edit the text.
- `reject`: POST /v1/messaging/approvals/{approval_id}/reject. Turn down a waiting message or post, so it is never sent.
- `list_agents`: GET /v1/agents. Every AI agent with access to your Spaces, with what each may do, the accounts it may use and its daily share. Needs the "Manage other agents" permission, which you give in the dashboard.
- `update_agent`: PATCH /v1/agents/{agent_id}. Change what another AI agent may do, which accounts it may use and its daily share. The account limits always apply on top.
- `pause_agent`: POST /v1/agents/{agent_id}/pause. Pause another AI agent. It can read and send nothing until it is resumed.
- `resume_agent`: POST /v1/agents/{agent_id}/resume. Let a paused AI agent work again.
- `revoke_agent`: DELETE /v1/agents/{agent_id}. Remove an AI agent for good. Its key and sign-in stop working.
- `get_agent_activity`: GET /v1/agents/{agent_id}/activity. The last 20 things one AI agent did, newest first. No message text.

### Accounts

- `list_messaging_accounts`: GET /v1/messaging/accounts. The accounts you have connected, with their status and when each last had activity. Search by name, filter by channel or status, sort and page.
- `set_account_external_id`: PATCH /v1/messaging/accounts/{account_id}. Tag an account with your own id, such as the client it belongs to, and find it again by that id.
- `get_account_health`: GET /v1/messaging/accounts/{account_id}/health. Whether an account is working, what to do if not, and how much room it has left today.
- `create_messaging_connect_link`: POST /v1/messaging/accounts/connect-link. A link to connect a new account, or to reconnect one.
- `disconnect_messaging_account`: DELETE /v1/messaging/accounts/{account_id}. Disconnect an account.
- `get_account_limits`: GET /v1/messaging/accounts/{account_id}/limits. How much each account has used today and this week of every limit, such as “This week: 45 of 100 invitations”.
- `get_connected_account`: GET /v1/messaging/accounts/{account_id}. Status of one connected account.
- `reconnect_account`: POST /v1/messaging/accounts/{account_id}/reconnect. Start reconnecting an account that needs a sign-in.
- `solve_checkpoint`: POST /v1/messaging/accounts/{account_id}/checkpoint. Enter a sign-in or verification code the platform asked for. The code is not stored.
- `resend_checkpoint`: POST /v1/messaging/accounts/{account_id}/checkpoint/resend. Ask the platform to send the verification code again.
- `restart_account`: POST /v1/messaging/accounts/{account_id}/restart. Restart an account that has stopped syncing.
- `resync_account`: POST /v1/messaging/accounts/{account_id}/sync. Fetch an account’s messages again from the platform.

### Usage and billing

- `create_tracked_link`: POST /v1/links. Turn a booking, payment or menu link into a short link, so you can see how many people your AI agent sent there.
- `list_tracked_links`: GET /v1/links. Your agent's short links and how many people opened each one.
- `send_feedback`: POST /v1/feedback. Report a bug, a missing feature or a docs gap to the Spaces team.
- `get_messaging_usage`: GET /v1/messaging/usage. Messages sent today and this week, and how much room is left on each account.
- `export_messaging_usage`: GET /v1/messaging/usage/export. Usage by day for each account, as a spreadsheet or JSON: messages sent, new conversations and other actions. No message text.
- `get_messaging_billing`: GET /v1/messaging/billing. Your plan and billing status.
- `create_messaging_billing_checkout`: POST /v1/messaging/billing/checkout. Choose a paid plan. Returns a link where the person adds a card.
- `start_cancel_flow`: POST /v1/billing/cancel/start. Start cancelling. Returns what stops, then the reason, then one offer at a time. There is no one-step cancel.
- `get_cancel_flow`: GET /v1/billing/cancel/{flow_id}. The cancel step this flow is on, and the single offer to show.
- `submit_cancel_step`: POST /v1/billing/cancel/{flow_id}/step. Send the owner's answer for the current cancel step. Declining shows the next offer.
- `confirm_cancel`: POST /v1/billing/cancel/{flow_id}/confirm. Cancel at the end of the paid period, only after every offer was declined. It can be undone until then.
- `get_review`: GET /v1/reviews. The review and optional case study this workspace left with Spaces.
- `submit_review`: POST /v1/reviews. Leave a short review of Spaces, and optionally a case study, after the owner agrees.

### Setup and business brief

- `get_started`: GET /v1/setup/next. The next setup step, in plain words: business brief, channels, setup test, then live. An agent keeps calling it until everything is live.
- `get_business_brief`: GET /v1/workspace/brief. What your agent should know before replying: your hours, prices, common questions, tone and when to hand a chat to you.
- `set_business_brief`: PUT /v1/workspace/brief. Save the whole business brief from your answers.
- `update_business_brief`: PATCH /v1/workspace/brief. Change one part of the brief, such as holiday hours or a new price.
- `start_setup_test`: POST /v1/setup/test. Start the setup test: you send one message to your account from another phone.
- `check_setup_test`: GET /v1/setup/test. See whether the test message arrived and whether your agent replied.

## Limits

Every account stays inside the limits each channel allows, enforced for every key and every agent. New accounts start lower and warm up over four weeks. Replies in existing chats are not held back by the warm-up.

| Channel | Between messages | Messages a day | New chats | Warm-up for new chats |
| --- | --- | --- | --- | --- |
| WhatsApp | 10 seconds | 400 | 5 an hour, 10 a day | First 3 days: 1 an hour, 2 a day; Rest of week 1: 1 an hour, 3 a day; Week 2: 2 an hour, 6 a day; Weeks 3 and 4: 3 an hour, 8 a day |
| Instagram | 15 seconds | 150 | 10 an hour, 100 a day | First 3 days: 2 an hour, 22 a day; Rest of week 1: 4 an hour, 40 a day; Week 2: 6 an hour, 60 a day; Weeks 3 and 4: 8 an hour, 85 a day |
| LinkedIn | 20 seconds | 100 | 15 an hour, 100 a day | First 3 days: 3 an hour, 22 a day; Rest of week 1: 6 an hour, 40 a day; Week 2: 9 an hour, 60 a day; Weeks 3 and 4: 12 an hour, 85 a day |
| Messenger | 20 seconds | 50 | 3 an hour, 8 a day | First 3 days: 1 an hour, 2 a day; Rest of week 1: 1 an hour, 3 a day; Week 2: 2 an hour, 5 a day; Weeks 3 and 4: 2 an hour, 6 a day |
| X | 20 seconds | 100 | 5 an hour, 20 a day | First 3 days: 1 an hour, 3 a day; Rest of week 1: 2 an hour, 6 a day; Week 2: 3 an hour, 10 a day; Weeks 3 and 4: 4 an hour, 14 a day |
| Email | 30 seconds | 100 | 8 an hour, 40 a day | First 3 days: 3 an hour, 10 a day; Rest of week 1: 4 an hour, 15 a day; Week 2: 5 an hour, 22 a day; Weeks 3 and 4: 6 an hour, 30 a day |

## 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. 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). The same cold text cannot be sent to many people. If someone says stop, later sends to that chat are refused. Check GET /messaging/usage before bulk work.

## Errors

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

Every refusal carries code, error and doc_url, a page that explains the code and what to do.

## Pricing

Free to start, then $9 per connected account a month. Details: https://www.spacesos.com/pricing.md
