# MakeHybrid — the whole API in one file The MakeHybrid API. This file is generated from the same manifest the reference pages and the MCP servers read, so it is never a stale copy of them. Base URL: https://app.top-voice.ai Auth: `X-API-KEY: lk_…` on every request. Errors: `{"type":"errors/","status":,"detail":"…"}`. Generated: 2026-10-26T16:40:59.099Z ## The plan - **MakeHybrid API** — $9 per seat per month, falling to $7 from 10 seats and $5 from 1,000; the tier the total falls into prices every seat. A seat is one account of each kind: LinkedIn, WhatsApp, LINE, X and ChatWoot. One key, two parts: - **The LinkedIn API.** Hosted: it signs in to LinkedIn for the member, so there is no extension, and it covers the full LinkedIn surface including messaging, invitations and search. Base path `/linkedin`. 170 operations. - **The messaging channels API.** The MakeHybrid Inbox API — one shared inbox for WhatsApp, Telegram, email, SMS, LINE, TikTok, Instagram, Facebook Messenger and custom channels, under `/inbox/v1`, 68 operations; the MakeHybrid Website chat API, the organization's own chat on its websites, answered by its team or its AI agents, under `/webchat/v1`, 13 operations; the MakeHybrid WhatsApp API, the organization's own WhatsApp number, linked by a QR code, under `/whatsapp/v1`, 11 operations; the MakeHybrid Discord API, the servers the organization added the bot to, under `/discord/v1`, 6 operations; the MakeHybrid Slack API, the workspaces the organization installed the app in, under `/slack/v1`, 8 operations; and the MakeHybrid X API, the organization's own X account under `/x/v1`, 20 operations. It has a 30-day trial covering one seat; connecting more during it means starting the subscription, and billing per seat begins that day. ## Calling it from an AI Every operation below is also an MCP tool, served as AI agents: one MCP server at one address per agent, each with its own operations. There is nothing to install. A call made that way goes through the same key check, plan check and ownership check a direct HTTP request does. - `https://app.top-voice.ai/mcp/` — every API (the all-in-one agent) - `https://app.top-voice.ai/linkedin/mcp/` — the LinkedIn agent - `https://app.top-voice.ai/campaigns/mcp/` — the Campaigns agent - `https://app.top-voice.ai/inbox/mcp/` — the Inbox agent - `https://app.top-voice.ai/discord/mcp/` — the Discord agent - `https://app.top-voice.ai/slack/mcp/` — the Slack agent - `https://app.top-voice.ai/x/mcp/` — the X agent - `https://app.top-voice.ai/whatsapp/mcp/` — the WhatsApp agent - `https://app.top-voice.ai/telegram/mcp/` — the Telegram agent - `https://app.top-voice.ai/email/mcp/` — the Email agent - `https://app.top-voice.ai/sms/mcp/` — the SMS agent - `https://app.top-voice.ai/line/mcp/` — the LINE agent - `https://app.top-voice.ai/tiktok/mcp/` — the TikTok agent - `https://app.top-voice.ai/instagram/mcp/` — the Instagram agent - `https://app.top-voice.ai/facebook/mcp/` — the Facebook Messenger agent - `https://app.top-voice.ai/webchat/mcp/` — the Website chat agent - `https://app.top-voice.ai/rooms/mcp/` — the project rooms agent - `https://app.top-voice.ai/booking/mcp/` — the booking agent ## LinkedIn API operations The hosted LinkedIn API. Paths are absolute — call them as written. ### campaigns - `GET /linkedin/campaigns`: The organization's done-for-you LinkedIn campaigns, newest first: each one's kind (boost, content or topvoice), the connected account it runs as, its state (draft, running, paused, stalled, done), its settings, when it next acts and why it stalled if it did. - `POST /linkedin/campaigns`: Start a done-for-you campaign. Send kind (boost, content or topvoice), name, account_id (one of the organization's connected LinkedIn accounts) and settings. A boost campaign takes keywords, people or companies to watch and any of react, comment, follow and invite, with per_day up to 40; a topvoice campaign takes a topic whose watched voices it answers (or voices to name them outright), top, within_hours and the same four actions; a content campaign takes a brief, an optional voice and topics, posts_per_week up to 14, hours, timezone, approve (manual or auto, manual by default) and as_company. Add key_id to name which of the organization's own AI keys writes the words, room_id to have it report into a project room, and state: running to have it begin at once. - `DELETE /linkedin/campaigns/{campaign_id}`: Delete a campaign and everything it recorded. What it already did on LinkedIn stays on LinkedIn: this removes our side only. - `GET /linkedin/campaigns/{campaign_id}`: One campaign with its settings, its state and its figures so far. - `PATCH /linkedin/campaigns/{campaign_id}`: Change a campaign: its name, account_id, settings, key_id, model, room_id, or its state. state: running starts or resumes it, paused stops it without losing anything, done finishes it. A stalled campaign is restarted the same way, once the reason in last_error is fixed. - `GET /linkedin/campaigns/{campaign_id}/actions`: What a boosting campaign did, newest first: the kind (react, comment, follow, invite, visit), whether it went through, the post, its author, and the comment or note that was written. query.since is a time in milliseconds, query.limit up to 200. - `GET /linkedin/campaigns/{campaign_id}/people`: The people a campaign has met, newest first: query.source reached for prospects it engaged with, reactor and commenter for the people who reacted or commented on the member's own posts, and no source for all of them. Each has their LinkedIn id, name, headline, profile address, how many times they were seen and the post that brought them. - `GET /linkedin/campaigns/{campaign_id}/performance`: How a campaign is doing: actions taken by kind and how many went through, posts published, the reactions, comments and reposts those posts earned, how many people it reached and how many came back to the member, over the last 7 and 30 days and in total. - `GET /linkedin/campaigns/{campaign_id}/posts`: A content campaign's posts: drafts waiting for approval, approved posts with the time they go out, and published ones with what they earned. query.state draft, approved, published, failed or skipped. - `POST /linkedin/campaigns/{campaign_id}/posts`: Add a post to a content campaign. Send text to write it yourself, or draft: true to have the organization's own AI write one from the campaign's brief. scheduled_at is a time in milliseconds; without one the campaign puts it in the next free slot. It is a draft until somebody approves it. - `DELETE /linkedin/campaigns/{campaign_id}/posts/{post_id}`: Delete a campaign post. One already published is removed from the campaign only; deleting it from LinkedIn is DELETE /linkedin/v2/{account_id}/posts/{post_id}. - `PATCH /linkedin/campaigns/{campaign_id}/posts/{post_id}`: Edit a post before it goes out, move it (scheduled_at), approve it (state: approved) or set it aside (state: skipped). Approving is what lets it be published, so never approve a post the member has not read. - `POST /linkedin/campaigns/{campaign_id}/run`: Make the campaign take its next step now instead of waiting for its turn, and answer what it did. Useful to see a new campaign work, and to retry one that stalled. - `GET /linkedin/setup`: What this organization still has to do before its LinkedIn is actually working for it, and the one call that does the next bit. Answers ready, next and steps: connect a LinkedIn account; add the organization's own AI key (which goes in on a page, never through you); start a content campaign so the account posts regularly; start a boost or Top Voices campaign so the right people see it; open a project room and point the campaigns at it; connect the channels the answers come back on; set the campaigns running. Each step says whether it is done, why it matters, and the exact call to make, worked out from what this organization actually has. A step that reads unknown is one this deployment cannot see either way - never treat it as done. Call this at the start of a conversation about setting anything up, and again after each step. - `GET /linkedin/topvoices`: Find the LinkedIn top voices on a topic, as one of the organization's connected accounts. Send query.account_id and query.topic, and query.limit up to 50. Each one comes back with a score out of 100 and the parts it is made of - reach (how many follow them), resonance (what a post of theirs earns), conversation (how much of that is comments rather than taps) and cadence (how regularly they publish) - along with the figures behind them and whether this organization already watches them. LinkedIn's own Top Voice badge is reported as badge when the profile exposes it; badge null means it did not say, never that there is none. - `GET /linkedin/topvoices/{person_id}`: One person, measured now: their score and its parts, their followers, what their recent posts earned, how often they publish, LinkedIn's badge where the profile exposes it, and the topics this organization watches them under. Send query.account_id. - `GET /linkedin/topvoices/{person_id}/posts`: What a person published lately, newest first, with each post's reactions, comments and reposts and when it went out - which is what decides whether answering it now would still be read. Send query.account_id and query.limit up to 50. - `POST /linkedin/topvoices/campaigns`: Start a campaign that answers a topic's top voices while their posts are still new. Send topic, name and account_id; add discover true to find and watch that topic's voices first (watch sets how many, 10 by default), and settings for the engagement - any of react, comment, follow and invite, comment_brief, language, per_day up to 40, within_hours up to 168 and top. Add key_id to name which of the organization's own AI keys writes the comments, room_id to have it report into a project room, and state running to have it begin at once. Everything after this - pausing it, its figures, the people it met - is the campaign surface at /linkedin/campaigns. - `GET /linkedin/topvoices/standing`: Where the member's own account stands beside the voices it watches: their score and its four parts, the figures behind it, the share of the field they are above on each part, the middle of that field to aim at, and the single part they are furthest behind on. Send query.account_id, and query.topic to compare against one topic's voices rather than all of them. - `GET /linkedin/topvoices/watchlist`: The voices this organization watches, highest-scoring first, with the topic each is watched under. query.topic narrows it to one topic and query.limit up to 500. The meta lists every topic anybody is watched under. - `POST /linkedin/topvoices/watchlist`: Watch people under a topic. Send topic, account_id (the connected account to read them as) and person_ids, up to 20 vanity slugs or member ids; the first 12 are measured in one call. Each one that could be read comes back measured and scored, and the meta names the ones LinkedIn refused with the reason. Watching the same person again under the same topic measures them afresh rather than adding a second row. - `DELETE /linkedin/topvoices/watchlist/{person_id}`: Stop watching a person. query.topic removes them from that topic only; without it they come off every topic this organization watches them under. Answers 404 if they were not on the list. ### chats - `GET /linkedin/v2/{account_id}/chats`: List all Chats - `DELETE /linkedin/v2/{account_id}/chats/{chat_id}`: Delete a Chat - `GET /linkedin/v2/{account_id}/chats/{chat_id}`: Get a Chat - `PATCH /linkedin/v2/{account_id}/chats/{chat_id}`: Update a Chat - `POST /linkedin/v2/{account_id}/chats/{chat_id}/composing`: Set Composing Status - `GET /linkedin/v2/{account_id}/chats/{chat_id}/messages`: List all Chat Messages - `DELETE /linkedin/v2/{account_id}/chats/{chat_id}/messages/{message_id}`: Delete a Message - `GET /linkedin/v2/{account_id}/chats/{chat_id}/messages/{message_id}`: Get a Message - `GET /linkedin/v2/{account_id}/chats/{chat_id}/messages/{message_id}/attachments/{attachment_id}`: Get a Message Attachment - `POST /linkedin/v2/{account_id}/chats/{chat_id}/messages/{message_id}/forward`: Forward a Message - `POST /linkedin/v2/{account_id}/chats/{chat_id}/messages/{message_id}/modify`: Modify a Message - `POST /linkedin/v2/{account_id}/chats/{chat_id}/messages/{message_id}/pin`: Pin a Message - `DELETE /linkedin/v2/{account_id}/chats/{chat_id}/messages/{message_id}/reactions`: Remove a Message Reaction - `GET /linkedin/v2/{account_id}/chats/{chat_id}/messages/{message_id}/reactions`: List all Message's Reactions - `POST /linkedin/v2/{account_id}/chats/{chat_id}/messages/{message_id}/reactions`: Add a Message Reaction - `POST /linkedin/v2/{account_id}/chats/{chat_id}/messages/{message_id}/read`: Read a Message - `POST /linkedin/v2/{account_id}/chats/{chat_id}/messages/send`: Send a Message - `GET /linkedin/v2/{account_id}/chats/{chat_id}/participants`: List all Chat Participants - `POST /linkedin/v2/{account_id}/chats/{chat_id}/participants`: Add a Chat Participant - `DELETE /linkedin/v2/{account_id}/chats/{chat_id}/participants/{user_id}`: Remove a Chat Participant - `GET /linkedin/v2/{account_id}/chats/{chat_id}/picture`: Get a Chat Picture - `POST /linkedin/v2/{account_id}/chats/send`: Start a Chat ### connect - `GET /linkedin/connect/accounts`: MakeHybrid account connection (GET /linkedin/connect/accounts) - `DELETE /linkedin/connect/accounts/{id}`: MakeHybrid account connection (DELETE /linkedin/connect/accounts/{id}) - `GET /linkedin/connect/accounts/{id}/status`: MakeHybrid account connection (GET /linkedin/connect/accounts/{id}/status) - `POST /linkedin/connect/checkpoint`: MakeHybrid account connection (POST /linkedin/connect/checkpoint) - `POST /linkedin/connect/cookie`: MakeHybrid account connection (POST /linkedin/connect/cookie) - `POST /linkedin/connect/credentials`: MakeHybrid account connection (POST /linkedin/connect/credentials) - `POST /linkedin/connect/link`: Get a link to a page for one task, to give the user: connect, reconnect or disconnect a LinkedIn account (they sign in on a secure page that handles every LinkedIn check), create an API key, add a webhook, or set up their own white-label brand. Send action: connect, reconnect, disconnect, key, webhook or brand, plus account_id to reconnect or disconnect. A password, a new key, a signing secret or a payment key stays on that page and never comes back through the chat. The link lasts an hour. Check the outcome with GET /linkedin/connect/link/{handle}. - `GET /linkedin/connect/link/{handle}`: How a link went: waiting, connected, reconnected, disconnected, done (a key or webhook was made), failed or expired, with the account_id once known and a reason when it failed. A brand link stays waiting for its hour; the brand itself is the result. - `GET /linkedin/connect/options`: MakeHybrid account connection (GET /linkedin/connect/options) ### inboxes - `GET /linkedin/v2/{account_id}/inboxes/{inbox_id}/chats`: List Inbox Chats - `POST /linkedin/v2/{account_id}/inboxes/{inbox_id}/chats`: Start a Chat from Inbox - `POST /linkedin/v2/{account_id}/inboxes/{inbox_id}/chats/send`: Start a Chat from Inbox ### linkedin - `POST /linkedin/v2/{account_id}/linkedin`: Perform a Request to any LinkedIn API Endpoint - `GET /linkedin/v2/{account_id}/linkedin/analytics/profile-views`: List Profile Views - `GET /linkedin/v2/{account_id}/linkedin/company/{company_id}`: Get a Company Profile - `POST /linkedin/v2/{account_id}/linkedin/company/{company_id}/follow-requests`: Invite Members to Follow a Company - `GET /linkedin/v2/{account_id}/linkedin/company/{company_id}/follow-requests/credits`: Get Company Follow Request Credits - `POST /linkedin/v2/{account_id}/linkedin/company/{company_id}/member/submit-otp`: Submit Otp Verification Code - `GET /linkedin/v2/{account_id}/linkedin/company/pages`: List Managed Company Pages - `GET /linkedin/v2/{account_id}/linkedin/contracts`: List Available Contracts - `POST /linkedin/v2/{account_id}/linkedin/contracts/{contract_id}/select`: Select a Contract - `GET /linkedin/v2/{account_id}/linkedin/inmail-credit-balance`: Get InMail Credit Balance - `GET /linkedin/v2/{account_id}/linkedin/inmail-credits`: Get InMail Credits - `GET /linkedin/v2/{account_id}/linkedin/jobs`: List User Job Postings - `POST /linkedin/v2/{account_id}/linkedin/jobs`: Create a Job Posting Draft - `GET /linkedin/v2/{account_id}/linkedin/jobs/{job_id}`: Get a Job Posting - `PATCH /linkedin/v2/{account_id}/linkedin/jobs/{job_id}`: Edit an existing Job Posting - `POST /linkedin/v2/{account_id}/linkedin/jobs/{job_id}/applicants`: List Job Posting Applicants - `GET /linkedin/v2/{account_id}/linkedin/jobs/{job_id}/applicants/{applicant_id}`: Get an Applicant - `GET /linkedin/v2/{account_id}/linkedin/jobs/{job_id}/applicants/{applicant_id}/resume`: Get an Applicant's Resume - `GET /linkedin/v2/{account_id}/linkedin/jobs/{job_id}/budget`: Get the Budget for a Job Posting - `POST /linkedin/v2/{account_id}/linkedin/jobs/{job_id}/close`: Close a Job Posting - `POST /linkedin/v2/{account_id}/linkedin/jobs/{job_id}/publish`: Publish a Job Posting - `POST /linkedin/v2/{account_id}/linkedin/member/{member_id}/endorse-skill`: Endorse a Member's Skill - `GET /linkedin/v2/{account_id}/linkedin/projects`: List all Recruiter Hiring Projects - `POST /linkedin/v2/{account_id}/linkedin/recruiter/company/{company_id}/member/submit-otp`: Submit Otp Verification Code - `GET /linkedin/v2/{account_id}/linkedin/recruiter/job-slots-credits`: Get Job Slots Credits - `GET /linkedin/v2/{account_id}/linkedin/recruiter/jobs`: List Job Postings - `POST /linkedin/v2/{account_id}/linkedin/recruiter/jobs`: Create a Job Posting Draft in a New Project - `GET /linkedin/v2/{account_id}/linkedin/recruiter/jobs/{job_id}`: Get a Job Posting - `GET /linkedin/v2/{account_id}/linkedin/recruiter/projects`: List Projects - `POST /linkedin/v2/{account_id}/linkedin/recruiter/projects`: Create a New Project - `GET /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}`: Get a Project - `PATCH /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}`: Edit a Project - `GET /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/jobs`: Get a Job Posting by Project - `POST /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/jobs`: Create a Job Posting Draft in an Existing Project - `PATCH /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/jobs/{job_id}`: Edit an Existing Job Posting - `GET /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/jobs/{job_id}/budget`: Get the Budget for a Job Posting - `POST /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/jobs/{job_id}/close`: Close a Job Posting - `POST /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/jobs/{job_id}/publish`: Publish a Job Posting - `POST /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/pipeline`: List Pipeline Candidates - `POST /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/pipeline/candidate/save`: Save a Candidate - `POST /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/talent-pool/applicants`: List Job Posting Applicants - `GET /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/talent-pool/applicants/{applicant_id}`: Get an Applicant - `GET /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/talent-pool/applicants/{applicant_profile_id}/resume`: Get an Applicant's Resume - `POST /linkedin/v2/{account_id}/linkedin/recruiter/projects/{project_id}/talent-pool/search`: Perform People Search From Talent Pool - `POST /linkedin/v2/{account_id}/linkedin/recruiter/search`: Perform Recruiter Search from URL - `POST /linkedin/v2/{account_id}/linkedin/recruiter/search/parameters`: List Search Parameters - `POST /linkedin/v2/{account_id}/linkedin/recruiter/search/people`: Perform People Search - `GET /linkedin/v2/{account_id}/linkedin/sales-navigator/account-lists`: Get Accounts Lists - `POST /linkedin/v2/{account_id}/linkedin/sales-navigator/account-lists/{list_id}`: Browse an Account List - `POST /linkedin/v2/{account_id}/linkedin/sales-navigator/account-lists/{list_id}/save`: Save an Account To a List - `GET /linkedin/v2/{account_id}/linkedin/sales-navigator/lead-lists`: Get Leads Lists - `POST /linkedin/v2/{account_id}/linkedin/sales-navigator/lead-lists/{list_id}`: Browse a Lead List - `POST /linkedin/v2/{account_id}/linkedin/sales-navigator/lead-lists/{list_id}/save`: Save a Lead To a List - `POST /linkedin/v2/{account_id}/linkedin/sales-navigator/search`: Perform Search from URL - `POST /linkedin/v2/{account_id}/linkedin/sales-navigator/search/companies`: Perform Companies Search - `GET /linkedin/v2/{account_id}/linkedin/sales-navigator/search/parameters`: List Search Parameters - `POST /linkedin/v2/{account_id}/linkedin/sales-navigator/search/people`: Perform People Search - `POST /linkedin/v2/{account_id}/linkedin/search`: Perform Classic Search from URL - `POST /linkedin/v2/{account_id}/linkedin/search/companies`: Perform Companies Search - `POST /linkedin/v2/{account_id}/linkedin/search/jobs`: Perform Jobs Search - `GET /linkedin/v2/{account_id}/linkedin/search/parameters`: List Search Parameters - `POST /linkedin/v2/{account_id}/linkedin/search/people`: Perform People Search - `POST /linkedin/v2/{account_id}/linkedin/search/posts`: Perform Posts Search ### pages - `GET /linkedin/pages/{company_id}`: Read a LinkedIn company page you administer, as one of your connected accounts (query account_id): its name, tagline, overview (the About text), website, page address, industries, company size, company type, phone, year founded, specialties, custom button, logo and cover, and the sizes, types and buttons this page accepts. company_id is the page's number or its urn. - `PATCH /linkedin/pages/{company_id}`: Edit a LinkedIn company page you administer, as one of your connected accounts (account_id): any of name, tagline, overview, website, page_address, industries, company_size (SIZE_2_TO_10 and so on), company_type (PRIVATELY_HELD and so on), phone, founded_year, specialties and custom_button ({label, url}, a label the page offers). Answers, field by field, whether the page now shows it: LinkedIn accepts some changes without making them. - `POST /linkedin/pages/{company_id}/cover`: Replace a LinkedIn company page's cover image, as one of your connected accounts (account_id): send image_url, a public https address of a PNG or JPEG, or upload the file as multipart field image. LinkedIn wants 1512 by 256. - `POST /linkedin/pages/{company_id}/logo`: Replace a LinkedIn company page's logo, as one of your connected accounts (account_id): send image_url, a public https address of a PNG or JPEG, or upload the file as multipart field image. A square picture of 400 by 400 or more works best. ### posts - `POST /linkedin/v2/{account_id}/posts`: Create a Post - `DELETE /linkedin/v2/{account_id}/posts/{post_id}`: Delete a Post - `GET /linkedin/v2/{account_id}/posts/{post_id}`: Get a Post - `PATCH /linkedin/v2/{account_id}/posts/{post_id}`: Update a Post - `GET /linkedin/v2/{account_id}/posts/{post_id}/comments`: List all Post's Comments - `POST /linkedin/v2/{account_id}/posts/{post_id}/comments`: Add Comment to a Post - `DELETE /linkedin/v2/{account_id}/posts/{post_id}/comments/{comment_id}`: Delete Comment from a Post - `PATCH /linkedin/v2/{account_id}/posts/{post_id}/comments/{comment_id}`: Update a Comment - `POST /linkedin/v2/{account_id}/posts/{post_id}/comments/{comment_id}`: Reply to a Comment - `DELETE /linkedin/v2/{account_id}/posts/{post_id}/comments/{comment_id}/reactions`: Remove Reaction from a Comment - `GET /linkedin/v2/{account_id}/posts/{post_id}/comments/{comment_id}/reactions`: List all Comment's Reactions - `POST /linkedin/v2/{account_id}/posts/{post_id}/comments/{comment_id}/reactions`: Add Reaction to a Comment - `GET /linkedin/v2/{account_id}/posts/{post_id}/comments/{comment_id}/replies`: List all Comment's Replies - `DELETE /linkedin/v2/{account_id}/posts/{post_id}/reactions`: Remove Reaction from a Post - `GET /linkedin/v2/{account_id}/posts/{post_id}/reactions`: List all Post's Reactions - `POST /linkedin/v2/{account_id}/posts/{post_id}/reactions`: Add Reaction to a Post ### users - `GET /linkedin/v2/{account_id}/users/{user_id}`: Get a User Profile - `PATCH /linkedin/v2/{account_id}/users/{user_id}`: Update a User Profile - `GET /linkedin/v2/{account_id}/users/{user_id}/chat`: Get a User Chat - `GET /linkedin/v2/{account_id}/users/{user_id}/comments`: List all User Comments - `GET /linkedin/v2/{account_id}/users/{user_id}/followers`: List Followers of a User - `GET /linkedin/v2/{account_id}/users/{user_id}/following`: List Following of a User - `GET /linkedin/v2/{account_id}/users/{user_id}/followings`: List all User Followings - `GET /linkedin/v2/{account_id}/users/{user_id}/picture`: Get a User Picture - `GET /linkedin/v2/{account_id}/users/{user_id}/posts`: List all User's Posts - `GET /linkedin/v2/{account_id}/users/{user_id}/presence`: Get a User Presence - `GET /linkedin/v2/{account_id}/users/{user_id}/reactions`: List all User Reactions - `GET /linkedin/v2/{account_id}/users/{user_id}/relations`: List Relations of a User - `POST /linkedin/v2/{account_id}/users/me/follow/{user_id}`: Follow a User - `GET /linkedin/v2/{account_id}/users/me/relation-requests`: List all pending Relation / Follow requests - `POST /linkedin/v2/{account_id}/users/me/relation-requests`: Send a Relation request - `POST /linkedin/v2/{account_id}/users/me/relation-requests/{request_id}/accept`: Accept a Relation request - `POST /linkedin/v2/{account_id}/users/me/relation-requests/{request_id}/cancel`: Cancel or Refuse a Relation / Follow request - `POST /linkedin/v2/{account_id}/users/me/relation-requests/{user_id}`: Send a Relation request - `DELETE /linkedin/v2/{account_id}/users/me/relations/{user_id}`: Delete a Relation - `POST /linkedin/v2/{account_id}/users/me/unfollow/{user_id}`: Unfollow a User - `POST /linkedin/v2/{account_id}/users/visit-profile`: Report a Profile Visit ### webhooks - `POST /linkedin/webhooks/deliveries/{id}/replay`: MakeHybrid webhooks (POST /linkedin/webhooks/deliveries/{id}/replay) - `GET /linkedin/webhooks/endpoints`: MakeHybrid webhooks (GET /linkedin/webhooks/endpoints) - `POST /linkedin/webhooks/endpoints`: MakeHybrid webhooks (POST /linkedin/webhooks/endpoints) - `DELETE /linkedin/webhooks/endpoints/{id}`: MakeHybrid webhooks (DELETE /linkedin/webhooks/endpoints/{id}) - `GET /linkedin/webhooks/endpoints/{id}`: MakeHybrid webhooks (GET /linkedin/webhooks/endpoints/{id}) - `PATCH /linkedin/webhooks/endpoints/{id}`: MakeHybrid webhooks (PATCH /linkedin/webhooks/endpoints/{id}) - `GET /linkedin/webhooks/endpoints/{id}/deliveries`: MakeHybrid webhooks (GET /linkedin/webhooks/endpoints/{id}/deliveries) - `GET /linkedin/webhooks/inbox`: Read the AI inbox: what happened on your connected LinkedIn accounts (messages received and sent, new relations, account status changes and checkpoints), in your shared inbox (inbox.* events) and on your X account (x.message_*), oldest first, kept 30 days. Pass query.after = the next value from your last read to see only what is new, query.event to filter, query.since for a time. - `POST /linkedin/webhooks/inbox`: Open the AI inbox: a webhook kept for your AI instead of sent anywhere, receiving every event: your connected LinkedIn accounts, your shared inbox and your X account. Opened for you when an AI connection is created; calling it again answers the same inbox. - `GET /linkedin/webhooks/status`: MakeHybrid webhooks (GET /linkedin/webhooks/status) ## MakeHybrid Inbox API operations One shared inbox for every channel, on the same key. Paths are absolute — call them as written. ### inbox - `GET /inbox/v1/account`: Whether your organization's shared inbox account exists yet, how many inboxes (channels) it has, and whether its events reach your webhooks. Never creates the account. - `POST /inbox/v1/account`: Create your organization's shared inbox account now, or answer the existing one (201 when created, 200 when it was there). Any other inbox call also creates it on the way. - `GET /inbox/v1/agents`: The agents of your inbox account, with their ids for assignment. - `GET /inbox/v1/canned_responses`: List saved replies, each with a short_code and its content. - `POST /inbox/v1/canned_responses`: Save a reply for later: body {short_code, content}. - `DELETE /inbox/v1/canned_responses/{id}`: Delete a saved reply. - `PATCH /inbox/v1/canned_responses/{id}`: Change a saved reply. - `POST /inbox/v1/channels/twilio_channel`: Add an SMS or WhatsApp inbox through Twilio: body {twilio_channel:{name, medium: sms or whatsapp, account_sid, auth_token, phone_number or messaging_service_sid}}. - `GET /inbox/v1/contacts`: List contacts, the people who write to you on any channel: query page, sort. - `POST /inbox/v1/contacts`: Add a contact: body {name, email, phone_number (+15550199), identifier, custom_attributes, inbox_id (also give them an address in that inbox)}. - `DELETE /inbox/v1/contacts/{id}`: Delete a contact. Ask the user first. - `GET /inbox/v1/contacts/{id}`: Read one contact: name, email, phone number, identifier, custom attributes. - `PATCH /inbox/v1/contacts/{id}`: Change a contact: name, email, phone_number, identifier, custom_attributes. - `POST /inbox/v1/contacts/{id}/contact_inboxes`: Give a contact an address in an inbox, so you can write to them there: body {inbox_id, source_id (their phone number or email address)}. - `GET /inbox/v1/contacts/{id}/contactable_inboxes`: The inboxes a contact can be written to from, with their address in each. - `GET /inbox/v1/contacts/{id}/conversations`: Every conversation with one contact, on every channel. - `GET /inbox/v1/contacts/{id}/labels`: The labels on one contact. - `POST /inbox/v1/contacts/{id}/labels`: Set a contact's labels to exactly these: body {labels:[...]}. - `GET /inbox/v1/contacts/{id}/notes`: Your team's notes on a contact. - `POST /inbox/v1/contacts/{id}/notes`: Add a note to a contact: body {content}. - `DELETE /inbox/v1/contacts/{id}/notes/{note_id}`: Delete a note on a contact. - `PATCH /inbox/v1/contacts/{id}/notes/{note_id}`: Change a note on a contact: body {content}. - `POST /inbox/v1/contacts/filter`: Filter contacts by any attribute: body {payload:[{attribute_key, filter_operator, values, query_operator}]}. - `GET /inbox/v1/contacts/search`: Find contacts by name, email, phone number or identifier: query q, page. - `GET /inbox/v1/conversations`: List conversations across every channel, newest activity first, 25 a page: query status (open, resolved, pending, snoozed, all), inbox_id (one channel), assignee_type (me, unassigned, assigned, all), labels, q (words in the messages), page. - `POST /inbox/v1/conversations`: Start a conversation with a contact: body {inbox_id, contact_id, source_id (their address in that inbox: phone number, email), message:{content}}. Some channels only allow a template the platform approved when you write first. - `GET /inbox/v1/conversations/{id}`: Read one conversation: its contact, inbox, status, assignee, labels and latest messages. - `POST /inbox/v1/conversations/{id}/assignments`: Assign a conversation: body {assignee_id} for an agent or {team_id} for a team. - `POST /inbox/v1/conversations/{id}/custom_attributes`: Set a conversation's custom attributes: body {custom_attributes:{key: value}}. - `GET /inbox/v1/conversations/{id}/labels`: A conversation's labels. - `POST /inbox/v1/conversations/{id}/labels`: Set a conversation's labels to exactly these: body {labels:[...]}. - `GET /inbox/v1/conversations/{id}/messages`: Read a conversation's messages, oldest first: who wrote each (message_type 0 incoming from the customer, 1 outgoing from you, 2 activity) and any attachments. - `POST /inbox/v1/conversations/{id}/messages`: Reply in a conversation on the customer's own channel: body {content, message_type: outgoing}. With private: true it is an internal note only your team sees. In an API inbox, message_type incoming records what the customer wrote. - `DELETE /inbox/v1/conversations/{id}/messages/{message_id}`: Delete a message from a conversation. - `POST /inbox/v1/conversations/{id}/toggle_priority`: Set a conversation's priority: body {priority: urgent, high, medium, low or none}. - `POST /inbox/v1/conversations/{id}/toggle_status`: Change a conversation's status: body {status: open, resolved, pending or snoozed, snoozed_until?}. Resolve it when the customer's question is answered. - `POST /inbox/v1/conversations/{id}/update_last_seen`: Mark a conversation read: its unread count goes back to zero until the customer writes again. - `POST /inbox/v1/conversations/filter`: Filter conversations by any attribute: body {payload:[{attribute_key, filter_operator, values, query_operator}]}. - `GET /inbox/v1/conversations/meta`: How many conversations there are: mine, unassigned and all, for the same filters as the list. - `GET /inbox/v1/custom_attribute_definitions`: List the custom attributes defined for conversations and contacts: query attribute_model (0 conversation, 1 contact). - `POST /inbox/v1/custom_attribute_definitions`: Define a custom attribute: body {attribute_display_name, attribute_key, attribute_display_type (text, number, link, date, list, checkbox), attribute_model (conversation_attribute or contact_attribute)}. - `DELETE /inbox/v1/custom_attribute_definitions/{id}`: Delete a custom attribute's definition. - `PATCH /inbox/v1/custom_attribute_definitions/{id}`: Change a custom attribute's definition. - `POST /inbox/v1/facebook/link`: Get a link that adds a Facebook page's Messenger as an inbox: give the url to the user to open, sign in with Facebook and pick the page; nothing secret passes through the chat. It lasts an hour. 404 not_offered when Facebook is not set up on this server. - `GET /inbox/v1/facebook/link/{handle}`: How a Facebook link went: waiting, picking (signed in, choosing a page), connected (with inbox_id and page_name), failed (failure: denied, no_pages, unavailable) or expired. - `DELETE /inbox/v1/inbox_members`: Take agents off an inbox: body {inbox_id, user_ids}. - `PATCH /inbox/v1/inbox_members`: Replace an inbox's agents with exactly these: body {inbox_id, user_ids}. - `POST /inbox/v1/inbox_members`: Add agents to an inbox: body {inbox_id, user_ids}. - `GET /inbox/v1/inbox_members/{inbox_id}`: The agents of one inbox. - `GET /inbox/v1/inboxes`: List the inboxes, one per connected channel: id, name and channel_type (Channel::Whatsapp, Channel::Telegram, Channel::Email, Channel::Sms, Channel::TwilioSms, Channel::Line, Channel::WebWidget, Channel::Api, Channel::Tiktok, Channel::Instagram, Channel::FacebookPage). Use the id as inbox_id elsewhere. - `POST /inbox/v1/inboxes`: Add an inbox for a channel: body {name, channel:{type, ...}} with type line (line_channel_id, line_channel_secret, line_channel_token), sms (Bandwidth: phone_number, provider_config), whatsapp (WhatsApp Cloud: phone_number, provider whatsapp_cloud, provider_config api_key, phone_number_id, business_account_id), email (IMAP/SMTP settings), telegram (bot_token), web_widget (website_url) or api (webhook_url). The answer's callback_webhook_url is the address to give the platform. - `DELETE /inbox/v1/inboxes/{id}`: Remove an inbox and every conversation in it. Ask the user first. - `GET /inbox/v1/inboxes/{id}`: Read one inbox: its channel, settings and, for LINE, SMS and WhatsApp, the callback_webhook_url to give the platform. - `PATCH /inbox/v1/inboxes/{id}`: Change an inbox: name, greeting_enabled and greeting_message, working hours, auto-assignment or channel settings. - `POST /inbox/v1/instagram/authorization`: Get a sign-in link that adds an Instagram inbox: give the url to the user to open and sign in with their Instagram professional account; the inbox appears when they finish. - `GET /inbox/v1/labels`: List the labels conversations and contacts can carry. - `POST /inbox/v1/labels`: Add a label: body {title, description, color, show_on_sidebar}. - `DELETE /inbox/v1/labels/{id}`: Delete a label, from every conversation and contact that carries it. - `PATCH /inbox/v1/labels/{id}`: Change a label: title, description, color, show_on_sidebar. - `GET /inbox/v1/teams`: List teams, which conversations can be assigned to. - `POST /inbox/v1/teams`: Add a team: body {name, description, allow_auto_assign}. - `DELETE /inbox/v1/teams/{id}`: Delete a team. Its conversations stay, unassigned from it. - `PATCH /inbox/v1/teams/{id}`: Change a team: name, description, allow_auto_assign. - `DELETE /inbox/v1/teams/{id}/team_members`: Take agents off a team: body {user_ids}. - `GET /inbox/v1/teams/{id}/team_members`: The agents in one team. - `PATCH /inbox/v1/teams/{id}/team_members`: Replace a team's agents with exactly these: body {user_ids}. - `POST /inbox/v1/teams/{id}/team_members`: Add agents to a team: body {user_ids}. - `POST /inbox/v1/tiktok/authorization`: Get a sign-in link that adds a TikTok inbox: give the url to the user to open and sign in with their TikTok business account; the inbox appears when they finish. ## MakeHybrid Website chat API operations The organization's own chat on its websites: its chats, their conversations and the team's answers, on the same key. ### webchat - `GET /webchat/v1/agents`: The organization's AI agents a website chat or a conversation can be given to, each with the room it belongs to. They answer visitors without tools, on the organization's own AI key. - `GET /webchat/v1/conversations`: Conversations, the most recently active first: status open (default), resolved or all; widget_id; assignee nobody, member:{id} or agent:{id}; limit up to 100, and before = the answer's next for the page after. - `GET /webchat/v1/conversations/{id}`: One conversation: the visitor (name, email), the page it began on, its status, who it is assigned to, unread messages and the last message. - `PATCH /webchat/v1/conversations/{id}`: Resolve or reopen a conversation (status resolved or open), or assign it: assignee {kind: member, id} for one of the organization's members, {kind: agent, id} for one of its AI agents, which then answers the visitor, or null for nobody. - `GET /webchat/v1/conversations/{id}/messages`: A conversation's messages, oldest first: the visitor's, the team's (members, AI agents, this API), private notes and the chat's own notices. after = a message id for only what is newer; limit up to 200. - `POST /webchat/v1/conversations/{id}/messages`: Answer the visitor: text, up to 4,000 characters, shown under author_name (default: the chat's name). private true writes a note only the team sees. A visitor who has left sees it when they come back. - `POST /webchat/v1/conversations/{id}/read`: Mark a conversation read: its unread count goes back to zero. - `GET /webchat/v1/rooms`: The organization's rooms, for room_id: a website chat's conversations become tasks there, one per visitor, assigned as the conversation is. - `GET /webchat/v1/widgets`: The organization's website chats, each with its id, look, sites, the room its conversations become tasks in (room_id), the AI agent that answers first (agent_id) and the snippet to paste into a website's pages. - `POST /webchat/v1/widgets`: Add a website chat: name (what visitors see), color (#rrggbb), greeting, sites (host names that may show it, *.example.com for subdomains; none means any), ask_email (off, optional, required), room_id and agent_id. The answer's snippet goes before on every page. - `DELETE /webchat/v1/widgets/{id}`: Remove a website chat and every conversation it had. Pages that still carry its snippet show nothing. - `GET /webchat/v1/widgets/{id}`: One website chat, with its snippet. - `PATCH /webchat/v1/widgets/{id}`: Change a website chat: any of name, color, greeting, sites, ask_email, room_id and agent_id; null clears room_id or agent_id. The snippet stays the same. ## MakeHybrid WhatsApp API operations The organization's own WhatsApp number, linked by a QR code, on the same key. ### whatsapp - `GET /whatsapp/v1/chats`: The number's chats, newest first: limit, offset. - `GET /whatsapp/v1/chats/{chat_id}/messages`: A chat's messages, newest first: limit, offset. Text only: a picture or file is marked has_media, without its file. - `POST /whatsapp/v1/chats/{chat_id}/seen`: Mark a chat's messages read. - `GET /whatsapp/v1/chats/overview`: The number's chats with each one's last message and unread count: limit, offset. - `DELETE /whatsapp/v1/connection`: Unlink the WhatsApp number, for rooms and API alike; it leaves the phone's Linked devices. - `GET /whatsapp/v1/connection`: Whether a WhatsApp number is linked, with its phone number and name, or the state it is in. - `PUT /whatsapp/v1/connection`: Link the organization's own WhatsApp number, as WhatsApp Web is linked: answers connected, or a QR code (qr_image) for the phone to scan in WhatsApp, Settings, Linked devices. Call again for a fresh code; it changes every 20 seconds. - `POST /whatsapp/v1/connection/link`: A one-hour link to a page that shows the QR code to scan, kept fresh: give it to the person holding the phone. - `GET /whatsapp/v1/contacts/check`: Whether a phone number is on WhatsApp, and its chat_id: phone, digits with the country code. - `GET /whatsapp/v1/groups`: The groups the number is in, with their chat_id. - `POST /whatsapp/v1/messages`: Send a text from the linked number: to is a phone number like +15551234567, or a chat_id such as 15551234567@c.us or a group's ...@g.us. Messages are paced 10 to 20 seconds apart, as a person types. ## MakeHybrid Discord API operations The Discord servers the organization added the bot to, on the same key. ### discord - `GET /discord/v1/channels/{channel_id}/messages`: A channel's messages, newest first: limit up to 100, before or after a message id. - `POST /discord/v1/channels/{channel_id}/messages`: Post in a channel as the bot: content, up to 2,000 characters, and reply_to, a message id to answer. It pings nobody. - `POST /discord/v1/connection/link`: A link to Discord's own page that adds the bot to a server the user manages: give it to them. Once they pick the server and authorize, the server is the organization's for this API and for project rooms. - `GET /discord/v1/servers`: The Discord servers the organization has added the bot to, with their guild_id. - `DELETE /discord/v1/servers/{guild_id}`: Let go of a server: the bot leaves it, for rooms and API alike. - `GET /discord/v1/servers/{guild_id}/channels`: A server's text channels, with their channel_id, in the server's own order. ## MakeHybrid Slack API operations The Slack workspaces the organization installed the app in, on the same key. ### slack - `POST /slack/v1/connection/link`: A link to Slack's own page that installs the app in a workspace: give it to someone who may add apps there. Once they allow it, the workspace is the organization's for this API and for project rooms. - `GET /slack/v1/workspaces`: The Slack workspaces the organization installed the app in, with their team_id. - `DELETE /slack/v1/workspaces/{team_id}`: Let go of a workspace: the app's access to it is revoked, for rooms and API alike. - `GET /slack/v1/workspaces/{team_id}/channels`: A workspace's channels: every public one, and the private ones the app was invited to, with channel_id and whether the app is a member. limit up to 1,000 and cursor to page. - `GET /slack/v1/workspaces/{team_id}/channels/{channel_id}/messages`: A channel's messages, newest first: limit up to 200, cursor to page, oldest and latest as Slack timestamps (ts). The app joins a public channel it is not in. - `POST /slack/v1/workspaces/{team_id}/channels/{channel_id}/messages`: Post in a channel as the app: text, up to 4,000 characters; thread_ts, a message's ts to reply in its thread; username, a name to post under. It pings nobody, and the app joins a public channel it is not in. - `GET /slack/v1/workspaces/{team_id}/channels/{channel_id}/messages/{ts}/replies`: A thread: the message with timestamp ts and its replies, oldest first, limit up to 200 and cursor to page. - `GET /slack/v1/workspaces/{team_id}/users/{user_id}`: A person in the workspace: their display name, real name, time zone and whether they are a bot. Message user_id values are these. ## MakeHybrid X API operations The organization's own X account, through its own X app, on the same key. ### x - `POST /x/v1/2/dm_conversations`: Start a group conversation on X: body {conversation_type: Group, participant_ids, message:{text}}. - `GET /x/v1/2/dm_conversations/{dm_conversation_id}/dm_events`: The direct messages of one X conversation (two user ids joined by -, or a group's id). - `POST /x/v1/2/dm_conversations/{dm_conversation_id}/messages`: A direct message on X to an existing conversation: body {text}. - `GET /x/v1/2/dm_conversations/with/{participant_id}/dm_events`: Your direct messages with one person on X, by their user id. - `POST /x/v1/2/dm_conversations/with/{participant_id}/messages`: A direct message on X to one person, by their user id: body {text}. POST /x/v1/messages does the same and also handles X Chat. - `GET /x/v1/2/dm_events`: Your recent direct messages on X, across conversations: query max_results, pagination_token, dm_event.fields. - `DELETE /x/v1/2/dm_events/{id}`: Delete a direct message you sent on X. - `GET /x/v1/2/dm_events/{id}`: One direct message on X. - `POST /x/v1/2/tweets`: Post on X as your account, or reply: body {text, reply?:{in_reply_to_tweet_id}}. Public: confirm the wording with the user first. - `DELETE /x/v1/2/tweets/{id}`: Delete one of your posts on X. Ask the user first. - `GET /x/v1/2/tweets/{id}`: Read one post on X. - `GET /x/v1/2/users/{id}`: An X account by user id: query user.fields as in X's API. - `GET /x/v1/2/users/{id}/mentions`: Recent posts that mention a person on X: query max_results, pagination_token, tweet.fields. - `GET /x/v1/2/users/{id}/tweets`: A person's recent posts on X: query max_results, pagination_token, tweet.fields. - `GET /x/v1/2/users/by/username/{username}`: An X account by username, without the @: query user.fields as in X's API. - `GET /x/v1/2/users/me`: Your connected X account, as X describes it. - `DELETE /x/v1/connection`: Disconnect the X account, for this API and project rooms alike. Ask the user first. - `GET /x/v1/connection`: Whether an X account is connected, and which: user_id, username, and x_chat (whether X Chat's encrypted messages are on). - `PUT /x/v1/connection`: Connect your own X account with your own X app's keys from console.x.com: body {api_key, api_secret, access_token, access_secret, chat_pin? (the X Chat passcode, for encrypted messages)}. The keys are checked with X and never answered back. - `POST /x/v1/messages`: Send a message on X to one person: body {to: an X user id or a username such as @pat, text}. Goes to X Chat, encrypted, when you have a conversation there and the passcode was given; otherwise a direct message. ## Workspace operations, for the organization's AI agents Project rooms, booking pages, the white label, the plan and billing, on the same key, which acts as the organization's owner. A secret or a card goes in on a page whose link these hand out, never through them. ### billing - `GET /linkedin/billing`: Billing: whether a card is asked for at all, card_on_file, the Stripe status, and needs_checkout (whether paying starts with a checkout or Stripe's billing page). - `POST /linkedin/billing/checkout`: A Stripe checkout link to subscribe: give the url to the user, who enters their card there, never in the chat. - `POST /linkedin/billing/portal`: A link to Stripe's billing page, to change the card, see invoices or cancel: give the url to the user. - `POST /linkedin/plan/subscribe`: Start the 30-day trial, once per organization; afterwards it answers the plan as it stands. - `GET /linkedin/plan/subscription`: The organization's MakeHybrid API plan: status (none, trial, active, past_due, expired, canceled, comped), when the trial ends, the price, seats (how many are billed: one seat covers a LinkedIn account and one account of each channel that takes a seat) and seat_accounts (how many of each there are). ### booking - `GET /booking/v1/pages`: The organization's booking pages: each member's slug, url, title, rules, meeting_url, enabled, calendar (kind google or shared, account, problem) and calls coming up; share_with is the address a calendar is shared with, google whether Google sign-in is offered. - `POST /booking/v1/pages`: Make a member's booking page, or change theirs: member_email, and any of slug, title, host_name, minutes (15, 20, 30, 45, 60, 90), days (0 Sunday to 6), day_start and day_end (HH:MM), time_zone, notice_hours, horizon_days, meeting_url, enabled. - `GET /booking/v1/pages/{slug}`: One booking page, with its calls coming up (code, start, end, email, name, meetUrl). - `PATCH /booking/v1/pages/{slug}`: Change a booking page: any of slug, title, host_name, minutes, days, day_start, day_end, time_zone, notice_hours, horizon_days, meeting_url, enabled. - `DELETE /booking/v1/pages/{slug}/calendar`: Unlink the page's calendar (and revoke Google's grant); nobody can book until one is linked again. - `GET /booking/v1/pages/{slug}/calls`: The calls coming up on a page, soonest first, with each visitor's email, name and time zone. - `POST /booking/v1/pages/{slug}/calls`: Book a call on a page for someone: start (one of the free times), email, name, visitorTimeZone, lang. They get the invite. Ask the user first. - `POST /booking/v1/pages/{slug}/calls/{code}/cancel`: Cancel a call; the visitor is told. Ask the user first. - `POST /booking/v1/pages/{slug}/calls/{code}/move`: Move a call to another free time: start. The visitor gets the moved invite. - `POST /booking/v1/pages/{slug}/google`: A link for the page's member to sign in with Google and link their own calendar, so Google sends each invite with a Meet link: give the url to that member only. 503 unconfigured where Google sign-in is not offered: share instead. - `PUT /booking/v1/pages/{slug}/shared`: Link a Google Calendar its member shared with the share_with address, with Make changes to events: calendar_id (from the calendar's settings, Integrate calendar). 409 not_shared or read_only says what is missing. - `GET /booking/v1/pages/{slug}/slots`: The page's free times, by day, as UTC instants, with its time_zone and call length. ### brand - `GET /brand/mine`: The organization's white label: brand (slug, domain, productName, tagline, supportEmail, website, logoUrl, accentColor, planNames, expose, copy, mcp, theme, readyMade, services, card), live, stripe and google (whether set up), mail, tenants, offered (whether it may have one), own_host, cname_target and dns. - `PUT /brand/mine`: Create or change the white label: send the whole brand as GET /brand/mine shows it, with your changes (productName is required; slug, domain, colours, words, copy for the landing, terms and privacy pages, which APIs it exposes, its MCP scope). Its Stripe keys and Google app secret go in on the white-label page: POST /linkedin/connect/link {action: brand} gives the link. - `DELETE /brand/mine/images/{kind}`: Remove an uploaded picture: kind logo, card-logo or card. - `POST /brand/mine/images/{kind}/base64`: Upload a picture: kind logo, card-logo (its share card's own logo) or card (a whole share card of its own); content_base64 (PNG, JPEG or SVG in base64, up to 3 MB). - `DELETE /brand/mine/mail`: Stop sending from the brand's own domain; its email goes out from the shared address again. - `PUT /brand/mine/mail`: Send the brand's email from its own domain: {domain, local_part}. Answers the DNS records to add at the domain's host; then POST /brand/mine/mail/check. - `POST /brand/mine/mail/check`: Ask whether the brand's sending domain is verified yet, after its DNS records were added. - `POST /brand/mine/suggest`: Read a website and suggest the white label's name, tagline, colour and logo from it: {website}. Nothing is saved. - `DELETE /brand/mine/theme`: Put the brand's pages and rooms back to the stylesheet's own look. The accent colour, the logo and the words are not a theme and are left as they are. - `PUT /brand/mine/theme`: Redesign every page this brand serves, and the project rooms its customers work in, in one call: {theme}. The stylesheet behind all of them is built on tokens, so a theme sets those tokens and the whole product changes at once. theme.mode is light, dark or system. theme.colors takes accent, accent_dark, accent_soft (the tint behind an accent), accent_line, on_accent (what sits ON the accent - set it dark when the accent is pale), bg, bg_sunken, surface (cards and panels), text, muted, border and border_strong, each #rrggbb. theme.font takes body and heading as font stacks (family names only; load a face of your own with theme.css). theme.radius takes sm, md and lg in px. theme.layout takes page_width and header_height in px. theme.css is CSS of the brand's own for anything the names above cannot say - no @import, no url() other than https or a data: image. Send theme null to put every page back to the stylesheet's own look. Read the current one from GET /brand/mine. ### rooms - `GET /rooms`: List the organization's project rooms, each with its chats (id, name) and shared_url when it is on the web. - `POST /rooms`: Make a project room: name (up to 80 characters), guests_can_ask (whether invited guests may ask its AI agents). It starts with one chat. - `DELETE /rooms/{id}`: Delete a room with its chats, messages, tasks, docs and files. Ask the user first. - `GET /rooms/{id}`: Read a room: its chats with their settings, its AI agents and outside agents (id, name, handle, provider, model, mode, servers, instructions), and its built-in agents with whether each is on. - `PATCH /rooms/{id}`: Change a room: name, guests_can_ask, auto_tasks (off; person: a task for each person who writes in on a channel; marked: for messages marked todo: or #task). - `POST /rooms/{id}/agents`: Add an AI agent to a room: kind ai, name, provider (anthropic or openai), key_id (from GET /rooms/keys), model, mode (mention: answers when named; auto: joins in), instructions, servers (ids from GET /rooms/servers). An outside agent is added on the rooms page: its token is shown once, to a person. - `DELETE /rooms/{id}/agents/{agent_id}`: Take an agent out of a room. - `PUT /rooms/{id}/builtins/{builtin}`: Switch one of the room's built-in agents on or off: {on: true or false}. - `POST /rooms/{id}/changes/{change}`: Settle a change an agent proposed to a Google Ads account, as its notice says: {apply: true or false}. Ask the user first. - `GET /rooms/{id}/channels`: Where a room's conversation is also carried: its links (id, kind, target, can_ask, chat_id). - `POST /rooms/{id}/channels`: Carry a room's conversation to a place, both ways: kind, target_id (from targets) or address, can_ask (whether people there may ask its AI agents). - `GET /rooms/{id}/channels/{kind}/targets`: What a connected account offers to link a room to: its Slack or Discord channels, WhatsApp chats and the like; part narrows a long list. - `DELETE /rooms/{id}/channels/{link}`: Stop carrying a room's conversation to that place. - `PATCH /rooms/{id}/channels/{link}`: Change a room link: can_ask, or chat_id to carry a different chat. - `POST /rooms/{id}/chats`: Start another chat in a room: name (optional). - `DELETE /rooms/{id}/chats/{chat}`: Delete a chat and its messages; a room keeps at least one. Ask the user first. - `PATCH /rooms/{id}/chats/{chat}`: Rename a chat, or set what it changes over its room: settings {agents: {agent id or handle: auto, mention or off}, guests_can_ask, auto_tasks}; null gives a setting back to the room. - `DELETE /rooms/{id}/chats/{chat}/share`: Stop sharing a chat on the web. - `POST /rooms/{id}/chats/{chat}/share`: Put one chat on the web, read-only, for anyone with the link: answers shared_url. Ask the user first. - `GET /rooms/{id}/docs`: A room's notes: id, title, updated_at. - `POST /rooms/{id}/docs`: Write a note in a room: title, body. - `DELETE /rooms/{id}/docs/{doc}`: Delete a note. - `GET /rooms/{id}/docs/{doc}`: Read one note, with its body. - `PUT /rooms/{id}/docs/{doc}`: Replace a note: title, body. - `GET /rooms/{id}/files`: A room's files: id, name, size, type. - `DELETE /rooms/{id}/files/{file}`: Delete a file from a room. - `GET /rooms/{id}/files/{file}`: Download one of a room's files, as it was uploaded. - `POST /rooms/{id}/files/base64`: Put a file in a room: name, type (its media type, like application/pdf), content_base64 (the file in base64, up to 10 MB). It is said in the room, with a link to it. - `POST /rooms/{id}/handoffs/{handoff}`: Settle a handoff an agent asked the room for, as its notice says: {allow: true or false}. - `POST /rooms/{id}/invites`: An invite link for a guest to join the room under a name of their choosing: answers url and expires_at. Give the url only to whom the user names. - `GET /rooms/{id}/links`: A room's documents by link (Google Docs and any page). - `POST /rooms/{id}/links`: Add a document by link to a room: url, title. - `DELETE /rooms/{id}/links/{link}`: Remove a document link from a room. - `GET /rooms/{id}/messages`: A room's messages, oldest first: chat (a chat id; the first chat when absent), after (a seq, for only what is new), limit up to 200. - `POST /rooms/{id}/messages`: Say something in a room as the organization's owner: text, chat_id (the first chat when absent). Its agents may answer, and its linked channels carry it out. Ask before writing where people read. - `DELETE /rooms/{id}/share`: Stop sharing the room on the web; its link stops working. - `POST /rooms/{id}/share`: Put the whole room on the web, read-only, for anyone with the link: answers shared_url. Ask the user first. - `GET /rooms/{id}/sync`: Which task tool projects a room's tasks are kept in step with. - `POST /rooms/{id}/sync`: Keep a room's tasks in step with a task tool project: account_id, project_id. - `GET /rooms/{id}/sync/{account}/projects`: The projects a connected task tool account offers to keep a room in step with. - `DELETE /rooms/{id}/sync/{link}`: Stop keeping a room in step with that project. - `POST /rooms/{id}/sync/{link}/run`: Bring a room and its task tool project in step now. - `GET /rooms/{id}/tasks`: A room's tasks: title, notes, status (open, doing, done), assignee, due, priority (low, normal, high, urgent), links, and the channel that made one. - `POST /rooms/{id}/tasks`: Add a task to a room: title, notes, status, assignee, due (YYYY-MM-DD), priority, links [{title, url}]. - `DELETE /rooms/{id}/tasks/{task}`: Delete a task. - `PATCH /rooms/{id}/tasks/{task}`: Change a task: any of title, notes, status, assignee, due, priority, links. - `GET /rooms/channels`: The platforms a room's conversation can be carried to (linkedin, discord, slack, clickup, whatsapp, chatwoot, line, x, webhook, inbox, webchat) and the organization's accounts on each. - `POST /rooms/channels/{kind}/connect`: Connect a platform account for rooms. Answers next: url (a sign-in link to give the user), qr (a WhatsApp QR image for the phone to scan) or done. A platform that needs a token pasted is connected on the rooms page. - `DELETE /rooms/channels/accounts/{id}`: Disconnect a platform account from rooms, and every room link through it. - `GET /rooms/keys`: The organization's AI model keys for rooms (id, provider, label, last4). A new key is added on the rooms page, never through the chat. - `DELETE /rooms/keys/{id}`: Remove an AI model key; agents that use it stop answering. Ask the user first. - `GET /rooms/servers`: The MCP servers a room's AI agent can be given: the organization's own agents, Top Voice when connected, and servers added by address. - `POST /rooms/servers`: Add an MCP server by label and public https url. One that needs a token is added on the rooms page. - `DELETE /rooms/servers/{id}`: Remove an MCP server from the organization's list. - `GET /rooms/settings`: The limits on the organization's room AI agents (policy: preset, repliesPerHour, dailyRepliesPerKey, dailyTokensPerKey, hops, toolRounds, history, replyLength, handoffs), the presets, and today's usage per key. - `PUT /rooms/settings`: Set those limits: the whole policy object as GET /rooms/settings shows it, or a preset's values (thrifty, balanced, generous). - `DELETE /rooms/sync/accounts/{account}`: Disconnect a task tool account, and every room kept in step through it. - `GET /rooms/sync/providers`: The task tools room tasks can be kept in step with (ClickUp, Asana, Jira, Trello, HubSpot) and the organization's connected accounts. An account is connected on the rooms page: it takes a token. - `DELETE /rooms/topvoice`: Disconnect Top Voice. - `GET /rooms/topvoice`: Whether the organization's Top Voice account is connected, where Top Voice is offered. - `POST /rooms/topvoice/connect`: A sign-in link that connects the organization's Top Voice account: give the url to the user. ## Project rooms A project room is a shared chat where a team, the guests it invites and AI agents work in one conversation. Every room starts with built-in specialists for Google Ads, Ad Grants, LinkedIn Ads, SEO, content and more. A team can add its own agents — a name, instructions, a model and the tools each may use, including its own LinkedIn accounts through MakeHybrid — and connect outside ones: software running elsewhere that joins one room through the API with its own token. Agents run on the organization's own Anthropic, OpenAI or xAI key. Rooms are free to try without a subscription; what a room does on LinkedIn goes through the MakeHybrid API. ## White label Part of the plan: your name, logo, colour and domain on every page and on the AI connection, your own Stripe keys, and the ready-made products under your name or as themselves. A brand is live on its own address while its owner's subscription is. ## Elsewhere - MakeHybrid: https://app.top-voice.ai/ — What the MakeHybrid API is, what it costs, and how to start. - MakeHybrid API: https://app.top-voice.ai/api.html — One key for LinkedIn and every messaging channel: the two references, the AI agents and the price. - LinkedIn API reference: https://app.top-voice.ai/linkedin-docs.html — Every operation on the hosted LinkedIn API, with its parameters, request and response. - Messaging channels API reference: https://app.top-voice.ai/channels-docs.html — One shared inbox for WhatsApp, Telegram, email, SMS, LINE, TikTok, Instagram, Facebook Messenger and website chat, and your own X account, on the same key: guides and every operation. - Project rooms: https://app.top-voice.ai/project-rooms.html — A shared chat where a team, its guests and AI agents work together, on the team's own AI key. - Create an account: https://app.top-voice.ai/signup.html — Sign up and start the 30-day trial. - Terms: https://app.top-voice.ai/terms.html — The terms of service. - Privacy: https://app.top-voice.ai/privacy.html — What is stored, for how long, and what is never stored. MakeHybrid is not affiliated with LinkedIn Corporation.