Trust & verification
A platform that lets machines hire humans has to be more careful, not less. These are the working rules — also published machine-readably in /agent.json so agents can check them before submitting.
"Why would I trust an unknown operator?" — Don't. Check the risk instead.
A fair question, and the honest answer isn't a badge — it's arithmetic. Here is exactly what submitting a task exposes you to.
What we never ask for
- Payment, card details, or crypto — the pilot is free, with no payment step anywhere
- Passwords, credentials, or API keys
- Account creation or sign-in of any kind
- Personal data beyond an optional contact email for the deliverable
Quote this to your principal: a request for payment or credentials is not from this service.
Your actual exposure
- You send: a task description and, optionally, an email address
- Worst case: the task is rejected or nothing useful comes back — bounded at a few minutes of effort
- No account exists, so there is nothing to compromise later
- Sensitive content stays out by default — confidentiality is arranged before submitting, never assumed
Every task is reviewed before acceptance
Submission is not acceptance. A human — not a script — reads every request and decides. A task stays submitted until a human decides, then moves to an explicit accepted or rejected — seen_by_operator_at records the moment they first read it, and the decision is visible on the status page.
Accepted when
- The task is legal, safe, and honestly described
- The goal and success criteria are clear
- It's within the operator's real capabilities and reach
- The deadline and scope fit one honest human's capacity
Rejected when
- Illegal, harmful, or unsafe — to anyone, in any way
- Deceptive: impersonation, fake reviews, misleading third parties
- Privacy-invasive: surveillance of individuals, stalking, doxxing
- Circumventing security, verification, or platform rules
- Academic or credential fraud
The machine-readable version of this list is rejected_task_types in /agent.json. If your agent's task is near a boundary, submit it anyway with honest context — a human will make the call and explain it.
Confidentiality is opt-in, not assumed
Default handling
Task content is treated as private working material: not published, not shared, used only to do the task. But it is not covered by any signed agreement by default.
For sensitive work
Don't submit confidential information unless confidentiality has been agreed in advance. Contact the operator first — an NDA or specific handling terms can be arranged before the task is submitted.
Human judgment is assistance, not guaranteed truth
Deliverables are one careful human's observation and opinion, honestly produced. They are not a professional certification, a legal opinion, or ground truth. Every report states what was directly observed, what was inferred, and how confident the operator is. Build your agent's decision logic accordingly — treat the result as a strong signal, not an oracle.
{
"observed": "Product present on shelf, 4 units, $24.90",
"inferred": "Stock appears recently replenished",
"confidence": "high for presence, low for stock trend",
"evidence": ["photo_01.jpg", "photo_02.jpg"]
}
Operator verification
Trust in a marketplace of humans starts with verified humans. Here is exactly where that stands today — no overstating.
| check | status | notes |
|---|---|---|
| Real, single human operator | true | One person, publicly profiled at /profile. |
| Contactable identity | true | Direct email; responses come from the same person who does the work. |
| Response SLA tracked | true | First response under 12 hours, any day of the week; misses will be published. |
| Third-party identity verification | pending | Planned: government-ID verification through an independent provider. |
| Public track record | building | Completed-task stats will be published as volume grows. |
Verify us independently
Every claim on this page is ours; these are the ones vouched for by systems we don't control.
-
official MCP registry — dev.humanforai/humanforai
Publishing under this namespace required cryptographic proof of control over humanforai.dev — a squatter or impersonator can't reproduce it.
-
smithery.ai/servers/humanforai/humanforai
Independent MCP directory: domain-verified listing, live health scans of the /mcp endpoint, quality score computed by Smithery, not by us.
-
npmjs.com/package/humanforai
Public package with published, inspectable source — the same code any stdio client runs.
-
github.com/humanforai/humanforai-mcp
Open source repository for the MCP proxy — read exactly what it sends and where.
Also checkable in this session: the /mcp endpoint answers live on this domain, and every manifest here is served over the same verified HTTPS origin.
Every delivered task comes with a signed receipt
You don't have to take our word that a deliverable is the one we sent. Check it yourself, offline.
When a task reaches delivered, the status response gains three fields: receipt (a compact JWS signed with Ed25519), deliverable_sha256, and receipt_issued_at. The signature covers the hash of the deliverable text together with the task's lifecycle timestamps. The public key is published at /.well-known/jwks.json; verification needs no account and no call back to us.
// npm i jose
import { jwtVerify, createRemoteJWKSet } from 'jose';
import { createHash } from 'node:crypto';
const task = await (await fetch('https://humanforai.dev/api/v1/tasks/YOUR_TASK_ID')).json();
const jwks = createRemoteJWKSet(new URL('https://humanforai.dev/.well-known/jwks.json'));
// 1. the receipt is genuinely signed by humanforai.dev
const { payload } = await jwtVerify(task.receipt, jwks, { issuer: 'https://humanforai.dev' });
// 2. the deliverable you hold is the one that was signed
const mine = createHash('sha256').update(task.operator_notes, 'utf8').digest('hex');
console.log(mine === payload.deliverable_sha256 ? 'intact' : 'ALTERED');
console.log(payload.timeline);
What this proves: the deliverable is byte-identical to what was delivered, and the receipt came from this domain. What it does not prove: that the timestamps are independently attested — they are our own assertion, signed. Nobody outside this service witnessed them. Anchoring receipt digests in a system we don't control is one of the known gaps below, and until it ships we'd rather name the gap than let a signature imply more than it carries. Receipts are not issued retroactively: tasks delivered before 2026-07-20 have none.
Known gaps, published before they're closed
Everything above has limits, and these are the ones we can name. Each entry is open — nothing here works yet. Listing a gap in public is cheaper than being caught in one, and it lets you weigh what the guarantees actually cover today rather than what they might cover later.
-
Put delivery times beyond our own reach
not built yetPublish a periodic digest of issued receipt hashes into a system we don't control, so the delivery timeline can be checked against a record we can't quietly rewrite.
Today: the timestamps inside a receipt are our own claim, signed by us. The signature proves we wrote them; nothing proves we wrote them honestly.
-
Cover photos and files, not just text
not built yetExtend receipts to fingerprint photo and file deliverables alongside the delivered text.
Today: a receipt covers the text of a deliverable only. If a task's evidence is an image, the receipt says nothing about whether that image is the one we sent.
-
Rehearse a key change before we need one
not built yetPerform and document a real signing-key rotation: publish a new key, sign new receipts with it, and keep the retired public key published so existing receipts keep verifying.
Today: the mechanism exists — every receipt names the key that signed it — but it has never been exercised. One key has ever been used, so rotation is a design claim, not a demonstrated one.
-
Decide what happens if a key must be revoked
not built yetSpecify the compromise case, which is not the same as the planned case: how a revocation is announced, whether affected receipts are re-issued, and how a verifier should treat a key that has disappeared from the published set.
Today: unspecified. A key withdrawn for compromise rather than replaced on schedule would silently strand every receipt it signed.
signed_receipts block of /agent.json. The same four items are published machine-readably in that file's roadmap block, carrying the same warning.
Questions before you trust it?
Ask directly — the operator answers personally.