Pinakel · Trademark Data API · v1
Integrator Guide
Jurisdiction-scoped trademark lookup and change tracking, built for docketing systems and IP platforms. Base URL:
https://api.pinakelai.com
Interactive OpenAPI reference: /docs · machine-readable spec: /openapi.json
Authentication
Every data request carries your API key in the X-API-Key
header (or as a Bearer token). Keys are issued when your
agreement is set up and can be viewed, rotated and monitored in your
customer portal.
curl -H "X-API-Key: pk_live_…" \
"https://api.pinakelai.com/v1/CA/trademarks?application_number=2078049"
Endpoints
GET/v1/{code}/trademarks
Look up trademarks by office number. Pass exactly one of
application_number or registration_number.
Returns a list — several offices reuse numbers across series and
re-filings, so a number is not guaranteed to identify one record.
GET /v1/CA/trademarks?application_number=2078049
GET /v1/CA/trademarks?registration_number=TMA1164763
GET /v1/CA/trademarks?application_number=2078049&expand=payload
GET/v1/{code}/trademarks/{uid}
Canonical fetch. (code, uid) is the stable identity of a
record across updates — store it, and use it for everything after the first
lookup. uid is opaque text; do not assume any format.
GET/v1/{code}/changes?since=…
The docketing sync feed: every record version we ingested at or after
since (ISO date or timestamp), keyset-paginated.
GET /v1/CA/changes?since=2026-08-01
GET /v1/CA/changes?since=2026-08-01&cursor=eyJ…&limit=500
The contract, precisely:
- The cursor is a durable frontier. Persist
next_cursorand resume from it in any later session; you will see every subsequent version exactly once. - Upsert by
(code, uid). A reload on our side re-delivers records with a newloaded_at— that is intentional, not duplication. next_cursor: nullmeans caught up to the safety horizon (the feed intentionally stops 5 minutes short of now), not that nothing will ever follow.record_update_dateon each item is the office's own freshness stamp; filter on it client-side if you only care about office-side changes. The feed itself is keyed on our ingestion time (loaded_at), which is never null and strictly resumable.
GET/v1/usage
Your key's own month-to-date call count, quota and rate limit — poll it freely to watch your consumption.
Response fields & null semantics
Lookups return the record projection; add ?expand=payload
for the full normalized document (can be large — up to ~1 MB for
history-rich records).
| field | meaning |
|---|---|
| code, uid | the stable identity — always present |
| application_number, registration_number | office numbers; null when the office has not assigned one (~13% of records lack a registration number — pending and abandoned marks legitimately have none) |
| mark_name | the mark text as filed |
| status | normalized: Registered · Pending · Abandoned · Cancelled · Unknown |
| tm5_status | the office's TM5 status string where provided |
| application_date, registration_date, expiry_date | office dates; null means the office did not state it (~36% of records have no expiry date). Null is data — we never substitute defaults. |
| record_update_date | office-side record freshness |
| nice_classes | Nice classification numbers |
| loaded_at | when this version entered Pinakel — the /changes sync key |
| payload | full normalized document (only with expand=payload; the key is absent otherwise, never null) |
Errors & limits
| status | meaning |
|---|---|
| 400 | malformed request (e.g. both or neither lookup number; bad cursor) |
| 401 | missing or unknown API key |
| 403 | revoked key |
| 404 | no matching record — a real answer, not an error to retry |
| 429 | rate limit or monthly quota exceeded — see headers |
A 429 carries Retry-After and either
X-RateLimit-Limit / X-RateLimit-Remaining (per-minute rate) or
X-Quota-Limit / X-Quota-Used (monthly quota). Requests refused
with 429 are never counted against your usage.
Coverage
Live from the serving database — 2 jurisdictions, 75,970 records ready right now. Coverage grows as backfills complete; this table is generated per-request and never overstates.
| jurisdiction | records | daily frontier |
|---|---|---|
| AD | 49,169 | 2026-08-12 |
| AL | 26,801 | — |
Support
Integration questions: support@pinakelai.com · commercial: hello@pinakelai.com