API reference

The Patent77 API, endpoint by endpoint

JSON, snake_case fields. Every response includes `request_id` and `disclaimer`; errors are `{ error: { code, message } }`. Metered by search and by report. A search is one prior-art run; a report is the paid deliverable, with per-report overage beyond the plan allowance.

Base URL https://www.patent77.com/api/v1 · Auth Optional for POST /searches, /patents/{pub_number}, /pricing and the index (anonymous = throttled trial; search results truncated to the top 3 references, no element mapping). Send `Authorization: Bearer p77_live_…` (or `x-api-key`) for plan quotas and full references. Reports require a paid (Pro/Scale) key.

GET

/api/v1

anonymous ok

Self-describing index: every endpoint, the MCP server, OpenAPI, pricing and docs URLs in one JSON response.

request

curl https://www.patent77.com/api/v1

response (abridged)

{
  "name": "Patent77 API",
  "version": "1",
  "base": "https://patent77.com/api/v1",
  "openapi": "https://patent77.com/api/openapi",
  "mcp": "https://patent77.com/api/mcp",
  "pricing": "https://patent77.com/api/v1/pricing",
  "llms_txt": "https://patent77.com/llms.txt",
  "endpoints": [
    { "method": "POST", "path": "/api/v1/searches", "auth": "optional", "paid": false, ... }
  ],
  "disclaimer": "..."
}
GET

/api/v1/pricing

anonymous ok

Machine-readable pricing - plans, included searches and reports, per-report overage, rate limits and features.

request

curl https://www.patent77.com/api/v1/pricing

response (abridged)

{
  "currency": "USD",
  "plans": [
    {
      "id": "pro",
      "price_usd": 49,
      "searches_per_month": 50,
      "reports_per_month": 10,
      "overage_usd_per_report": 4,
      "rate_limit_per_minute": 120,
      ...
    }
  ]
}
POST

/api/v1/searches

anonymous ok

Run an AI prior-art search: plan claim elements + corpus queries from a plain-English description, search the live Google Patents corpus, return scored references with a headline risk. Anonymous calls work but are truncated (top 3 references, no element mapping); an API key gets plan quota and full references.

ParamInRequiredDescription
descriptionbodyyesPlain-English description of the invention - what it is, what it does, what makes it different. At least a sentence or two.
titlebodynoOptional short title to store with the search.
Idempotency-KeyheadernoOptional. Retries with the same key return the original result instead of running (and billing) a second search.

request

curl -X POST https://www.patent77.com/api/v1/searches \
  -H "Authorization: Bearer p77_live_..." \
  -H "Content-Type: application/json" \
  -d '{"description": "A bicycle helmet with a built-in crash-detection accelerometer that texts an emergency contact"}'

response (abridged)

{
  "search_id": "sr_7d31c8",
  "status": "completed",
  "invention_title": "Crash-detecting helmet with emergency alert",
  "risk": "medium",
  "risk_note": "Close art exists for impact sensing in headgear; ...",
  "elements": [
    { "id": "e1", "label": "impact sensor", "text": "an accelerometer mounted ..." }
  ],
  "queries": ["helmet accelerometer crash detection", "..."],
  "refs": [
    {
      "pub_number": "US10123456B2",
      "title": "Impact-sensing protective headgear",
      "abstract": "...",
      "assignee": "...",
      "pub_date": "2021-03-09",
      "url": "https://patents.google.com/patent/US10123456B2",
      "score": 0.87,
      "overlap": "Teaches a helmet-mounted accelerometer that ...",
      "elements_hit": ["e1", "e2"]
    }
  ],
  "ref_count": 12,
  "refs_returned": 12,
  "candidates_considered": 214,
  "corpus": "google-patents",
  "engine": "...",
  "request_id": "req_9f3ac1d0",
  "disclaimer": "..."
}

// anonymous callers: refs truncated to 3, no elements/queries,
// plus an "attribution" field (required for free use)
GET

/api/v1/searches

List the caller's own saved searches, newest first.

request

curl https://www.patent77.com/api/v1/searches -H "Authorization: Bearer p77_live_..."

response (abridged)

{
  "searches": [
    {
      "id": "sr_7d31c8",
      "status": "completed",
      "invention_title": "Crash-detecting helmet with emergency alert",
      "risk": "medium",
      "ref_count": 12,
      "top_score": 0.87,
      "created_at": "2026-07-11T09:12:44Z",
      "completed_at": "2026-07-11T09:14:02Z"
    }
  ],
  "request_id": "req_11ac90b2"
}
GET

/api/v1/searches/{id}

Get one search with its full reference list, elements and executed queries.

ParamInRequiredDescription
idpathyesSearch id returned by POST /searches.

request

curl https://www.patent77.com/api/v1/searches/SEARCH_ID -H "Authorization: Bearer p77_live_..."

response (abridged)

{
  "id": "sr_7d31c8",
  "status": "completed",
  "invention_title": "Crash-detecting helmet with emergency alert",
  "risk": "medium",
  "elements": [ ... ],
  "queries": [ ... ],
  "refs": [ { "pub_number": "US10123456B2", "score": 0.87, ... } ],
  "request_id": "req_5510c7de"
}
POST

/api/v1/reports

Pro+

Build a full patentability report over a search: verdict, examiner-style novelty/obviousness narrative, element-by-reference matrix and a limitations section. Pass a prior search_id, or a description to run search + report in one call. Paid plans only (402 upgrade_required otherwise); counts toward the monthly report quota, then billed per report.

ParamInRequiredDescription
search_idbodynoId of a completed search to report on. Provide this OR description.
descriptionbodynoPlain-English invention description - runs a new search and a report in one call (bills one of each unit).
Idempotency-KeyheadernoOptional. Retries with the same key return the original report instead of building (and billing) a second one.

request

curl -X POST https://www.patent77.com/api/v1/reports \
  -H "Authorization: Bearer p77_live_..." \
  -H "Content-Type: application/json" \
  -d '{"search_id": "SEARCH_ID"}'

response (abridged)

{
  "id": "rp_3e81aa",
  "search_id": "sr_7d31c8",
  "status": "completed",
  "verdict": "partial-overlap",
  "headline": "The sensing and alerting elements are individually known; ...",
  "narrative": "## Novelty\n\nUS10123456B2 discloses ... (markdown)",
  "matrix": [
    {
      "element_id": "e1",
      "cells": [
        { "pub_number": "US10123456B2", "reads": "yes", "note": "col. 4, accelerometer ..." }
      ]
    }
  ],
  "limitations": "This search covered patents and published applications ...",
  "request_id": "req_77e0b913"
}

// without a paid key: 402
// { "error": { "code": "upgrade_required", "message": "..." }, "request_id": "..." }
GET

/api/v1/reports/{id}

Pro+

Get one patentability report - verdict, narrative, matrix and limitations.

ParamInRequiredDescription
idpathyesReport id returned by POST /reports.

request

curl https://www.patent77.com/api/v1/reports/REPORT_ID -H "Authorization: Bearer p77_live_..."

response (abridged)

{
  "id": "rp_3e81aa",
  "search_id": "sr_7d31c8",
  "status": "completed",
  "verdict": "partial-overlap",
  "headline": "...",
  "narrative": "...",
  "matrix": [ ... ],
  "limitations": "...",
  "created_at": "2026-07-11T09:20:18Z",
  "request_id": "req_c4f2201a"
}
GET

/api/v1/patents/{pub_number}

anonymous ok

Look up one patent by publication number - title, abstract, assignee, publication date, claims and the canonical source URL. Anonymous allowed, rate-limited.

ParamInRequiredDescription
pub_numberpathyesPublication number, e.g. US10123456B2.

request

curl https://www.patent77.com/api/v1/patents/US10123456B2

response (abridged)

{
  "pub_number": "US10123456B2",
  "title": "Impact-sensing protective headgear",
  "abstract": "...",
  "assignee": "...",
  "pub_date": "2021-03-09",
  "claims": ["1. A protective helmet comprising ...", "2. The helmet of claim 1 ..."],
  "description_excerpt": "...",
  "url": "https://patents.google.com/patent/US10123456B2",
  "request_id": "req_90d1e6b4"
}
GET

/api/v1/usage

Current billing-period usage vs quota - searches and reports used, remaining, and the caller's rate limit.

request

curl https://www.patent77.com/api/v1/usage -H "Authorization: Bearer p77_live_..."

response (abridged)

{
  "plan": "pro",
  "period": "calendar_month_utc",
  "searches": { "used": 14, "limit": 50 },
  "reports": { "used": 3, "limit": 10, "overage_usd": 4 },
  "rate_limit_per_minute": 120,
  "request_id": "req_2b8c11f0"
}

Errors

Error codes

Every error is { error: { code, message } } plus request_id. Codes are stable; messages are human-readable and may change.

CodeHTTPWhen
invalid_request400Malformed body or missing required field.
unauthorized401Invalid or revoked API key.
upgrade_required402Paid feature (reports) or allowance exhausted.
not_found404Unknown id or publication number.
payload_too_large413Description over 10,000 characters.
unprocessable422Description too short or not an invention.
rate_limited429Per-minute or anonymous daily limit hit; Retry-After header set.
upstream_unavailable503The corpus or LLM backend failed; retry with the same Idempotency-Key.

Machine-readable companions: /api/openapi, /api/v1 (self-describing index), /llms.txt. MCP setup lives at /developers/mcp.