Pentonym®
Home  ·  Developers
Developer docs · API & MCP

From zero to a signed verdict in one call.

Everything an integrator needs: authentication, the free tier, every live endpoint, MCP setup, and copy-paste curl. The base URL is https://api.pentonym.com. Every example below runs against the real API.

The 30-second version

POST a candidate name to /v1/screen and get back a three-state clearance verdict — PROCEED, DO_NOT_PROCEED, or CANNOT_DETERMINE — with per-axis evidence, Ed25519-signed so anyone can re-verify it. Your first three checks need no key. The same engine is exposed as an MCP tool so an assistant can call it mid-conversation. US & EU coverage; a screening signal, not legal advice.

Quickstart

Your first call — no key required

The free tier is anonymous. Send a stable per-install token in X-Pentonym-Install and you get three checks before any signup. Always pass goods — the field of use. Trademark conflict is judged relative to it; without it the trademark axis can only return CANNOT_DETERMINE.

# 3 free checks per install token, no account curl -X POST https://api.pentonym.com/v1/screen \ -H "Content-Type: application/json" \ -H "X-Pentonym-Install: my-app-install-001" \ -d '{ "name": "Pentonym", "goods": "trademark clearance software", "classes": [42] }'

The response is a signed verdict. Trimmed for readability — the real body carries full per-axis evidence and the verbatim signed_payload:

{ "verdict_id": "vd_9f3c…", "name": "Pentonym", "issued_at": "2026-07-27T18:22:04+00:00", "decision": "PROCEED", // never a score "why": "no gating aspect found a bar", "aspects": [ { "aspect": "trademark_us", "class": "GATING", "state": "CLEAR", "why": "…", "evidence": [ … ] }, { "aspect": "domains", "class": "MATERIAL", "state": "FINDING", … }, { "aspect": "handles", "class": "MATERIAL", … } ], "notes": [ … ], "disclaimer": "Pentonym is a screening signal, not legal advice…", "counsel_note": "This is the front of the clearance funnel…", "signature_b64": "wSYo21f8sMF0Cyt…", // Ed25519 "signature_key_id": "k1", "signed_payload": { "verdict_id": "vd_9f3c…", "name": "pentonym", "name_as_submitted": "Pentonym", "decision": "PROCEED", "issued_at": "…", "aspect_states": { … } }, "usage": { "tier": "anonymous", "checks_remaining": 2, "install_id": "my-app-install-001" } }

Only gating aspects (the trademark axes) can return DO_NOT_PROCEED. Material aspects — domains, handles, web use, cultural flags — shape how you proceed; they never bar. The signature covers signed_payload exactly (the normalised name, decision, issued-at and per-aspect states) — not the evidence lists, which are large and unordered.

Authentication

Two credentials, both optional at the door

Auth is a header, never a cookie — safe to call cross-origin from a browser. The free tier is a real, first-class path, so an unauthenticated call is legitimate (it is metered, not rejected). There are two ways to identify a caller:

  • Bearer API keyAuthorization: Bearer pk_…. Identifies a keyed account (the BearerApiKey scheme in the OpenAPI spec). Mint one at POST /v1/connect; the key is the identity — there are no passwords or sessions.
  • Install tokenX-Pentonym-Install: <opaque>. A stable per-install token for the anonymous free tier (MCP clients and the web app carry it). Persist it client-side so the three free checks are counted against the same install.
# keyed account — send the Bearer key curl -X POST https://api.pentonym.com/v1/screen \ -H "Authorization: Bearer pk_free_XXXX" \ -H "Content-Type: application/json" \ -d '{"name":"Lumen","goods":"a coffee shop","classes":[43]}'
The free tier

Three free, then ten, then a plan

  • 3 anonymous checks per install token — no signup.
  • +10 checks once you connect a free account: POST /v1/connect with an email returns a pk_… key (shown once) carrying a one-time signup bonus.
  • After that, a paid plan. When the free tier is exhausted the API returns HTTP 402 with an upgrade_prompt field written to be surfaced verbatim by a calling LLM — never a bare error.
# get a key with the +10 bonus (once per email) curl -X POST https://api.pentonym.com/v1/connect \ -H "Content-Type: application/json" \ -d '{"email":"you@company.com"}' { "api_key": "pk_free_XXXX", // shown ONCE — store it "tier": "free", "checks": 10, "bonus_granted": true, "mcp": { "url": "https://mcp.pentonym.com", "transport": "streamable-http" } }

Check your balance any time with GET /v1/account (send the Bearer key). Batch requests and a per-user OAuth connector are on the roadmap (coming soon).

Reference

Every live endpoint

  • POST /v1/screen — the signed three-state clearance verdict (PROCEED / DO_NOT_PROCEED / CANNOT_DETERMINE). Metered.
  • POST /v1/classify — free-text product description → Nice class(es) + verbatim USPTO ID Manual identification language, with a surcharge_free flag for accepted entries (surcharge avoidance).
  • POST /v1/watch — register a watch on a mark and run the first register scan immediately, returning a signed alert.
  • GET /v1/watch/{watch_id} — re-scan a registered watch; returns a fresh signed alert.
  • GET /v1/account — the account behind a Bearer key: tier, checks remaining, bonus balance.
  • POST /v1/connect — issue an account key (+10 signup bonus, once per email).
  • GET /v/{verdict_id} — independently verify a signed receipt (HTML page or JSON, content-negotiated).
  • GET /.well-known/pentonym-signing-key — the Ed25519 public key, algorithm and canonicalisation rule. Unauthenticated.
  • GET /mcp — the streamable-HTTP MCP server (discovery + live smoke).
  • GET /openapi.json & GET /docs — the full machine-readable spec and interactive Swagger UI.
  • GET /health — liveness plus whether signing, EUIPO and metering are configured.
# classify a product into a Nice class + verbatim ID-Manual language curl -X POST https://api.pentonym.com/v1/classify \ -H "Content-Type: application/json" \ -d '{"description":"an app that schedules dog walkers","jurisdiction":"US"}' # monitor a mark — first scan runs immediately curl -X POST https://api.pentonym.com/v1/watch \ -H "Content-Type: application/json" \ -d '{"name":"Pentonym","classes":[42]}'

The /v1/screen body accepts more than name and goods: classes (Nice classes), markets, in_use, filing dates for a filing plan, and deep (the slow, thorough Instagram/TikTok handle checks — off by default). Unknown fields are rejected rather than silently dropped, so a typo can't quietly run an unconstrained search.

MCP

Callable from inside the model

Pentonym ships as an MCP server over streamable-HTTP, so an assistant can clear a name mid-conversation and return a real signed verdict rather than a guess. Point your client at https://mcp.pentonym.com and pass your key as a Bearer header:

// Claude / Cursor / ChatGPT MCP config { "mcpServers": { "pentonym": { "url": "https://mcp.pentonym.com", "headers": { "Authorization": "Bearer pk_free_XXXX" } } } }

Tools

  • clear_name — signed three-state verdict for a candidate (metered on the same ledger as the REST free tier)
  • find_names — hand off to the done-for-you naming service; returns a brief link (free)
  • verify_receipt — independently verify a receipt by its id (free)

Rails carried in the tool text

  • Three-state verdict, never a score
  • US = full confusion analysis; EU = EUIPO exact-wordmark knockout; not worldwide
  • A screening signal, not legal advice

The tool descriptions carry the honesty rails so the model repeats them, and instruct it to always pass goods — which it usually knows from the conversation.

Signed receipts

Verify a verdict without trusting us

Every verdict is an independently verifiable Ed25519 receipt. A downstream product — or a founder's lawyer months later — can confirm a verdict was genuinely ours, two ways:

  • Hosted: open https://pentonym.com/v/{verdict_id}. A browser gets a PASS/FAIL page; curl and SDKs get the same fields as JSON. The server re-checks the signature over the exact bytes it persisted.
  • Yourself: fetch the public key from /.well-known/pentonym-signing-key and verify the signature_b64 against the canonicalised signed_payload — no call back to Pentonym required.
# independently verify a receipt by id curl -H "Accept: application/json" https://pentonym.com/v/vd_9f3c… { "verdict_id": "vd_9f3c…", "decision": "PROCEED", "verified": true, "algorithm": "Ed25519", "key_id": "k1", … } # the public key, algorithm and canonicalisation rule curl https://api.pentonym.com/.well-known/pentonym-signing-key

Canonicalisation is JSON with sorted keys, compact separators and UTF-8. verified: true means the signature matches; false means the receipt was altered or signed by another key; null means the server has no key configured and cannot answer — never a false PASS or FAIL.

What it is

Read the verdict honestly

  • Three states, no number. There is no score anywhere in any response, and the verdict shape provides no way to add one. Averaging non-commensurable axes is exactly the false precision Pentonym refuses.
  • CANNOT_DETERMINE is not an error. It means a gating aspect could not be screened — absence of evidence is not evidence of absence. Treat it as "unknown", never as "clear".
  • US & EU, not worldwide. The US register is screened for full likelihood-of-confusion; the EU is a live EUIPO exact-wordmark knockout. No other national registers — don't present it as global.
  • Not legal advice. Pentonym is the front of the clearance funnel, not a written clearance opinion. It is not a law firm, and no attorney-client relationship is formed. Every response repeats this.
FAQ

Common questions

Do I need an API key to start?

No. Three checks are free with just an X-Pentonym-Install token — no signup. Connect a free account (POST /v1/connect) for ten more, then move to a plan.

What do I send in the request body?

At minimum name, and you should always send goods (the field of use) — the trademark axis needs it. Optional fields include classes, markets, in_use, filing dates and deep. Unknown fields are rejected, not ignored.

What happens when I run out of free checks?

The API returns HTTP 402 with an upgrade_prompt written to be spoken verbatim by an LLM, plus signup_url and topup_url. It is never a bare error, and never an empty "clear" verdict.

Is the API response the same thing the app shows?

Yes — the exact same signed verdict. The receipt you see in the app is the API response, and anyone can re-verify it at /v/{verdict_id} against the public key.

Where's the machine-readable spec?

GET /openapi.json for the full OpenAPI document, and GET /docs for the interactive Swagger UI with an "Authorize" dialog for both credential schemes.

Real verdict · pentonym.app/v1/screen · Ed25519 · signed & independently verifiable a screening signal, not legal advice · US & EU coverage