Let your AI agent pick a real person and talk to them live, by chat or video, at the price that person sets. Or send them a free question they answer when they can.
Free to create. Use it for live paid connections or free async questions.
Step 1: Get an API key
Create a free API key with the form above. For paid live chats, add a card too, or let your agent pay the 402 itself with x402 or MPP (it becomes prepaid credit on the key).
Step 2, Claude Desktop: one-click install
Download the extension, open it, click Install in Claude Desktop and paste your API key. For macOS and Windows.
Download for Claude DesktopStep 2, Cursor and other clients: add the server
In Cursor, open Cursor Settings, go to MCP and choose New MCP Server. Other clients take the same entry in their MCP config file:
{
"mcpServers": {
"askingahuman": {
"command": "npx",
"args": [
"-y",
"@askingahuman/mcp-server"
],
"env": {
"ASKINGAHUMAN_API_KEY": "ahk_your_key_here"
}
}
}
}1. Find a person:
curl https://api.askingahuman.com/api/live-now -H "Authorization: Bearer ahk_your_key"
curl "https://api.askingahuman.com/api/connect/quote?humanId={humanId}&mode=message" \
-H "Authorization: Bearer ahk_your_key"The quote shows their price for an hour of chat (or 30 minutes of video), the hold and the limits. Nothing is charged.
2. Request a session with them:
curl -X POST https://api.askingahuman.com/api/connect \
-H "Authorization: Bearer ahk_your_key" \
-H "Content-Type: application/json" \
-d '{"humanId": "{humanId}", "mode": "message", "message": "Help me name a product"}'Holds the first block and returns a sessionId. A chat request waits up to 24 hours for someone away; video needs them live.
3. Wait for them to accept, extend if you need more time:
curl https://api.askingahuman.com/api/connect/{sessionId} -H "Authorization: Bearer ahk_your_key"
curl -X POST https://api.askingahuman.com/api/connect/{sessionId}/extend -H "Authorization: Bearer ahk_your_key"Once accepted, returns a LiveKit room token. The MCP server's connect_human, check_connection and extend_session tools do all of this for you.
1. Ask the person you chose (free):
curl -X POST https://api.askingahuman.com/api/questions \
-H "Authorization: Bearer ahk_your_key" \
-H "Content-Type: application/json" \
-d '{"targetExpertId": "{humanId}", "questionText": "Which of these two names works better?"}'Returns a questionId. Only people who take free questions can be asked. Emails, phone numbers, card and bank numbers, addresses, API keys and similar details are removed before the person sees your text (questions, replies and live-request messages); the response's redactions lists what was removed.
2. Check for the answer (free):
curl https://api.askingahuman.com/api/questions/{questionId} -H "Authorization: Bearer ahk_your_key"Status is PENDING_ANSWER, ANSWERED (with the answer) or DECLINED (stop checking).
Any framework that speaks MCP can use the same server. OpenAI Agents SDK (Python):
from agents import Agent, Runner
from agents.mcp import MCPServerStdio
async with MCPServerStdio(params={
"command": "npx", "args": ["-y", "@askingahuman/mcp-server"],
"env": {"ASKINGAHUMAN_API_KEY": "ahk_your_key"},
}) as humans:
agent = Agent(
name="Assistant",
instructions="When you need human judgment, ask a person with the askingahuman tools.",
mcp_servers=[humans],
)
result = await Runner.run(agent, "Ask a designer which of these two logos reads better.")LangGraph, with langchain-mcp-adapters:
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
client = MultiServerMCPClient({"askingahuman": {
"command": "npx", "args": ["-y", "@askingahuman/mcp-server"],
"transport": "stdio", "env": {"ASKINGAHUMAN_API_KEY": "ahk_your_key"},
}})
agent = create_react_agent("anthropic:claude-sonnet-5-5", await client.get_tools())One person from GET /humans?audience=bot (the MCP list_humans tool). Prices come from a quote, so the agent always sees the current one.
{
"humanId": "exp_3f9a1c2b7d8e4f60",
"name": "Sam R.",
"title": "Brand designer, 10 years in consumer apps",
"bio": "I review logos, landing pages and app store screenshots.",
"specializations": [
"branding",
"UI design",
"copywriting"
],
"languages": [
"English",
"Spanish"
],
"rating": 4.9,
"reviewCount": 18
}An illustrative example, not a real person.
Answers (GET /api/questions/{questionId}), the person's replies and ended sessions (GET /api/connect/{sessionId}, POST …/end) come with a receipt: an Ed25519-signed token that names who answered or met your agent, when, and a SHA-256 of the question and answer (sessions: times, blocks and amount, never the conversation). Keep it, and anyone can check it later against our public keys at https://api.askingahuman.com/.well-known/askingahuman-receipt-keys.json.
import { createHash, createPublicKey, verify } from 'node:crypto';
const jwks = await (await fetch('https://api.askingahuman.com/.well-known/askingahuman-receipt-keys.json')).json();
function verifyReceipt(receipt) {
const [h, p, s] = receipt.split('.');
const { kid } = JSON.parse(Buffer.from(h, 'base64url'));
const jwk = jwks.keys.find((k) => k.kid === kid);
const ok = jwk && verify(null, Buffer.from(`${h}.${p}`), createPublicKey({ key: jwk, format: 'jwk' }), Buffer.from(s, 'base64url'));
return ok ? JSON.parse(Buffer.from(p, 'base64url')) : null; // the signed claims, or null
}
const claims = verifyReceipt(question.receipt);
const sha256 = (t) => createHash('sha256').update(t, 'utf8').digest('hex');
console.log(claims && claims.answerSha256 === sha256(question.answer)); // true: untampered| Status | Meaning |
|---|---|
| 400 | The request is invalid; the error says which field. |
| 401 | Missing or unknown API key. |
| 402 | A live session needs a card or prepaid credit on this key. The 402 carries x402 (PAYMENT-REQUIRED) and MPP (WWW-Authenticate: Payment) challenges: pay one and retry, and it becomes credit. SPEND_CAP_REACHED: the key is at the monthly spend cap its owner set. |
| 403 | The key is suspended (contact support), or the person closed this conversation. |
| 404 | No such person or record. Also returned for people who are unlisted or have blocked your key. |
| 409 | Refused with a status: HUMAN_OFFLINE (video needs them live), OVER_SPEND_LIMIT (your spend limit is under the first charge), or they don’t take this mode. |
| 429 | Rate limit or daily quota reached; wait and retry. |
{ "error": "message" }; 409 refusals add a status.POST /api/keys/{keyId}/rotate: you get a new key, and the old one keeps working for 24 hours so you can swap it without downtime.Live sessions
Each person sets a price for an hour of chat and for 30 minutes of video. Your agent sees it first and can extend. Each block is charged in full once they accept; the first is charged at least the session minimum in our Terms.
Chat up to 4 hours, video up to 60 minutes.
Ask a Question
Free. Sent to the person you choose, who answers when they can.
No credit card required.
Read Answer
Free. View the full response from the human.
Always free.