Identity infrastructure for the agent economy

Verify a real, continuous human. Then act for them.

Faces and voices are cheap to forge, and every check on the market checks a single moment. Pupul carries the one thing a moment cannot fake: a person-owned record of being a real human over time. The person grants you a scoped, signed block of it at sign-in, you verify it without ever calling us, and they can pull it back at any time.

See it. This page is a different app.
Sign in with Pupul

Sign in and watch an AI meet you for the first time and already know you. Need a record first? Take the reading.

The shift

Sign in with Google told your app the user had a Google account. Sign in with Pupul hands your app a block of the person's own record of being human, granted by them, in a form you can verify without ever calling us.

Every AI product now needs this and has no clean way to get it. Bots and agents are indistinguishable from people in a single moment. Consent is becoming a legal requirement, not a nicety. What no competitor can shortcut is elapsed time: a record that started the day the person took their reading and has been accruing since, on an append-only ledger that even we cannot rewrite.

What one call gives you today

Know the user

Their word, their rhythm, the force that moves them, and a greeting already adapted to them. Personalize from the first second, not the tenth session.

See how they got there

The token names how the person authenticated at the door and what they granted. An authentication fact you can check, not a checkbox a bot ticks.

Stay clean

Scoped, revocable, offline-verifiable consent, with a revocation list you can read. The record regulators and enterprises are about to demand.

Add it in an afternoon

Self-serve, no sales call. Mint credentials in one request, then it is ordinary OAuth with one extra call. First 1,000 reads a month are free, then the Developer plan is $49 a month for 25,000. We put the number here because a developer should not have to find the pricing on a different page to know what this costs at scale.

0. Get credentials (self-serve, instant): curl -X POST https://noctaracorp.com/api/oauth/register \ -d '{"app_name":"My AI App","email":"you@yourapp.com", "redirect_uris":["https://yourapp.com/callback"]}' 1. Send the person to /api/oauth/authorize (they consent, you get a code) 2. Exchange the code for a token at /api/oauth/token (server-side) 3. One call to /api/pupul-context returns the read, and an AI already personalized to them. The token is ES256; verify it offline against /.well-known/jwks.json, never calling us. Browser app? One script tag: https://noctaracorp.com/sdk.js Meter: GET /api/oauth/usage with your credentials. discovery https://noctaracorp.com/.well-known/oauth-authorization-server

Verify without calling us

The access token is ES256. Fetch /.well-known/jwks.json once and verify every grant offline from then on, with no call back to us and no way for us to learn who checked. Revocation rides a public status list, so a grant the person pulled fails your check without a lookup that identifies you. An assistant that speaks MCP can verify a granted block directly against mcp.noctaracorp.com, tool noctara, mode packet.

The registry call

One request answers whether a real human is there, whether it is the same human as before, and whether the pattern has broken, and it hands back the evidence for every answer. It never returns the reading, the answers, or anything the person wrote.

curl -H "Authorization: Bearer noctara_lk_your_key" \ https://noctaracorp.com/api/v1/registry?tag=your_client_tag { "claims": { "is_human": true, "is_continuous": true, "has_deviated": false, "stands_behind": true }, "provenance": { "beats": 14, "distinct_weeks": 6, "first_beat": "...", "last_beat": "...", "thresholds": { "is_human": ">= 2 beats", "is_continuous": ">= 2 distinct weeks" } }, "consent": { "granted": true, "revocable_at": "/consent" } }

The thresholds ride in every response because a number nobody can inspect is a black box wearing an API. You are entitled to judge our definition of continuous rather than take it.

Delegation: prove your agent acts for a verified human

The registry answers whether a real person is there. Delegation answers the next question every agent standard leaves open: does this agent have that person's permission to act, and in what scope. AP2, Visa TAP, Mastercard Agent Pay and OAuth for MCP all anchor the human once and then ride tokens; none carries a signed root that a real, continuous person stands behind the agent. A delegation token is that root. The person mints it from their own grant, it names the agent and the exact scope, it expires within ninety days, and it is revocable to a public status list the same instant they change their mind.

curl -X POST https://noctaracorp.com/api/delegation-token \ -d '{ "email": "them@example.com", "mark": "their-mark", "agent": "your-client-id", "scope": ["read:identity", "purchase:<=50usd"], "ttl_days": 30 }' { "ok": true, "jti": "dlg_...", "sub": "<stable person id>", "agent": "your-client-id", "scope": ["read:identity", "purchase:<=50usd"], "token": "<ES256 JWT>", "exp": 1793000000 }

Verify it the same way you verify anything we issue: check the ES256 signature against /.well-known/jwks.json and the jti against the public status list, offline, no call to us. The batteries-included path is GET /api/delegation-token?token=..., which returns active:true until the person revokes and active:false, reason:"revoked" the moment they do. We mint a delegation only for a human we can resolve to a real, continuous identity; an unauthenticated caller gets nothing.

The rule that shapes every answer

A claim we cannot evidence comes back null, never false. false asserts we looked and the thing is not so; null says we do not know. Collapsing those two would mean telling you a real person is not one on the strength of a query that failed. If the ledger is unreadable we return 503 and withhold all four claims rather than guess. If the person has not granted your org, you get no claims at all, because a registry that answers questions about people who did not agree to be asked about is a surveillance product, and this one is not.

Honest scope, measured today

Be clear-eyed before you integrate: only a few dozen people across our base carry the two or more beats that is_human requires, and most consented records still answer all-nulls. The endpoint is correct; the records underneath it are thin. The useful version of this product is one where your own users have accrued something worth grading, and that takes weeks of them showing up, not an afternoon of you wiring it. We would rather tell you that now than after.

What it costs

Free through 1,000 active records a month. After that, five cents per active record per month, with no minimum and no contract. An active record is one distinct person your key asked about at least once that month, counted once no matter how many times you ask, so re-checking on every session costs nothing extra.

If you would rather build on it before it costs anything at all, we are taking ten design partners: free and uncapped, a direct line to the founder, and the same honest account of how thin the records are today.

curl -H "Authorization: Bearer noctara_lk_your_key" \ https://noctaracorp.com/api/v1/usage { "active_records": 2, "free_included": 1000, "billable_records": 0, "rate_usd_per_active_record": 0.05, "estimated_usd": 0, "basis": { "counted": "only calls that actually returned claims", "privacy": "we count salted one-way tokens, not identities" } }

We bill only for answers. A call refused because the person had not granted you, or that could not complete because the ledger was unreadable, is logged for diagnostics and never billed.

Why it holds

The person mints their identity once, inside our own products, and owns it forever. Every app that reads a Pupul makes holding one worth more; every person who holds one makes adding the button worth more. The control register, how a person can be moved, is never grantable to anyone. This is a standard, not a feature.

Want a client_id for your app or agent? Mint it yourself with the register call above, no request needed.  ·  Read the integration docs.  ·  Need the consent record itself? Generate one free, ISO/IEC TS 27560 shape with DPV terms, entirely in your browser.  ·  Honest scope: what ships today is the consented read, the authentication fact carried in the token, offline verification, and the four-claim registry call. is_human is a presence signal over an accruing record, not a calibrated biometric, and we say so to every buyer and in every response.