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:

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).

fieldmeaning
code, uidthe stable identity — always present
application_number, registration_numberoffice numbers; null when the office has not assigned one (~13% of records lack a registration number — pending and abandoned marks legitimately have none)
mark_namethe mark text as filed
statusnormalized: Registered · Pending · Abandoned · Cancelled · Unknown
tm5_statusthe office's TM5 status string where provided
application_date, registration_date, expiry_dateoffice 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_dateoffice-side record freshness
nice_classesNice classification numbers
loaded_atwhen this version entered Pinakel — the /changes sync key
payloadfull normalized document (only with expand=payload; the key is absent otherwise, never null)

Errors & limits

statusmeaning
400malformed request (e.g. both or neither lookup number; bad cursor)
401missing or unknown API key
403revoked key
404no matching record — a real answer, not an error to retry
429rate 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.

jurisdictionrecordsdaily frontier
AD49,1692026-08-12
AL26,801
A jurisdiction listed here serves lookups and the /changes feed. Jurisdictions not listed return 404 for every lookup — if you need one you don't see, tell us and we'll prioritize its backfill.

Support

Integration questions: support@pinakelai.com · commercial: hello@pinakelai.com