{
  "openapi": "3.0.1",
  "info": {
    "title": "French Company Register Search: SIREN, SIRET, NAF, VAT Number",
    "description": "Company records from France's official government register: legal name, SIREN, SIRET, NAF code, legal form, VAT number, headquarters and branch addresses, creation date, headcount band, revenue and status. Search by name, identifier, postcode, department, activity or map radius. UTC dates.",
    "version": "0.1",
    "x-build-id": "tzOkjSx1oCsKRWORA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yadroo~france-company-search/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yadroo-france-company-search",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/yadroo~france-company-search/runs": {
      "post": {
        "operationId": "runs-sync-yadroo-france-company-search",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/yadroo~france-company-search/run-sync": {
      "post": {
        "operationId": "run-sync-yadroo-france-company-search",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "What to look up",
            "enum": [
              "search",
              "identifiers",
              "nearPoint"
            ],
            "type": "string",
            "description": "Three questions, one per run. `search` is the general register search: a word or phrase plus any of the filters below. `identifiers` turns a list of SIREN (9 digits) or SIRET (14 digits) numbers into one row each, which is what counterparty and CRM clean-up work needs - an identifier that is not in the register still gets a row with `found: false`. `nearPoint` asks the register which companies have a site within a radius of a latitude/longitude pair, for catchment and field-sales work.",
            "default": "search"
          },
          "query": {
            "title": "Search words",
            "type": "string",
            "description": "Used by `search`. Free text matched against company names, trade names and addresses - a brand (`Carrefour`), a trade (`boulangerie`), a street and town, or a single SIREN/SIRET if you only have one. Case and accents do not matter. May be left empty when at least one filter below is set: `departments: ['69']` with `activityCodes: ['62.01Z']` is a valid run on its own."
          },
          "identifiers": {
            "title": "SIREN or SIRET numbers",
            "type": "array",
            "description": "Used by `identifiers`. A SIREN is a company's 9-digit number, a SIRET the 14-digit number of one of its sites (SIREN + 5 digits). Spaces and dots are removed (`652 014 051`). Each entry produces exactly one row: `found: true` with the register record, or `found: false` with `notFoundReason` for a number the register does not know or does not publish. A SIRET is resolved to its company, with the site it names reported in the `matched…` columns.",
            "items": {
              "type": "string"
            }
          },
          "latitude": {
            "title": "Latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "Used by `nearPoint`. Decimal degrees, WGS84 - the format map tools copy out. The example is central Paris."
          },
          "longitude": {
            "title": "Longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "Used by `nearPoint`. Decimal degrees, WGS84."
          },
          "radiusKm": {
            "title": "Radius in km",
            "minimum": 0.1,
            "maximum": 50,
            "type": "number",
            "description": "How far from the point to look, in kilometres. The source refuses anything above 50 km. A company is returned when any of its establishments has published coordinates inside the circle; establishments whose address the register could not place on the map cannot be found this way, which is why a radius search is a catchment tool rather than a census.",
            "default": 5
          },
          "postalCodes": {
            "title": "Postcodes",
            "type": "array",
            "description": "Five-digit French postcodes, for example `75011`, `69002`, `33000`. A company is returned when any of its establishments sits in one of them - so a chain with its head office elsewhere is found by its local branch, and the branch that matched is written to `matchedPostalCode`, `matchedCity` and `matchedAddress`. Use those columns, not the `hq…` ones, when you filter by place.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Departments",
            "type": "array",
            "description": "Department codes as the register writes them: two digits (`01` to `95`), `2A` and `2B` for Corsica, three digits for the overseas departments (`971` Guadeloupe, `972` Martinique, `973` French Guiana, `974` Reunion, `976` Mayotte). A leading zero may be left out (`1` is read as `01`). Unknown codes are refused with the closest valid ones named.",
            "items": {
              "type": "string"
            }
          },
          "communeCodes": {
            "title": "Commune codes (INSEE)",
            "type": "array",
            "description": "Five-character INSEE commune codes, for example `69123` for Lyon or `13055` for Marseille. These are not postcodes: one commune can cover several postcodes and one postcode several communes. Use this when you need exactly one town.",
            "items": {
              "type": "string"
            }
          },
          "regionCodes": {
            "title": "Region codes",
            "type": "array",
            "description": "Two-digit region codes, for example `11` Ile-de-France, `84` Auvergne-Rhone-Alpes, `93` Provence-Alpes-Cote d'Azur, `75` Nouvelle-Aquitaine. The full list is in the README reference table. The region that matched is written to `matchedRegion`.",
            "items": {
              "type": "string"
            }
          },
          "activityCodes": {
            "title": "Activity codes (NAF/APE)",
            "type": "array",
            "description": "NAF (also called APE) activity codes in the 2008 revision, four digits and a letter: `56.10A` traditional restaurants, `62.01Z` computer programming, `47.11D` supermarkets, `41.20A` house building. The dot may be left out (`5610A`) and the letter may be lower case. A code that does not exist is refused with the closest valid codes named, never silently widened to the whole division. Several codes are combined with OR.",
            "items": {
              "type": "string"
            }
          },
          "activitySections": {
            "title": "Activity sections",
            "type": "array",
            "description": "The broad branch of the economy, one letter per section - the level above the NAF code, useful when you do not want to list twenty codes. Picking a section and a code at the same time narrows to codes inside that section. The platform refuses any letter outside A-U before the run starts.",
            "items": {
              "type": "string",
              "enum": [
                "A",
                "B",
                "C",
                "D",
                "E",
                "F",
                "G",
                "H",
                "I",
                "J",
                "K",
                "L",
                "M",
                "N",
                "O",
                "P",
                "Q",
                "R",
                "S",
                "T",
                "U"
              ],
              "enumTitles": [
                "A - Agriculture, forestry and fishing",
                "B - Mining and quarrying",
                "C - Manufacturing",
                "D - Electricity, gas and steam supply",
                "E - Water, sewerage and waste",
                "F - Construction",
                "G - Wholesale, retail and vehicle repair",
                "H - Transport and storage",
                "I - Hotels, restaurants and catering",
                "J - Information and communication",
                "K - Finance and insurance",
                "L - Real estate",
                "M - Professional, scientific and technical work",
                "N - Administrative and support services",
                "O - Public administration and defence",
                "P - Education",
                "Q - Health and social work",
                "R - Arts, entertainment and recreation",
                "S - Other services",
                "T - Households as employers",
                "U - Extraterritorial bodies"
              ]
            }
          },
          "legalFormCodes": {
            "title": "Legal form codes",
            "type": "array",
            "description": "Four-digit legal category codes of the register, for example `5710` simplified joint-stock company (SAS, SASU), `5499` private limited company (SARL, EURL), `9220` declared association, `1000` sole trader. The README reference table lists the codes this actor can also label in plain words; any valid four-digit code may be sent, and codes we cannot label still come back with `legalFormCode` filled and `legalFormLabel` empty.",
            "items": {
              "type": "string"
            }
          },
          "companySize": {
            "title": "Company size class",
            "enum": [
              "PME",
              "ETI",
              "GE"
            ],
            "type": "string",
            "description": "The official size class the statistics office assigns from headcount, turnover and balance sheet. Leave empty for every size. This is a yearly classification, so it lags a fast-growing company by up to two years; `headcountBands` is the fresher signal."
          },
          "headcountBands": {
            "title": "Headcount bands",
            "type": "array",
            "description": "Staff size as bands, because the register publishes bands and not exact numbers. Several bands are combined with OR, so `10 to 19` plus `20 to 49` gives companies of 10 to 49. `Not declared` is a large group: sole traders, holdings and companies that have filed nothing yet all sit there, so leave it out when you want real employers. Rows carry both the code (`headcountBandCode`) and the words (`headcountBand`).",
            "items": {
              "type": "string",
              "enum": [
                "NN",
                "00",
                "01",
                "02",
                "03",
                "11",
                "12",
                "21",
                "22",
                "31",
                "32",
                "41",
                "42",
                "51",
                "52",
                "53"
              ],
              "enumTitles": [
                "Not declared",
                "0 employees (employed staff earlier in the year)",
                "1 to 2 employees",
                "3 to 5 employees",
                "6 to 9 employees",
                "10 to 19 employees",
                "20 to 49 employees",
                "50 to 99 employees",
                "100 to 199 employees",
                "200 to 249 employees",
                "250 to 499 employees",
                "500 to 999 employees",
                "1000 to 1999 employees",
                "2000 to 4999 employees",
                "5000 to 9999 employees",
                "10000 employees or more"
              ]
            }
          },
          "status": {
            "title": "Administrative status",
            "enum": [
              "active",
              "ceased",
              "any"
            ],
            "type": "string",
            "description": "Defaults to active companies, because a plain register search otherwise returns decades of dissolved entities next to the live ones. Set `ceased` for compliance and risk work - those rows carry `closureDate` - or `any` to see both in one dataset, told apart by the `status` column.",
            "default": "active"
          },
          "labels": {
            "title": "Official labels and registers",
            "type": "array",
            "description": "Public certifications and registers the company appears in. Several labels narrow each other: picking `ess` and `qualiopi` returns social-economy organisations that are also certified trainers. These flags come from the register's own cross-links, so they are a reliable way to build a list that a directory site cannot give you. The labels a row carries are written to the `labels` column.",
            "items": {
              "type": "string",
              "enum": [
                "association",
                "ess",
                "societeMission",
                "entrepreneurIndividuel",
                "rge",
                "qualiopi",
                "organismeFormation",
                "bio",
                "siae",
                "achatsResponsables",
                "entrepreneurSpectacle",
                "patrimoineVivant",
                "finess",
                "uai",
                "collectiviteTerritoriale",
                "administration"
              ],
              "enumTitles": [
                "Declared association",
                "Social and solidarity economy (ESS)",
                "Mission-driven company",
                "Sole trader",
                "RGE - certified for energy renovation work",
                "Qualiopi - certified training quality",
                "Registered training provider",
                "Certified organic operator",
                "Work-integration social enterprise",
                "Responsible purchasing label",
                "Live-performance employer licence",
                "Living heritage company label",
                "Health or social care facility (FINESS)",
                "Education establishment (UAI)",
                "Local authority",
                "Public administration body"
              ]
            }
          },
          "revenueMinEur": {
            "title": "Revenue from (EUR)",
            "minimum": 0,
            "type": "number",
            "description": "Keep companies whose latest published annual revenue is at least this much. Only companies that file their accounts publicly have a figure, and many French companies are allowed to keep theirs confidential - setting this filter therefore also drops everyone who filed nothing. `revenueEur` and `financialsYear` show what the figure is and which year it belongs to."
          },
          "revenueMaxEur": {
            "title": "Revenue up to (EUR)",
            "minimum": 0,
            "type": "number",
            "description": "Upper bound on the latest published annual revenue, in euros."
          },
          "netIncomeMinEur": {
            "title": "Net income from (EUR)",
            "type": "number",
            "description": "Lower bound on the latest published net result, in euros. Negative values are allowed, so `-1000000` to `0` finds loss-making filers."
          },
          "netIncomeMaxEur": {
            "title": "Net income up to (EUR)",
            "type": "number",
            "description": "Upper bound on the latest published net result, in euros."
          },
          "sortBySize": {
            "title": "Biggest companies first",
            "type": "boolean",
            "description": "Order the answer by number of establishments instead of the source's relevance ranking. Useful when a broad filter would otherwise fill the row cap with dormant one-person entities; it does not change which companies match, only which ones you see first.",
            "default": false
          },
          "includeEstablishments": {
            "title": "List the matching sites of each company",
            "type": "boolean",
            "description": "Add an `establishments` array with every site that matched your place or activity filter: SIRET, address, postcode, town, coordinates, whether it is the head office and whether it is open. Off by default, because one row per company is what most people chart; the `matched…` columns already carry the first matching site.",
            "default": false
          },
          "maxEstablishmentsPerCompany": {
            "title": "At most this many sites per company",
            "minimum": 1,
            "maximum": 100,
            "type": "number",
            "description": "Caps the `establishments` array and the number of sites the source sends back per company. A nationwide retailer can have thousands of them, so the default keeps responses small. Does not change the row count or the price - rows are counted per company.",
            "default": 3
          },
          "includeFinancials": {
            "title": "Include published revenue and net income",
            "type": "boolean",
            "description": "Fill `revenueEur`, `netIncomeEur` and `financialsYear` from the accounts the company filed publicly. Switch off for a narrower dataset; the filters above keep working either way.",
            "default": true
          },
          "onlyNew": {
            "title": "Skip companies seen in earlier runs",
            "type": "boolean",
            "description": "Remember the SIREN numbers this run writes in the actor's key-value store and, on the next run of the same actor or task, write only companies that were not written before. Made for watching a filter over time - a department plus an activity code - so each run holds just what appeared since. The memory is kept per actor or task, so two tasks watching two regions do not interfere.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on the companies this run writes, and therefore on what it costs. Paging stops as soon as the cap is reached. The source itself hands out at most 10000 results per search, so a filter with more matches than that needs to be split - by department or by activity code - and the run says so in its status message.",
            "default": 50
          },
          "fields": {
            "title": "Only these columns",
            "type": "array",
            "description": "Keep only the named columns, in the order given - for example `name, siren, matchedCity, activityCode`. Empty = every column. `found`, `siren`, `name`, `status`, `url` and `fetchedAt` are always present; name one of them here and it moves to the position you gave it. Unknown names are reported in the status message instead of being dropped in silence.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}