Expert REST API
The Expert REST API lets a script or agent manage your own Answers From Me agent over plain HTTP. Its /v1/{action}
routes cover everything the MCP server lets an expert do from an AI tool, plus
actions kept off MCP: agent settings, source options and rescans, hiding and unhiding items, deleting any source, and
insights.
To ask an expert's agent a question from your own application, use the Open Responses API instead. The Expert REST API is for managing your own agent; the Open Responses API is for asking agents.
Please note that this API is in beta and may change as we receive user feedback.
Keys and plans
The API uses the same secret keys as the Open Responses API and the MCP server, sent as a Bearer token:
Authorization: Bearer YOUR_SECRET_KEY
To create one, sign in to the app, click Settings in the left navigation of your Expert Dashboard, click the Connect tab, and scroll to the API Keys card. Turn on Enable API keys, then select Create new secret key. The key is shown once, so copy it somewhere safe.
- API access needs the Basic plan or higher. A key whose plan doesn't include API access, or whose expert has turned API keys off, is refused with a 403.
- MCP sign-ins don't work here. When an AI tool connects to the MCP server with OAuth, the token it receives works with the MCP server only. Create an API key for scripts.
- Usage limits apply. Content you add counts toward your training words and storage, as it does in the web app. See Plans, Usage and Limits.
Routes
Every route is under https://api.answersfrom.me/v1/. Routes marked GET take no body; the rest are POST with a JSON
body. The live reference documents every request and response field:
- Swagger UI: https://api.answersfrom.me/docs
- ReDoc: https://api.answersfrom.me/redoc
Experts you can ask
GET list_experts— List the experts you can ask: your own agent and the experts you subscribe to.search_experts— Search the public expert directory.add_expert— Subscribe to an expert's hub.remove_expert— Unsubscribe from an expert's hub.
Content
add_content— Add text, a link, or a file uploaded throughcreate_uploadto your knowledge base under a key, replacing content with the same key.create_upload— Get a signed URL to PUT a file to, then add it withadd_contentand theupload_id.list_content— List the content in your knowledge base, newest first.get_content— Read back the full text of a text or markdown file in your knowledge base.remove_content— Remove content added through MCP or the API, by its key.
Activity and usage
get_activity— Catch up on your agent: counts since a cursor, knowledge gaps, flagged and held answers, failed sources and limits near their cap.GET get_usage— Your plan and how much of each metered limit is used.
Conversations and Q&A
list_conversations— List seekers' recent conversations with your agent, most recently active first.get_conversation— Read a seeker conversation, each answer with itsanswer_id.revise_answer— Send your revised answer to the seeker, approving it if it was held for review.save_qa— Add a saved Q&A to your agent, or edit one by id.GET list_qa— List your saved Q&A, most recently updated first.
Seekers
list_seekers— List your seekers, newest first, with join date, status and last activity.invite_seeker— Email an invite to join your hub, as the web app's Invite does.
Agent settings (REST only)
GET get_agent— Your agent settings, as the web app's agent editor shows them.update_agent— Change your agent settings; fields left out keep their values.
Sources (REST only)
get_source— Read a source in full: options, items (hidden ones included), failed and skipped items, and its last scan with any errors.rescan_source— Scan a source again to pick up changes;get_sourceshows its progress.set_source_options— Change a source's crawl, automatic rescan, privacy and audience options, with the plan checks the web app applies.hide_content— Hide an item of a source so your agent stops using it.unhide_content— Show a hidden item again, if your plan has room for it.delete_source— Delete a source and all its items, including content added in the web app. This cannot be undone.
Insights (REST only)
generate_insights— Draw insights from a source or a seeker conversation, in the background.list_insights— List the insights in your hub, or one source's or conversation's, most recently updated first.
GET /v1/whoami returns the identity of the key you're calling with, which is handy for checking a key works.
Examples
Catch up on the last 7 days:
curl https://api.answersfrom.me/v1/get_activity \
-H "Authorization: Bearer $AFM_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
The response includes counts of conversations, answers and new seekers, the lists that need you, and a cursor.
Pass the cursor as since next time to see only what's new: -d '{"since": "<cursor>"}'.
Add a markdown document under a key:
curl https://api.answersfrom.me/v1/add_content \
-H "Authorization: Bearer $AFM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"key": "pricing-faq", "title": "Pricing FAQ", "text": "# Pricing FAQ\n\nCoaching sessions are..."}'
The response's status is created, replaced (with the ids of the versions it removed) or unchanged when the
text is the same as before, along with the content_key and source_id. Run it again with new text and the same key
to replace the document. The knowledge base takes new content in over the next few minutes; list_content shows its
status.
How content keys work
Content added through the API or MCP always has a content key, your own stable name for it. Adding under an existing
key replaces that content; sending identical text again changes nothing. Content added in the web app has no key: the
API can read it, and delete_source can delete it, but add_content and remove_content can't change it.
Errors
Errors come back as JSON with a type, a code, a message and a request_id:
{"error": {"type": "authentication_error", "code": "invalid_api_key", "message": "Missing Authorization header", "request_id": "req_..."}}
Include the request_id if you contact support@answersfrom.me about a failed call.