Patents
Patent publications by company/CPC/date, pre-computed aggregate counts and year-over-year growth, and full patent records with citations and resolved assignees.
4 endpoints · every section below is generated from the API catalog
Paginated, filterable listing of patent publications using direct indexed filters (company/assignee, CPC classification prefix, publication date range, country, legal status) - no graph traversal. include_total is declared required so every call computes the exact meta.total the agent quotes; never quote a page length as a total. Company filters accept an exact raw assignee string, 'organizations/<key>', 'ror:<id>' or 'lei:<id>' and resolve to the company's full graph id cluster (raw mentions + ROR/LEI entities); an unresolved company value or unknown CPC prefix returns HTTP 400 naming the value - the filter is never silently dropped, so an empty result always means the portfolio is truly empty. Requires a Pro workspace (returns HTTP 402 otherwise). Use patents.aggregate for counts, patents.yoy-growth for trends, and patents.details with a row's patent_id for the full enriched record.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| company_id | string | No | Organization to filter on. Accepts an exact raw assignee string (as it appears in a patent's assignees array), 'organizations/<key>', 'ror:<id>', 'lei:<id>', or a bare ROR/LEI id. Takes precedence over company_name. Unresolved values return HTTP 400 (never silently ignored). |
| company_name | string | No | Resolved organization name, used as a fallback when company_id is not provided; the server resolves it to an organization. |
| cpc_code | string | No | CPC classification code or prefix (e.g. 'A61K'). Combined with include_descendants to expand the prefix. |
| include_descendants | string | No | When true (default), a cpc_code prefix expands to every code starting with it; set false for exact-code matches only. Allowed values: true, false |
| publication_date_from | string | No | YYYY-MM-DD; matches patents published on or after this date. |
| publication_date_to | string | No | YYYY-MM-DD; matches patents published on or before this date. |
| country | string | No | Country code (case-insensitive; the server uppercases it). |
| legal_status | string | No | Legal status filter (case-insensitive). |
| page | integer | No | Page number (default 1). Range: 1 to ∞ |
| limit | integer | No | Results per page (1-100, default 20). Range: 1 to 100 |
| sort | string | No | Sort field (default publication_date). Allowed values: publication_date, title |
| order | string | No | Sort direction (default desc). Allowed values: asc, desc |
| include_total | string | No | Must be true. Computes the exact result count (meta.total) which the agent must quote as the total; a page length must never be presented as a total. Allowed values: true, false |
Example request
curl -H "x-api-key: YOUR_API_KEY" \ "https://app.caelrith.com/api/v1/patents"
Retrieve ONE patent's full record by its publication identifier (e.g. WO2021098789A1, EP3823456A1): abstract, inventors, classifications with CPC descriptions, family members, legal/priority/application dates, patent + NPL citations, graph-enriched citation counts, and resolved_assignees whose rows carry the full resolution chain (mention_id / direct_id / ultimate_id, with organization_id kept as the mention_id alias). Any of those ids is directly reusable as the company_id filter on patents.search / patents.aggregate / patents.yoy-growth - this closes the assignee -> portfolio chain. Responses use implicit 2xx (no success flag). Requires a Pro workspace (returns HTTP 402 otherwise).
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| patentId(path) | string | Yes | Patent publication identifier, e.g. WO2021098789A1 or EP3823456A1. Copy it from a patents.search result's patent_id; never construct or guess it. |
Example request
curl -H "x-api-key: YOUR_API_KEY" \
"https://app.caelrith.com/api/v1/patents/{patentId}"Fast pre-computed aggregate patent counts (patent_agg_* tables), grouped by year, CPC code and/or company - group_by accepts a comma-separated subset of 'year','cpc','company'. IMPORTANT: country and legal_status are NOT supported here (HTTP 400) - use patents.search for those. The year range defaults to the current year and the two preceding calendar years; pass publication_date_from/to to widen it. Company filters accept an exact raw assignee string, 'organizations/<key>', 'ror:<id>' or 'lei:<id>'; unresolved company values and unknown CPC prefixes return HTTP 400 naming the value (never silently dropped). meta.total_buckets is the number of buckets returned, not the number of groups. Requires a Pro workspace (returns HTTP 402 otherwise). Use patents.search for listings and patents.yoy-growth for growth deltas.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| group_by | string | No | Comma-separated subset of 'year', 'cpc', 'company' (e.g. 'year,company'; default 'year'). Each dimension produces one bucket per value with a 'count'. |
| company_id | string | No | Organization to filter on. Accepts an exact raw assignee string (as it appears in a patent's assignees array), 'organizations/<key>', 'ror:<id>', 'lei:<id>', or a bare ROR/LEI id. Takes precedence over company_name. Unresolved values return HTTP 400 (never silently ignored). |
| company_name | string | No | Resolved organization name, used as a fallback when company_id is not provided. |
| cpc_code | string | No | CPC classification code or prefix (e.g. 'A61K'). |
| include_descendants | string | No | When true (default), a cpc_code prefix expands to every code starting with it; set false for exact-code matches only. Allowed values: true, false |
| publication_date_from | string | No | YYYY-MM-DD; restricts the counted window (defaults to the current year and the two preceding calendar years). |
| publication_date_to | string | No | YYYY-MM-DD; restricts the counted window. |
| limit | integer | No | Maximum number of buckets to return (1-500, default 100). Range: 1 to 500 |
| sort_by_count | string | No | Sort buckets by count (default desc). Allowed values: desc, asc |
Example request
curl -H "x-api-key: YOUR_API_KEY" \ "https://app.caelrith.com/api/v1/patents/aggregate"
Year-over-year patent growth by CPC code or company (dimension is required). Returns one row per group with oldCount (year_start), newCount (year_end), absolute change and percent change, sorted by growth or percent; percent is a fraction (0.35 = +35%). min_old_count (default 50) hides small groups - narrow with cpc_code / company_id or lower it. Defaults compare 2024 against 2025; pass year_start/year_end for other windows. Company filters accept an exact raw assignee string, 'organizations/<key>', 'ror:<id>' or 'lei:<id>'; unresolved company values and unknown CPC prefixes return HTTP 400 naming the value (never silently dropped). Requires a Pro workspace (returns HTTP 402 otherwise). Use patents.aggregate for plain counts.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| dimension | string | Yes | Growth dimension (required): 'cpc' groups by CPC code, 'company' groups by company. Allowed values: cpc, company |
| year_start | integer | No | Baseline year (default 2024). oldCount is the patent count in this year. Range: 1900 to 2026 |
| year_end | integer | No | Comparison year (default 2025). newCount is the patent count in this year. Range: 1900 to 2026 |
| cpc_code | string | No | Optional CPC restriction (e.g. 'A61K'). |
| company_id | string | No | Organization to filter on. Accepts an exact raw assignee string (as it appears in a patent's assignees array), 'organizations/<key>', 'ror:<id>', 'lei:<id>', or a bare ROR/LEI id. Takes precedence over company_name. Unresolved values return HTTP 400 (never silently ignored). |
| company_name | string | No | Organization name fallback when company_id is not provided. |
| include_descendants | string | No | When true (default), a cpc_code prefix expands to every code starting with it; set false for exact-code matches only. Allowed values: true, false |
| min_old_count | integer | No | Only include groups with at least this many patents in year_start (default 50). Range: 0 to ∞ |
| limit | integer | No | Maximum number of groups to return (1-100, default 10). Range: 1 to 100 |
| sort | string | No | Sort order (default growth_desc). Allowed values: growth_desc, growth_asc, percent_desc, percent_asc |
Example request
curl -H "x-api-key: YOUR_API_KEY" \ "https://app.caelrith.com/api/v1/patents/yoy-growth?dimension=cpc"