Skip to page content
Docs
Make Agent Fast documentation

API reference

Find every public resource, method, required scope, pagination rule, and mutation contract.

At a glance

Find every public resource, method, required scope, pagination rule, and mutation contract.

API request pathScoped key → versioned resource → signed response
App / SDKBearer keymaf_live_…/api/v1/…ResourceJSON
v1123 operationsJSON

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/v1

The 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-key

Content-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#

MethodPathScopePurpose
GET/meaccount:readRead account, plan, entitlement, and wallet summary
GET/sitessites:readList owned sites
POST/sitessites:writeCreate a site and its default agent
GET/sites/{site_id}sites:readRetrieve one owned site
PATCH/sites/{site_id}sites:writeUpdate safe site fields
DELETE/sites/{site_id}sites:writeDelete the site and dependent resources
POST/sites/{site_id}/publishsites:writePublish or unpublish with { "published": boolean }
GET/sites/{site_id}/agentagents:readRead agent settings
PATCH/sites/{site_id}/agentagents:writeUpdate persona mode, purpose, display name, instructions, voice, languages, model, appearance, embed chrome, badge, embed state, or origins
GET/sites/{site_id}/billingaccount:readRead plan, period, wallet, add-ons, and the dashboard billing links
PATCH/sites/{site_id}/workspaceteam:writeRename the company that owns the agent
PATCH/sites/{site_id}/retentionteam:writeSet 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#

MethodPathScopePurpose
GET/sites/{site_id}/installagents:readRead the install target, embed state, allowed origins, and install evidence
PATCH/sites/{site_id}/installagents:writeSet the page the widget should be installed on
POST/sites/{site_id}/install/checkagents:writeCheck whether the embed snippet is live on the target page

Knowledge and FAQs#

MethodPathScopePurpose
GET/sites/{site_id}/knowledgeknowledge:readList knowledge sources
POST/sites/{site_id}/knowledgeknowledge:writeIngest pasted text, crawl a website, or import a YouTube, podcast, or feed source
PATCH/sites/{site_id}/knowledge/{source_id}knowledge:writeSet refresh_hours or the buyer-pack approval_status
POST/sites/{site_id}/knowledge/{source_id}/recrawlknowledge:writeQueue a re-read of a fetched source; returns 202
DELETE/sites/{site_id}/knowledge/{source_id}knowledge:writeDelete one source from future retrieval
GET/sites/{site_id}/faqsknowledge:readList structured FAQs
POST/sites/{site_id}/faqsknowledge:writeCreate { "question", "answer", "approved" }
POST/sites/{site_id}/faqs/generateknowledge:writeDraft FAQs from the agent's knowledge
POST/sites/{site_id}/faqs/approve-allknowledge:writeApprove and publish every draft FAQ
PATCH/sites/{site_id}/faqs/{faq_id}knowledge:writeUpdate question, answer, or approval state
DELETE/sites/{site_id}/faqs/{faq_id}knowledge:writeDelete an FAQ
GET / PATCH/sites/{site_id}/fact-sheetknowledge:read / knowledge:writeRead the extracted business fact sheet, or override facts the extraction got wrong
POST/sites/{site_id}/fact-sheet/reextractknowledge:writeRe-read the website and rebuild the fact sheet
POST/sites/{site_id}/qaknowledge:writePublish curated question-and-answer pairs
POST/sites/{site_id}/answers/reviseknowledge:writeTeach the agent the answer it should have given
GET/sites/{site_id}/knowledge-connectionsknowledge:readList Notion, Drive, and MCP knowledge connections
GET/sites/{site_id}/knowledge-connections/connect-linksknowledge:readGet the dashboard URLs that start a Notion or Drive connection
PATCH / DELETE/sites/{site_id}/knowledge-connections/{connection_id}knowledge:writeSet sync cadence, selected items, or import tool; or disconnect and purge the connection
GET/sites/{site_id}/knowledge-connections/{connection_id}/itemsknowledge:readList the pages, databases, or files a connection can import
POST/sites/{site_id}/knowledge-connections/{connection_id}/syncknowledge:writeQueue 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#

MethodPathScopePurpose
GET/sites/{site_id}/conversationsconversations:readList conversation threads
GET/sites/{site_id}/conversations/{conversation_id}conversations:readRetrieve a thread and paginated messages
POST/sites/{site_id}/conversations/{conversation_id}/replyconversations:writeReply to a visitor as the business
POST/sites/{site_id}/conversations/{conversation_id}/pauseconversations:writePause the agent on this conversation and take it over
POST/sites/{site_id}/conversations/{conversation_id}/resumeconversations:writeHand the conversation back to the agent
GET/sites/{site_id}/leadsleads:readList captured leads
POST/sites/{site_id}/leadsleads:writeCreate a canonical lead with explicit consent and contact preferences
GET/sites/{site_id}/leads/{lead_id}leads:readRetrieve one lead
PATCH/sites/{site_id}/leads/{lead_id}leads:writeUpdate, qualify, or change contact policy for a lead
POST/sites/{site_id}/leads/{lead_id}/acceptleads:writeAccept a lead into the opportunity pipeline
POST/sites/{site_id}/leads/{lead_id}/followupleads:writeSend the follow-up message to a lead
POST/sites/{site_id}/leads/{lead_id}/followup/draftleads:writeRedraft the follow-up message without sending it
GET/sites/{site_id}/analyticsanalytics:readList analytics events
GET/sites/{site_id}/reportanalytics:readRead the aggregated analytics report
POST/sites/{site_id}/report/unanswered-faqknowledge:writeAnswer an unanswered question as a new FAQ
GET/sites/{site_id}/usageusage:readList 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#

MethodPathScopePurpose
GET / POST/sites/{site_id}/pipeline/stagespipeline:read / pipeline:writeList or configure stages
GET / POST/sites/{site_id}/pipeline/accountspipeline:read / pipeline:writeList or create business accounts
GET/sites/{site_id}/pipeline/accounts/{account_id}pipeline:readRetrieve a business account
GET / POST/sites/{site_id}/pipeline/opportunitiespipeline:read / pipeline:writeList or create opportunities
GET / PATCH/sites/{site_id}/pipeline/opportunities/{opportunity_id}pipeline:read / pipeline:writeRead activity or update assignment, value, stage, next action, and human response
POST/sites/{site_id}/pipeline/outcomespipeline:writeIdempotently import a CRM-sourced won or lost outcome
GET/sites/{site_id}/pipeline/sync-recordspipeline:readList sync status, attempts, and errors
POST/sites/{site_id}/pipeline/sync-records/{sync_record_id}/retrypipeline:writeRetry a failed outcome from its stored payload
GET / PATCH/sites/{site_id}/pipeline-workflowpipeline:read / pipeline:writeRead or update the sales response policy
GET / POST/sites/{site_id}/pilotspipeline:read / pipeline:writeList or start guided pilots
GET/sites/{site_id}/pilots/{pilot_id}pipeline:readRead a pilot, its stage, counts, and worklist
POST/sites/{site_id}/pilots/{pilot_id}/setup, /start, /stop, /review, /decision, /complete, /deletepipeline:writeMove 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, /bookingspipeline:writeRecord a lead outcome or a booking result (two operations)
POST/sites/{site_id}/pilots/{pilot_id}/report/approve, /report/revokepipeline:writeApprove or revoke the shareable pilot report (two operations)
GET / POST/sites/{site_id}/buyer-packspipeline:read / pipeline:writeList buyer packs, or create one from approved sources
PATCH/sites/{site_id}/buyer-packs/{pack_id}pipeline:writeReplace a pack's title, audience, summary, sources, and sections
POST/sites/{site_id}/buyer-packs/{pack_id}/approve, /revokepipeline:writeEnable 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#

MethodPathScopePurpose
GET/sites/{site_id}/connectorsconnectors:readList connector state without secrets
POST/sites/{site_id}/connectorsconnectors:writeConnect a channel: validate credentials live, provision its webhook, and return the setup checklist
PATCH/sites/{site_id}/connectors/{connector_id}connectors:writeSet status or reply_with_voice
DELETE/sites/{site_id}/connectors/{connector_id}connectors:writeDeprovision and remove a connector
POST/sites/{site_id}/conciergeconnectors:writeAsk the platform to connect a messaging channel for you
GET/sites/{site_id}/domainsdomains:readRemoved — returns 409. Custom domains are not offered
POST/sites/{site_id}/domainsdomains:writeRemoved — returns 409
PATCH/sites/{site_id}/domains/{domain_id}domains:writeRemoved — returns 409
POST/sites/{site_id}/domains/{domain_id}/verifydomains:writeRemoved — returns 409
DELETE/sites/{site_id}/domains/{domain_id}domains:writeRemoved — 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#

MethodPathScopePurpose
GET/sites/{site_id}/broadcastsbroadcasts:readList broadcasts
POST/sites/{site_id}/broadcastsbroadcasts:writeCreate a Kakao broadcast draft
POST/sites/{site_id}/broadcasts/{broadcast_id}/sendbroadcasts:writeQueue an existing draft; returns 202
GET/sites/{site_id}/notificationsnotifications:readList owner notifications
POST/sites/{site_id}/notifications/read-allnotifications:writeMark every owner notification for this agent read
PATCH/sites/{site_id}/notifications/{notification_id}notifications:writeMark read or unread with { "read": boolean }
GET/sites/{site_id}/alertsnotifications:readRead the owner alert channel state and its dashboard link
GET/sites/{site_id}/monetization/productsmonetization:readList site products
POST/sites/{site_id}/monetization/productsmonetization:writeCreate an access, consult, tip, or digital product
PATCH/sites/{site_id}/monetization/products/{product_id}monetization:writeUpdate product fields and active state
DELETE/sites/{site_id}/monetization/products/{product_id}monetization:writeDelete 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#

MethodPathScopePurpose
GET / PATCH/sites/{site_id}/actionsagents:read / agents:writeRead or configure procedures, the public webhook, the booking link, and support tickets
GET/sites/{site_id}/ticketstickets:readList support tickets
GET/sites/{site_id}/tickets/{ticket_id}tickets:readRead a ticket and its messages
PATCH/sites/{site_id}/tickets/{ticket_id}tickets:writeSet status, priority, and optional assignee
POST/sites/{site_id}/tickets/{ticket_id}/messagestickets:writeAdd an internal note, or set internal: false to reply to the customer by email
GET/sites/{site_id}/teamteam:readRead members, invitations, and permitted audit events
POST/sites/{site_id}/team/invitationsteam:writeCreate an invitation link without sending email
DELETE/sites/{site_id}/team/invitations/{invitation_id}team:writeRevoke a pending invitation
PATCH / DELETE/sites/{site_id}/team/members/{membership_id}team:writeChange a non-owner member's role, or remove the member

Developer webhooks and setup tools#

MethodPathScopePurpose
GET/webhook-endpointswebhooks:readList endpoint state without signing secrets
POST/webhook-endpointswebhooks:writeRegister a public HTTPS URL and reveal its signing secret once
DELETE/webhook-endpoints/{endpoint_id}webhooks:writeDelete an endpoint and stop future delivery
GET/setup/toolsAny valid credentialDiscover setup tools for API, MCP, and GitHub integrations
POST/setup/tools/{tool_name}Tool-specificRun 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 conflict and Retry-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.