API reference
Find every public resource, method, required scope, pagination rule, and mutation contract.
Find every public resource, method, required scope, pagination rule, and mutation contract.
The canonical machine-readable contract is OpenAPI JSON. This page is the human-readable operation index and explains rules shared by every endpoint.
Base URL and version#
https://makeagent.fast/api/v1The major version is part of the path. Additive fields can appear without a major-version change, so ignore unknown response fields. All management requests use HTTPS and a bearer API key or OAuth access token.
Common headers#
Authorization: Bearer maf_live_...
Accept: application/json
Content-Type: application/json
Idempotency-Key: your-stable-operation-keyContent-Type is required for POST and PATCH JSON bodies, including {}. Idempotency-Key is optional but strongly recommended for every POST, PATCH, and DELETE.
Account and sites#
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET | /me | account:read | Read account, plan, entitlement, and wallet summary |
GET | /sites | sites:read | List owned sites |
POST | /sites | sites:write | Create a site and its default agent |
GET | /sites/{site_id} | sites:read | Retrieve one owned site |
PATCH | /sites/{site_id} | sites:write | Update safe site fields |
DELETE | /sites/{site_id} | sites:write | Delete the site and dependent resources |
POST | /sites/{site_id}/publish | sites:write | Publish or unpublish with { "published": boolean } |
GET | /sites/{site_id}/agent | agents:read | Read agent settings |
PATCH | /sites/{site_id}/agent | agents:write | Update persona mode, purpose, display name, instructions, voice, languages, model, appearance, embed chrome, badge, embed state, or origins |
GET | /sites/{site_id}/billing | account:read | Read plan, period, wallet, add-ons, and the dashboard billing links |
PATCH | /sites/{site_id}/workspace | team:write | Rename the company that owns the agent |
PATCH | /sites/{site_id}/retention | team:write | Set how long conversations are kept |
Creating a site requires title and content.headline. Optional fields include slug, type, template, additional content, persona_mode, and one to four languages from en, ko, uz, and ru.
PATCH /agent runs model, appearance, embed_chrome, and badge_hidden through the same plan checks as the dashboard; badge_hidden: true needs an eligible plan or the badge add-on.
Install and website widget#
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET | /sites/{site_id}/install | agents:read | Read the install target, embed state, allowed origins, and install evidence |
PATCH | /sites/{site_id}/install | agents:write | Set the page the widget should be installed on |
POST | /sites/{site_id}/install/check | agents:write | Check whether the embed snippet is live on the target page |
Knowledge and FAQs#
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET | /sites/{site_id}/knowledge | knowledge:read | List knowledge sources |
POST | /sites/{site_id}/knowledge | knowledge:write | Ingest pasted text, crawl a website, or import a YouTube, podcast, or feed source |
PATCH | /sites/{site_id}/knowledge/{source_id} | knowledge:write | Set refresh_hours or the buyer-pack approval_status |
POST | /sites/{site_id}/knowledge/{source_id}/recrawl | knowledge:write | Queue a re-read of a fetched source; returns 202 |
DELETE | /sites/{site_id}/knowledge/{source_id} | knowledge:write | Delete one source from future retrieval |
GET | /sites/{site_id}/faqs | knowledge:read | List structured FAQs |
POST | /sites/{site_id}/faqs | knowledge:write | Create { "question", "answer", "approved" } |
POST | /sites/{site_id}/faqs/generate | knowledge:write | Draft FAQs from the agent's knowledge |
POST | /sites/{site_id}/faqs/approve-all | knowledge:write | Approve and publish every draft FAQ |
PATCH | /sites/{site_id}/faqs/{faq_id} | knowledge:write | Update question, answer, or approval state |
DELETE | /sites/{site_id}/faqs/{faq_id} | knowledge:write | Delete an FAQ |
GET / PATCH | /sites/{site_id}/fact-sheet | knowledge:read / knowledge:write | Read the extracted business fact sheet, or override facts the extraction got wrong |
POST | /sites/{site_id}/fact-sheet/reextract | knowledge:write | Re-read the website and rebuild the fact sheet |
POST | /sites/{site_id}/qa | knowledge:write | Publish curated question-and-answer pairs |
POST | /sites/{site_id}/answers/revise | knowledge:write | Teach the agent the answer it should have given |
GET | /sites/{site_id}/knowledge-connections | knowledge:read | List Notion, Drive, and MCP knowledge connections |
GET | /sites/{site_id}/knowledge-connections/connect-links | knowledge:read | Get the dashboard URLs that start a Notion or Drive connection |
PATCH / DELETE | /sites/{site_id}/knowledge-connections/{connection_id} | knowledge:write | Set sync cadence, selected items, or import tool; or disconnect and purge the connection |
GET | /sites/{site_id}/knowledge-connections/{connection_id}/items | knowledge:read | List the pages, databases, or files a connection can import |
POST | /sites/{site_id}/knowledge-connections/{connection_id}/sync | knowledge:write | Queue a sync of a knowledge connection |
POST /knowledge accepts three bodies: { "name", "text" } with 5–200,000 characters; { "url", "max_pages", "refresh_hours" } to crawl a website (max_pages 1–40, refresh_hours 1–8,760 or null); and { "kind": "youtube" | "podcast" | "feed", "url", "refresh_hours" }. YouTube, podcast, and feed sources need Operate or Scale; on Launch they return 409 conflict. File upload stays a dashboard workflow.
Conversations, leads, analytics, and usage#
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET | /sites/{site_id}/conversations | conversations:read | List conversation threads |
GET | /sites/{site_id}/conversations/{conversation_id} | conversations:read | Retrieve a thread and paginated messages |
POST | /sites/{site_id}/conversations/{conversation_id}/reply | conversations:write | Reply to a visitor as the business |
POST | /sites/{site_id}/conversations/{conversation_id}/pause | conversations:write | Pause the agent on this conversation and take it over |
POST | /sites/{site_id}/conversations/{conversation_id}/resume | conversations:write | Hand the conversation back to the agent |
GET | /sites/{site_id}/leads | leads:read | List captured leads |
POST | /sites/{site_id}/leads | leads:write | Create a canonical lead with explicit consent and contact preferences |
GET | /sites/{site_id}/leads/{lead_id} | leads:read | Retrieve one lead |
PATCH | /sites/{site_id}/leads/{lead_id} | leads:write | Update, qualify, or change contact policy for a lead |
POST | /sites/{site_id}/leads/{lead_id}/accept | leads:write | Accept a lead into the opportunity pipeline |
POST | /sites/{site_id}/leads/{lead_id}/followup | leads:write | Send the follow-up message to a lead |
POST | /sites/{site_id}/leads/{lead_id}/followup/draft | leads:write | Redraft the follow-up message without sending it |
GET | /sites/{site_id}/analytics | analytics:read | List analytics events |
GET | /sites/{site_id}/report | analytics:read | Read the aggregated analytics report |
POST | /sites/{site_id}/report/unanswered-faq | knowledge:write | Answer an unanswered question as a new FAQ |
GET | /sites/{site_id}/usage | usage:read | List metered usage events |
These event and activity collections accept limit and cursor. Returned records can contain personal data; store and export them according to your privacy obligations.
Owner replies are supported: reply, pause, and resume take over a web thread or a Telegram, WhatsApp, Messenger, or Instagram chat the same way the dashboard does. Sending messages as the visitor is not a public API operation.
Lead mutation is supported; do not set consent_status: granted unless your system
has a defensible consent record. Unknown consent is excluded from broadcasts.
Opportunity pipeline and CRM outcomes#
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET / POST | /sites/{site_id}/pipeline/stages | pipeline:read / pipeline:write | List or configure stages |
GET / POST | /sites/{site_id}/pipeline/accounts | pipeline:read / pipeline:write | List or create business accounts |
GET | /sites/{site_id}/pipeline/accounts/{account_id} | pipeline:read | Retrieve a business account |
GET / POST | /sites/{site_id}/pipeline/opportunities | pipeline:read / pipeline:write | List or create opportunities |
GET / PATCH | /sites/{site_id}/pipeline/opportunities/{opportunity_id} | pipeline:read / pipeline:write | Read activity or update assignment, value, stage, next action, and human response |
POST | /sites/{site_id}/pipeline/outcomes | pipeline:write | Idempotently import a CRM-sourced won or lost outcome |
GET | /sites/{site_id}/pipeline/sync-records | pipeline:read | List sync status, attempts, and errors |
POST | /sites/{site_id}/pipeline/sync-records/{sync_record_id}/retry | pipeline:write | Retry a failed outcome from its stored payload |
GET / PATCH | /sites/{site_id}/pipeline-workflow | pipeline:read / pipeline:write | Read or update the sales response policy |
GET / POST | /sites/{site_id}/pilots | pipeline:read / pipeline:write | List or start guided pilots |
GET | /sites/{site_id}/pilots/{pilot_id} | pipeline:read | Read a pilot, its stage, counts, and worklist |
POST | /sites/{site_id}/pilots/{pilot_id}/setup, /start, /stop, /review, /decision, /complete, /delete | pipeline:write | Move a pilot through setup, measurement, review, decision, and close, or delete it with its evidence (seven operations) |
POST | /sites/{site_id}/pilots/{pilot_id}/outcomes, /bookings | pipeline:write | Record a lead outcome or a booking result (two operations) |
POST | /sites/{site_id}/pilots/{pilot_id}/report/approve, /report/revoke | pipeline:write | Approve or revoke the shareable pilot report (two operations) |
GET / POST | /sites/{site_id}/buyer-packs | pipeline:read / pipeline:write | List buyer packs, or create one from approved sources |
PATCH | /sites/{site_id}/buyer-packs/{pack_id} | pipeline:write | Replace a pack's title, audience, summary, sources, and sections |
POST | /sites/{site_id}/buyer-packs/{pack_id}/approve, /revoke | pipeline:write | Enable or disable the pack's share link (two operations) |
The supplied CRM provider, external ID, and idempotency key remain in the audit
trail. A retry claims only a failed record and never turns an in-progress external
write into a false success.
Connectors#
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET | /sites/{site_id}/connectors | connectors:read | List connector state without secrets |
POST | /sites/{site_id}/connectors | connectors:write | Connect a channel: validate credentials live, provision its webhook, and return the setup checklist |
PATCH | /sites/{site_id}/connectors/{connector_id} | connectors:write | Set status or reply_with_voice |
DELETE | /sites/{site_id}/connectors/{connector_id} | connectors:write | Deprovision and remove a connector |
POST | /sites/{site_id}/concierge | connectors:write | Ask the platform to connect a messaging channel for you |
GET | /sites/{site_id}/domains | domains:read | Removed — returns 409. Custom domains are not offered |
POST | /sites/{site_id}/domains | domains:write | Removed — returns 409 |
PATCH | /sites/{site_id}/domains/{domain_id} | domains:write | Removed — returns 409 |
POST | /sites/{site_id}/domains/{domain_id}/verify | domains:write | Removed — returns 409 |
DELETE | /sites/{site_id}/domains/{domain_id} | domains:write | Removed — returns 409 |
Connector creation uses a channel-discriminated body. Credential fields differ for telegram, whatsapp, messenger, instagram, discord, and kakao; use the matching connector guide before sending secrets.
Broadcasts, notifications, and monetization#
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET | /sites/{site_id}/broadcasts | broadcasts:read | List broadcasts |
POST | /sites/{site_id}/broadcasts | broadcasts:write | Create a Kakao broadcast draft |
POST | /sites/{site_id}/broadcasts/{broadcast_id}/send | broadcasts:write | Queue an existing draft; returns 202 |
GET | /sites/{site_id}/notifications | notifications:read | List owner notifications |
POST | /sites/{site_id}/notifications/read-all | notifications:write | Mark every owner notification for this agent read |
PATCH | /sites/{site_id}/notifications/{notification_id} | notifications:write | Mark read or unread with { "read": boolean } |
GET | /sites/{site_id}/alerts | notifications:read | Read the owner alert channel state and its dashboard link |
GET | /sites/{site_id}/monetization/products | monetization:read | List site products |
POST | /sites/{site_id}/monetization/products | monetization:write | Create an access, consult, tip, or digital product |
PATCH | /sites/{site_id}/monetization/products/{product_id} | monetization:write | Update product fields and active state |
DELETE | /sites/{site_id}/monetization/products/{product_id} | monetization:write | Delete a product |
Broadcast creation currently accepts only the kakao channel. Queueing fails with 409 conflict when there are no reachable recipients or the broadcast is no longer a draft.
Actions, tickets, and team#
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET / PATCH | /sites/{site_id}/actions | agents:read / agents:write | Read or configure procedures, the public webhook, the booking link, and support tickets |
GET | /sites/{site_id}/tickets | tickets:read | List support tickets |
GET | /sites/{site_id}/tickets/{ticket_id} | tickets:read | Read a ticket and its messages |
PATCH | /sites/{site_id}/tickets/{ticket_id} | tickets:write | Set status, priority, and optional assignee |
POST | /sites/{site_id}/tickets/{ticket_id}/messages | tickets:write | Add an internal note, or set internal: false to reply to the customer by email |
GET | /sites/{site_id}/team | team:read | Read members, invitations, and permitted audit events |
POST | /sites/{site_id}/team/invitations | team:write | Create an invitation link without sending email |
DELETE | /sites/{site_id}/team/invitations/{invitation_id} | team:write | Revoke a pending invitation |
PATCH / DELETE | /sites/{site_id}/team/members/{membership_id} | team:write | Change a non-owner member's role, or remove the member |
Developer webhooks and setup tools#
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET | /webhook-endpoints | webhooks:read | List endpoint state without signing secrets |
POST | /webhook-endpoints | webhooks:write | Register a public HTTPS URL and reveal its signing secret once |
DELETE | /webhook-endpoints/{endpoint_id} | webhooks:write | Delete an endpoint and stop future delivery |
GET | /setup/tools | Any valid credential | Discover setup tools for API, MCP, and GitHub integrations |
POST | /setup/tools/{tool_name} | Tool-specific | Run a setup tool; platform requests need their endpoint scopes, GitHub inspection uses integrations:read, and PR preparation uses integrations:write |
Webhook URLs must use HTTPS, cannot include credentials or a custom port, and must resolve only to public IP addresses.
Pagination#
Paginated collections accept limit from 1 to 100; the default is 50. Use the returned opaque next_cursor only with the same collection and filters.
{
"data": [],
"has_more": false,
"next_cursor": null
}Some small configuration collections return the same envelope with has_more: false and do not need a cursor.
Idempotency#
An idempotency key must contain 8–200 characters from letters, numbers, ., _, :, and -. Results are retained for 24 hours and scoped to the credential owner.
- Same key and same method, path, query, and body: returns the stored response with
x-idempotent-replayed: true. - Same key with different input: returns
409 conflict. - Same key while the first request is processing: returns
409 conflictandRetry-After: 2.
Persist the key before sending the mutation and reuse it only for retries of that logical operation.
Responses and errors#
Success responses wrap their resource in data. Create operations normally return 201; queued broadcast sends return 202; other successful operations return 200. Every response includes x-request-id and uses Cache-Control: no-store for API data.
See Scopes and errors for the complete error-code table and API recipes for copyable workflows.
MCP clients#
Connect a Streamable HTTP MCP client to https://makeagent.fast/api/mcp. Clients supporting OAuth discovery open the browser for sign-in and consent. Verify the client identity, company and requested scopes before approving. The first approval asks for the scopes the tools use (sites:read, sites:write, agents:write, analytics:read, conversations:read, conversations:write, leads:read, leads:write, knowledge:write); a credential missing one of them is asked to authorize again. An active plan is required.
For clients using manually configured credentials, create a scoped API key in Developer settings and supply it as an Authorization: Bearer ... header. Keep credentials out of source control and browser code. Revoke API keys or OAuth grants from Developer settings.
Read tools: list_agents, get_agent, get_report, list_unanswered_questions, list_conversations, get_conversation, list_leads. Write tools: create_agent_from_website, create_agent_from_notes, test_agent, add_knowledge, save_answer, reply_to_customer, update_lead, set_website_widget. Every agent tool takes an agent_id from list_agents. test_agent spends credits like a normal answer; reply_to_customer sends a message to the customer and pauses the agent on that conversation; set_website_widget turns the website chat widget on or off; messaging channels are managed in the dashboard. Clients with MCP Apps enabled (by default the authenticated Claude connection) also get list_pending_approvals, list_action_runs, and decide_approval, which approves or declines a customer-confirmed change; other clients see only the 15 tools above. For the setup and GitHub integration tools, use the in-app setup helper or /api/v1/setup/tools.
Supported protocol revisions are 2026-07-28, 2025-11-25, and 2025-06-18. The transport returns JSON; it does not offer legacy SSE or server sessions. MCP OAuth tokens only authorize /api/mcp, not direct REST requests. OAuth access tokens last one hour; refresh credentials rotate and expire after 90 days. Manually created API keys use their configured expiry.