Auregistre Company API

Read-only access by SIREN. There is deliberately no search endpoint: see the documentation for why.

Operations 2

GET /company/{siren}/timeline Every recorded change for one company #
GET /company/{siren}/financials The filed annual accounts of one company, fiscal year by fiscal year #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/auregistre-fr:auregistre-fr-company-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

auregistre-fr-company-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Auregistre Company API
  version: 1.0.0
  summary: What changed in a French company, and when.
  description: 'Most company-data services publish a **state**: the name, address and share capital as of today.

    This API publishes the **history**: every value the French official gazette (BODACC) has recorded for a company,

    with the date it was published and a link to the announcement that published it.


    Four things follow from that one idea: the timeline of a company, its filed annual accounts fiscal year by

    fiscal year, a watch over companies you already track, and the count of insolvency openings over time. There

    is no lookup by name, by director or by place: see the documentation for why there never will be.


    Nothing is inferred, scored or estimated. Every value returned was published by the register on the date shown.


    The gazette has been digitised since 2008. For a company older than that, the earliest value returned

    is the oldest one on record, not the company''s original value.


    No API key and no account are involved. Requests are rate limited by IP.'
  termsOfService: https://auregistre.fr/cgu
  contact:
    name: Auregistre
    url: https://auregistre.fr/api
    email: contact@auregistre.fr
  license:
    name: Licence Ouverte 2.0 (Etalab)
    url: https://www.etalab.gouv.fr/licence-ouverte-open-licence/
servers:
- url: https://auregistre.fr/api
  description: Production
security: []
tags:
- name: Company
  description: 'Read-only access by SIREN. There is deliberately no search endpoint: see the documentation for why.'
paths:
  /company/{siren}/timeline:
    get:
      tags:
      - Company
      operationId: getCompanyTimeline
      summary: Every recorded change for one company
      description: 'Returns one entry per field that has **changed at least once**. A field that has never moved is not a timeline,

        it is a state, and it is omitted.


        Announcements that merely cite the SIREN without describing the company are excluded.

        On large franchised networks this is around 40% of what a naive SIREN search returns.


        Responses are cached at the edge for 24 hours. A cached response does not count against the rate limit.'
      parameters:
      - name: siren
        in: path
        required: true
        description: The nine-digit identifier of a French legal entity. Spaces, dots and dashes are accepted and ignored.
        schema:
          type: string
          pattern: ^[0-9 .-]{9,13}$
        examples:
          doctolib:
            value: '794598813'
            summary: Doctolib
          edf:
            value: '552081317'
            summary: EDF
      - name: If-None-Match
        in: header
        required: false
        description: Send the previous `ETag` to get a 304 when nothing has changed.
        schema:
          type: string
      responses:
        '200':
          description: The company timeline.
          headers:
            ETag:
              description: Weak validator of this representation.
              schema:
                type: string
            Cache-Control:
              description: Shared caches may keep this for 24 hours.
              schema:
                type: string
            Link:
              description: 'RFC 8631 discovery links: `service-desc` points at this document, `service-doc` at the human documentation, `license` at the data licence.'
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Timeline'
        '304':
          description: Your `If-None-Match` matched. No body.
        '400':
          description: The SIREN is not nine digits.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://auregistre.fr/api#invalid-siren
                title: Invalid SIREN
                status: 400
                detail: A SIREN is the nine-digit identifier the French business register assigns to a legal entity.
        '404':
          description: No announcement describes this SIREN.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://auregistre.fr/api#company-not-found
                title: No timeline available
                status: 404
                detail: No gazette announcement describes SIREN 123456789.
        '405':
          description: This endpoint is read-only.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://auregistre.fr/api#method-not-allowed
                title: Method not allowed
                status: 405
                detail: This endpoint is read-only. POST is not supported; use GET.
        '429':
          description: Rate limit exceeded.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://auregistre.fr/api#rate-limit-exceeded
                title: Too many requests
                status: 429
                detail: This API allows 30 reads per minute per IP address.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
            RateLimit-Limit:
              schema:
                type: integer
            RateLimit-Remaining:
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets.
              schema:
                type: integer
        '503':
          description: The upstream source did not answer. This says nothing about whether the company exists.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://auregistre.fr/api#upstream-unavailable
                title: Upstream register unavailable
                status: 503
                detail: The upstream register did not answer in time.
  /company/{siren}/financials:
    get:
      tags:
      - Company
      operationId: getCompanyFinancials
      summary: The filed annual accounts of one company, fiscal year by fiscal year
      description: 'Revenue, gross margin, EBITDA, EBIT, net income and the thirteen ratios the INPI computes from the accounts

        a company files with the French business register, one entry per fiscal year and per perimeter.


        **The two perimeters never add up.** `legal_entity` is the one company registered under this SIREN;

        `group` is the consolidated accounts of its group. A holding can file a revenue of zero beside a group

        revenue in the billions, and reading the wrong one is the single easiest mistake with this data.


        Filings kept confidential are not listed. A fiscal year absent here was not filed, was filed under

        confidentiality, or has not been processed by the INPI yet. At most twenty filings are read, most recent first.


        Source: the open dataset of INPI financial ratios (Licence Ouverte 2.0), not the authenticated INPI API.

        Responses are cached at the edge for 24 hours. A cached response does not count against the rate limit.'
      parameters:
      - name: siren
        in: path
        required: true
        description: The nine-digit identifier of a French legal entity. Spaces, dots and dashes are accepted and ignored.
        schema:
          type: string
          pattern: ^[0-9 .-]{9,13}$
        examples:
          doctolib:
            value: '794598813'
            summary: Doctolib
          edf:
            value: '552081317'
            summary: EDF
      - name: If-None-Match
        in: header
        required: false
        description: Send the previous `ETag` to get a 304 when nothing has changed.
        schema:
          type: string
      responses:
        '200':
          description: The filed accounts, fiscal year by fiscal year.
          headers:
            ETag:
              description: Weak validator of this representation.
              schema:
                type: string
            Cache-Control:
              description: Shared caches may keep this for 24 hours.
              schema:
                type: string
            Link:
              description: 'RFC 8631 discovery links: `service-desc` points at this document, `service-doc` at the human documentation, `license` at the data licence.'
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Financials'
        '304':
          description: Your `If-None-Match` matched. No body.
        '400':
          description: The SIREN is not nine digits.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://auregistre.fr/api#invalid-siren
                title: Invalid SIREN
                status: 400
                detail: A SIREN is the nine-digit identifier the French business register assigns to a legal entity.
        '404':
          description: The company has no published accounts on record.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://auregistre.fr/api#no-financial-statements
                title: No financial statements
                status: 404
                detail: No published annual accounts are on record for SIREN 123456789 in the INPI ratios dataset. The company may exist and never have filed, have filed under confidentiality, or have filed accounts the INPI has not processed yet.
        '405':
          description: This endpoint is read-only.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://auregistre.fr/api#method-not-allowed
                title: Method not allowed
                status: 405
                detail: This endpoint is read-only. POST is not supported; use GET.
        '429':
          description: Rate limit exceeded.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://auregistre.fr/api#rate-limit-exceeded
                title: Too many requests
                status: 429
                detail: This API allows 30 reads per minute per IP address.
          headers:
            Retry-After:
              description: Seconds to wait.
              schema:
                type: integer
            RateLimit-Limit:
              schema:
                type: integer
            RateLimit-Remaining:
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the window resets.
              schema:
                type: integer
        '503':
          description: The upstream source did not answer. This says nothing about whether the company exists.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://auregistre.fr/api#upstream-unavailable
                title: Upstream register unavailable
                status: 503
                detail: The upstream register did not answer in time.
components:
  schemas:
    Financials:
      type: object
      required:
      - siren
      - statements
      - coverage
      - attribution
      - served_by
      - terms
      - documentation
      - notice
      properties:
        siren:
          type: string
          examples:
          - '794598813'
        statements:
          type: array
          description: 'Most recent first, both perimeters mixed: `perimeter` tells them apart on every entry.'
          items:
            $ref: '#/components/schemas/FinancialStatement'
        coverage:
          type: object
          required:
          - statements
          - perimeters
          - confidential_filings_excluded
          properties:
            statements:
              type: integer
              description: How many entries are served, all perimeters together.
            perimeters:
              type: array
              items:
                type: string
                enum:
                - legal_entity
                - group
              description: Which perimeters the company has filed under.
            confidential_filings_excluded:
              type: boolean
              description: 'Always true: a confidential filing is absent, never served as zeros.'
        attribution:
          $ref: '#/components/schemas/Attribution'
        served_by:
          $ref: '#/components/schemas/ServedBy'
        terms:
          type: string
          format: uri
        documentation:
          type: string
          format: uri
        notice:
          type: string
          description: What the data does and does not say.
    Problem:
      type: object
      description: Error format, following RFC 9457 (Problem Details for HTTP APIs).
      required:
      - type
      - title
      - status
      - detail
      properties:
        type:
          type: string
          format: uri
          description: Stable URI identifying the problem kind.
        title:
          type: string
        status:
          type: integer
        detail:
          type: string
        instance:
          type: string
          description: The path that was requested.
    Attribution:
      type: array
      description: Source and retrieval date. Reusing this data requires citing both; they travel in the payload so that they reach consumers who never see the website.
      items:
        type: object
        required:
        - name
        - url
        - licence
        - retrieved
        properties:
          name:
            type: string
          url:
            type: string
            format: uri
          licence:
            type: string
          retrieved:
            type: string
            format: date-time
    Timeline:
      type: object
      required:
      - siren
      - legal_name
      - timeline
      - proceedings
      - insolvency
      - coverage
      - attribution
      - served_by
      - terms
      - documentation
      - notice
      properties:
        siren:
          type: string
          examples:
          - '794598813'
        legal_name:
          type:
          - string
          - 'null'
          description: The name as the gazette last published it. Null when no announcement names the company.
        timeline:
          type: array
          description: One entry per field that has changed at least once.
          items:
            type: object
            required:
            - field
            - label
            - changes
            - first_known
            - current
            - history
            properties:
              field:
                type: string
                enum:
                - share_capital
                - legal_name
                - legal_form
                - registered_office
                - stated_activity
              label:
                type: string
                description: Human-readable field name, in English.
              changes:
                type: integer
                description: 'How many times the value changed. `history` holds one more entry than this: the first is a starting point, not a change.'
              first_known:
                $ref: '#/components/schemas/Step'
              current:
                $ref: '#/components/schemas/Step'
              history:
                type: array
                items:
                  $ref: '#/components/schemas/Step'
        proceedings:
          type: array
          description: 'Insolvency judgments, most recent first. Separate from `timeline` on purpose: a timeline entry follows the value of a field, a judgment is a dated event. Empty for a company that has never been through one.'
          items:
            $ref: '#/components/schemas/Proceeding'
        insolvency:
          description: 'Where the company stands under insolvency law, or null when no judgment installed a status. Do not recompute this from `proceedings`: a closure cancels a liquidation, a set-aside cancels the judgment it sets aside, and two judgments can share a date.'
          oneOf:
          - $ref: '#/components/schemas/Insolvency'
          - type: 'null'
        coverage:
          type: object
          required:
          - announcements_read
          - complete
          - earliest_possible_year
          properties:
            announcements_read:
              type: integer
              description: How many announcements actually describe this company.
            complete:
              type: boolean
              description: False when the gazette stopped answering mid-read. The timeline is then a beginning, and the response is not cached.
            earliest_possible_year:
              type: integer
              examples:
              - 2008
        attribution:
          $ref: '#/components/schemas/Attribution'
        served_by:
          $ref: '#/components/schemas/ServedBy'
        terms:
          type: string
          format: uri
          description: The terms of use, absolute, as every answer of the fleet carries them.
        documentation:
          type: string
          format: uri
          description: The human documentation, absolute.
        notice:
          type: string
          description: What the data does and does not say.
    Amount:
      type: object
      description: A monetary amount with its currency beside it, never announced once at the top.
      required:
      - value
      - currency
      properties:
        value:
          type: number
          examples:
          - 311448000
        currency:
          type: string
          enum:
          - EUR
    Insolvency:
      type: object
      required:
      - status
      - since
      properties:
        status:
          type: string
          enum:
          - safeguard
          - receivership
          - recovery_plan
          - liquidation
          - closed_for_insufficient_assets
          - closed_debts_paid
          - judgment_set_aside
        since:
          type: string
          format: date
          description: The date of the judgment that installed it.
        source:
          type: string
          format: uri
    Step:
      type: object
      required:
      - date
      - value
      properties:
        date:
          type: string
          format: date
          description: Publication date of the announcement that carried this value.
          examples:
          - '2020-02-11'
        value:
          type: string
          description: 'The value exactly as the register published it, in French. Names and addresses are not translated: translating them would invent a fact nobody recorded.'
          examples:
          - 157 630,69 EUR
        amount:
          type: object
          description: The same value as a number, present only on monetary fields. Provided so that consumers never have to parse the French formatting of `value`.
          required:
          - value
          - currency
          properties:
            value:
              type: number
              examples:
              - 157630.69
            currency:
              type: string
              description: ISO 4217 code.
              examples:
              - EUR
        source:
          type: string
          format: uri
          description: The gazette announcement that published this value. Every step is verifiable.
          examples:
          - https://www.bodacc.fr/annonce/detail-annonce/A/20200028/1234
    ServedBy:
      type: object
      description: Which service produced this response. `attribution` says where the data comes from; this says who served it. A record copied into another database can then be traced back, if only to know where to report a wrong line.
      required:
      - name
      - url
      properties:
        name:
          type: string
          examples:
          - Auregistre
        url:
          type: string
          format: uri
          examples:
          - https://auregistre.fr/api
    FinancialStatement:
      type: object
      required:
      - fiscal_year_end
      - fiscal_year
      - perimeter
      - revenue
      - revenue_change_percent
      - gross_margin
      - ebitda
      - ebit
      - net_income
      - ratios
      properties:
        fiscal_year_end:
          type: string
          format: date
          examples:
          - '2024-12-31'
        fiscal_year:
          type: string
          examples:
          - '2024'
        perimeter:
          type: string
          enum:
          - legal_entity
          - group
          description: '`legal_entity`: the accounts of the one company registered under this SIREN. `group`: the consolidated accounts of its group. The two never add up, and a holding can carry a revenue of zero beside a group revenue in the billions.'
        revenue:
          description: 'Null when not published, or when the dataset carries a zero beside a non-zero net income: an empty field, not a measurement.'
          oneOf:
          - $ref: '#/components/schemas/Amount'
          - type: 'null'
        revenue_change_percent:
          type:
          - number
          - 'null'
          description: Against the previous fiscal year OF THE SAME PERIMETER, to one decimal. Null without such a year. The only computed figure in this response.
        gross_margin:
          description: Gross margin, as filed.
          oneOf:
          - $ref: '#/components/schemas/Amount'
          - type: 'null'
        ebitda:
          description: Excedent brut d'exploitation, as filed.
          oneOf:
          - $ref: '#/components/schemas/Amount'
          - type: 'null'
        ebit:
          description: Resultat d'exploitation, as filed.
          oneOf:
          - $ref: '#/components/schemas/Amount'
          - type: 'null'
        net_income:
          description: Null when not published, or when the dataset carries a zero beside a non-zero revenue.
          oneOf:
          - $ref: '#/components/schemas/Amount'
          - type: 'null'
        ratios:
          type: object
          description: The thirteen ratios the INPI computes. The unit is in the field name; null means the INPI did not compute it.
          properties:
            ebitda_margin_percent:
              type:
              - number
              - 'null'
              description: EBITDA over revenue, in percent.
            financial_autonomy_percent:
              type:
              - number
              - 'null'
              description: Equity over total balance sheet, in percent.
            debt_ratio_percent:
              type:
              - number
              - 'null'
              description: Financial debt over equity, in percent.
            current_ratio:
              type:
              - number
              - 'null'
              description: Current assets over current liabilities.
            cash_flow_to_revenue_percent:
              type:
              - number
              - 'null'
              description: Cash flow from operations over revenue, in percent.
            debt_repayment_capacity_years:
              type:
              - number
              - 'null'
              description: Net financial debt over cash flow, in years.
            interest_coverage:
              type:
              - number
              - 'null'
              description: EBIT over financial charges.
            working_capital_to_revenue_percent:
              type:
              - number
              - 'null'
              description: Operating working capital requirement over revenue, in percent.
            working_capital_days:
              type:
              - number
              - 'null'
              description: The same requirement, in days of revenue.
            inventory_turnover_days:
              type:
              - number
              - 'null'
              description: Inventory over purchases, in days.
            customer_credit_days:
              type:
              - number
              - 'null'
              description: Receivables over revenue, in days.
            supplier_credit_days:
              type:
              - number
              - 'null'
              description: Payables over purchases, in days.
    Proceeding:
      type: object
      required:
      - date
      - title
      properties:
        date:
          type: string
          format: date
          description: The date of the judgment, not of its publication. The two differ by 16 days at the median, and 14 announcements out of 1,000 fall in a different year.
          examples:
          - '2026-07-22'
        published_on:
          type: string
          format: date
          description: The day the gazette printed it, when it differs from `date`. This is the date that starts legal deadlines.
        title:
          type: string
          description: The judgment as the court clerk published it, in French.
          examples:
          - Jugement d'ouverture d'une procédure de redressement judiciaire
        status:
          type: string
          enum:
          - safeguard
          - receivership
          - recovery_plan
          - liquidation
          - closed_for_insufficient_assets
          - closed_debts_paid
          - judgment_set_aside
          description: 'The status this judgment installs. Absent on the 1.4% of judgments whose wording we refuse to classify: a procedure we cannot read must not manufacture a status, in either direction.'
        appointee:
          type: object
          description: 'Who the court appointed, as the announcement names them. Roles stay in French: they are the words the ruling uses.'
          required:
          - role
          - firm
          - person
          - court
          properties:
            role:
              type: string
              examples:
              - Mandataire judiciaire
            firm:
              type: string
            person:
              type:
              - string
              - 'null'
            court:
              type:
              - string
              - 'null'
              examples:
              - Tribunal de Commerce de Grenoble
        claims_deadline:
          type: string
          format: date
          description: The last day to file a claim, on an OPENING judgment only. The only date in this API that is enforceable against someone.
        source:
          type: string
          format: uri
          description: The announcement that published this judgment.
externalDocs:
  description: Human-readable documentation
  url: https://auregistre.fr/api
x-rate-limit:
  requests: 30
  window_seconds: 60
  scope: ip
  note: 'Edge-cached responses are served without reaching the limiter and do not consume quota. RateLimit-* headers travel on the 429 alone: stored on a cached answer they would tell every caller the quota of the first one.'
x-stability: 'No version in the address and none in the body, because nothing will break: fields are added, never removed or renamed under a caller, and addresses do not move. The launch-day /api/v1/ addresses answer 308 to the same paths without the segment.'