For developers
The signed record, from your own code.
The Verified by NPC API is live at api.npclabs.xyz. Register the agents and content you ship, look their records up from your own application, and check NPC's signatures yourself, against keys NPC publishes. No API key is needed, and registration is free.
What you can build
Put an agent on record
Register an agent you run and get a signed record with its own NPC ID, issued on the spot. The record names the agent's accountable owner and states what has been checked and what has not.
Put content on record
Register an image, text, audio, video, or other content, by web address or by content hash. The answer is the same kind of signed record, ready to cite wherever the content travels.
Look any record up
One call resolves an NPC ID to its signed record: registrations, credentials, products, and agents. An ID with no record answers unknown, plainly, and never a guess.
Check the signature yourself
Every record is signed with Ed25519, and the public keys are published. Your code can confirm a record came from NPC and has not been changed, without calling NPC at all.
Quickstart
Every call below is real. The examples were run against the live API while this page was written, and the records they made are live records you can look up.
1. Check the service.
2. Register an agent. An agent registration names the agent and its accountable owner. A homepage or a description is required. The owner's email is required too, and it never appears in the public record.
The answer, status 201, is the signed record, issued on the spot:
The status says what the record is: registered, checks pending. Registration is the start of verification, not the result, and no verification mark is issued at registration. The record itself lists the checks that ran and the ones that have not.
3. Register content. The kind is one of image, text, audio, video, or other. The locator is a web address where the content can be fetched, or its SHA-256 hash, written as sha256: followed by the hash. Content at a web address is fetched once at intake, and its SHA-256 is recorded. This example registers by hash, so the record carries the hash the creator provided:
For an image, intake also reads the image's C2PA content credentials, recording whether they are present and how they are structured, and records an AI-generation signal as a percentage with its uncertainty stated. A signal is information, not a verdict, and the record says which is which.
4. Look a record up. The same record answers at its own address, and Search on this site resolves the same IDs:
An ID with no record fails closed:
5. Check the signature. Records carry their signature inside them, and every API response carries one in its headers: X-NPC-Signature, with the signing key named by X-NPC-Key-ID. The public keys live at one address:
The current keys, from that document. Retired keys are listed there too, marked retired, so older records stay checkable:
- Find the key. Take the record's key_id and find that entry in the keys document.
- Canonicalize. Remove the signature field, then write what is left as NPC-JCS-v1: UTF-8, keys in sorted order, no extra whitespace.
- Verify. Check the base64 Ed25519 signature against that entry's public key.
The example record above passes this check, and changing any field in it makes the check fail.
The MCP endpoint
If you build with agents, the same records are one connection away. NPC runs a hosted MCP server at https://api.npclabs.xyz/v1/mcp. Point an MCP client at that address:
Its tool list answers today with seven tools. Four verify against the records (verify_claim, verify_credential, verify_product, verify_agent), one explains an answer in plain words (explain_verification), and two register from inside the conversation (register_agent, register_content):
Prefer to run the server yourself: the same tools ship on PyPI as npc-verify-mcp, version 1.0.1.
Good to know
- Registration is free, and the public endpoints on this page need no API key.
- A named owner is required. An agent registration names an accountable person as its owner; anonymous owners and team aliases are not accepted.
- Emails stay private. The owner or creator email is required for registration. It stays on NPC's servers, for caps and contact, and never appears in the signed public record.
- Retries are safe. Send an Idempotency-Key header with a registration, and repeating the same request with the same key returns the original record instead of making a second one.
- Registration is capped at 10 per email address and 50 per IP address in 24 hours. Past the cap the API answers 429, and the request can be sent again later.
- Requests are capped at 1 MiB.
- Records are signed, not minted. A record is an Ed25519 signature kept by NPC; registering writes nothing to a blockchain.
- Status means what it says. A new record starts as registered, checks pending. Its status changes only when its checks run, and the record lists which checks those were.
Which surface should you use?
| Surface | Fits | Use it when |
|---|---|---|
| REST API | Your own application or service | You want registration and record lookups inside your own code. |
| Hosted MCP | Agent frameworks and MCP clients | You want an agent to ask, and to register, as it works, with no server of your own to run. |
| npc-verify-mcp | Your own infrastructure | You want to run the MCP server yourself, against the same live API. |
| Plugins | ChatGPT, Gemini, and other assistants | You want NPC checks inside an assistant your users already open. See the Plugins page. |
Questions about building on the API: hello@npclabs.xyz.