inpi-patents
French patent data, from INPI's servers to analysis-ready tables.
INPI, the French patent office, publishes the full French patent register as WIPO ST36 XML: bibliography, legal status, and the parties on each document, including inventors with city and postcode. Getting from "the data exists" to "I have a table" involves a licence form, an FTP server with no English documentation, a cookie-authenticated API with a small quota, and an XML dialect with a few silent traps.
This package handles the whole path:
- FTP route (bulk): map the server, download the full-register snapshot (~3.5 GB, ~2.5 million documents) and the weekly update files. Resumable, size-verified, restartable.
- API route (targeted): log in to API PI Diffusion, fetch notices, run searches, harvest small sets without fighting the quota by hand.
- One parser for both: every element of the notice, with the known source defects repaired and flagged rather than silently propagated.
- Geography built in: postcode to département to NUTS-3, Corsica and overseas handled, no geocoder needed.
- A CLI and a local dashboard that drive the same steps.
Documentation: https://maliyuam.com/inpi-patent-harvester/ — from
requesting access to using the tables. The same pages live in docs/;
mkdocs serve browses them locally.
Sixty seconds, no credentials
pip install inpi-patents
inpi parse file tests/fixtures/FR_SYNTHETIC_MODERN.xml
The synthetic record exercises every trap the parser handles: inverted city/postcode, duplicated party renderings, the filing date hidden behind INPI-specific element names, priorities that move the earliest filing date, a foreign inventor whose five-digit code is not a French postcode.
The real thing
inpi env init # write .env, fill in the codes INPI emailed you
inpi ftp probe --cred NOTICES # what your licence can see
inpi ftp fetch /Backlog --cred NOTICES # the snapshot, resumable
inpi parse zips data/raw/ftp/Backlog # archives -> parquet parts, parallel
inpi merge # parts -> one parquet per table, QA numbers
inpi geo # inventors_geo.parquet with département + NUTS-3
inpi ui # or do all of the above from a browser
import duckdb
duckdb.sql("""
SELECT app_year, dept, count(*) AS inventors
FROM 'data/export/inventors_geo.parquet'
WHERE app_year BETWEEN '2000' AND '2020' AND dept IS NOT NULL
GROUP BY 1, 2 ORDER BY 1, 3 DESC
""").show()
What you get
| Table | One row per |
|---|---|
documents |
publication: numbers, dates, kind, title, abstract, family id, earliest filing date |
parties |
document × party × rendering: inventors, applicants, owners, agents, licensees, with addresses |
priorities, classifications, related, legal_events |
document × item |
inventors_geo |
document × inventor, de-duplicated, swap-repaired, with dept and nuts3 |
On a mid-2025 snapshot: 2.52 million documents, zero parse errors, ~316,000 filings in 2000-2020 of which 99.5% carry an inventor and 84% of inventor slots resolve to a département (99.6% of French-resident ones).
Getting access
The FTP route needs a free licence from INPI: fill in the database selection form on INPI's data portal and email it to their licence desk; access codes come back by email, one login per database. The API route needs a technical account on data.inpi.fr with APIs PI Access activated. The docs walk through both, and include a bilingual request letter template: Getting access.
Code is MIT. Data is INPI's.
This repository contains code, documentation and synthetic test
fixtures only. Data obtained from INPI is covered by INPI's reuse licence:
access codes are personal, raw data is not redistributable, and INPI must
be cited. .gitignore keeps data/, archives, XML, parquet and .env out
of the repository. See Licence and redistribution.
Development
git clone https://github.com/maliyuam/inpi-patent-harvester.git && cd inpi-patent-harvester
pip install -e ".[dev,ui]"
pytest # no network, synthetic fixtures only
ruff check src tests
mkdocs serve # docs at http://127.0.0.1:8000
See CONTRIBUTING.md. Not affiliated with INPI.
Release files for inpi-patents 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| inpi_patents-0.1.0.tar.gz | 63.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| inpi_patents-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:121.9 kB
Release files / inpi_patents-0.1.0.tar.gz
| Download URL | inpi_patents-0.1.0.tar.gz |
|---|---|
| Size | 63.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5ac113f456b86c6fd75a1add78490ee02565ac5d522e0c815b9c5dff0b0d4054
|
|
BLAKE2b-256 checksum How to use checksums |
bd9acd30c6a0e49d4f63e50ac2637276614edcc44ac8e5a5f8de5cf5f76c6a2c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.
Transparency logRelease files / inpi_patents-0.1.0-py3-none-any.whl
| Download URL | inpi_patents-0.1.0-py3-none-any.whl |
|---|---|
| Size | 58.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1b7814228b454e230bf17b952e53ff413cefe329f96ccb79dafb7ea9f5e9b82a
|
|
BLAKE2b-256 checksum How to use checksums |
92bf9653ca4ad7761774ebf0e1e17a686382970aa91adf780cd5750afffc2693
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.
Transparency log