# Bulk French E-Invoice Resolver: SIRET, VAT (`comall-agency/fr-einvoice-partner-resolver`) Actor

Resolve a French business partner from a SIRET, SIREN or intra-EU VAT number, for the party blocks of a Factur-X invoice ahead of the 2026 e-invoicing mandate. Returns official identifiers and address from public registries, with the VAT state reported explicitly rather than guessed.

- **URL**: https://apify.com/comall-agency/fr-einvoice-partner-resolver.md
- **Developed by:** [Comall Agency](https://apify.com/comall-agency) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.00 / 1,000 partner resolveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## French E-Invoice Partner Resolver

Give it a **SIRET**, a **SIREN** or a **company name**. Get back the exact
counterparty block a compliant French e-invoice needs — including an
intracommunity VAT number that has actually been **checked against the EU
VIES registry**, not just computed.

### Why this exists

French electronic invoicing requires, for every counterparty: the exact
legal name, the SIREN/SIRET, and — for B2B inside the EU — a valid
intracommunity VAT number.

Those live in different places, and the VAT number is the one people get
wrong. The French VAT number is *derived* from the SIREN by a modulo-97
key, so it can always be computed. **But computing it does not prove the
company is registered for intra-EU trade.** Only the EU VIES registry says
that, and an invoice that carries a computed-but-unregistered VAT number is
the kind of thing that comes back at you months later.

This Actor does both halves, and tells you which one you got.

### Input

```json
{
  "queries": ["55203253400703", "443061841", "Blablacar"],
  "checkVat": true
}
```

- `queries` — one entry per company. 14 digits is read as a SIRET, 9 digits
  as a SIREN, anything else as a name (best match returned). Spaces, dots
  and dashes in numbers are ignored.
- `checkVat` — on by default. Turn it off for a faster, cheaper lookup when
  you only need identity and address; the VAT number is then computed but
  not confirmed, and the output says so.

### Output

One dataset item per query:

```json
{
  "query": "443061841",
  "query_kind": "siren",
  "found": true,
  "legal_name": "GOOGLE FRANCE",
  "siren": "443061841",
  "siret": "44306184100047",
  "vat_number": "FR64443061841",
  "vat_source": "confirmed_by_vies",
  "vat_vies_valid": true,
  "vat_vies_name": "EURL GOOGLE FRANCE",
  "naf_code": "70.10Z",
  "legal_form_code": "5499",
  "is_active": true,
  "address": "8 RUE DE LONDRES 75009 PARIS",
  "postal_code": "75009",
  "city": "PARIS",
  "country": "FR",
  "resolved_at": "2026-08-26T21:55:12.004Z"
}
```

#### The three VAT states, and why there are three

| `vat_source` | `vat_vies_valid` | What it means |
|---|---|---|
| `confirmed_by_vies` | `true` | VIES was asked and confirmed the number. Safe to put on an invoice. |
| `computed_not_in_vies` | `false` | VIES was asked and said no. The company exists but is not registered for intra-EU trade under this number. |
| `computed_from_siren` | `null` | **VIES could not be asked** (it refused or was down). The number is arithmetically correct and nothing more. `vies_note` carries the exact reason. |

**`null` never means `false` here.** VIES answers `isValid: false` both when a
number is genuinely not registered *and* when the member state simply refused
to answer (`MS_MAX_CONCURRENT_REQ`) — reading `isValid` on its own turns a
refusal into a "not registered" verdict on a company that is perfectly fine.
This Actor only trusts VIES when VIES says `VALID` or `INVALID`, retries once
on anything else, and reports silence as silence.

### Sources

- **Identity, address, activity, status** — `recherche-entreprises.api.gouv.fr`,
  the French government's official company search API. Free, no key.
- **VAT confirmation** — the European Commission's VIES REST API. Free, no key.

No scraping, no third-party paid API, no account to create anywhere.

### Pricing

**$0.008 per company resolved.** You are charged once per query that gets a
real answer — including a definitive "no such company", because that is the
answer you asked for. You are **not** charged when our own side fails
(registry unreachable, timeout): those come back with an `error` field and
no charge.

### Works well with

`facturx-validator-generator` (same account) — once you have a resolved
counterparty block, that Actor turns invoice data into a compliant Factur-X
PDF, or validates one you already have.

### Limitations

- **France only.** The identity lookup is the French registry; the VIES check
  is run against the FR member state.
- **A name query returns the best single match**, not a list. Use a SIREN or
  SIRET when you need certainty about which company you got.
- **VIES availability is not ours to guarantee.** It goes down member state by
  member state, regularly. When that happens you get `null` and the reason,
  never a guess.

### Related Actors

Other single-purpose checkers on this account, priced per item checked:

- [Factur-X Validator & Generator](https://apify.com/comall-agency/facturx-validator-generator) — validate or build the invoice document itself.
- [EU VAT Number Checker](https://apify.com/comall-agency/eu-vat-checker) — official VIES lookup for an EU VAT number.
- [IBAN Validator & Formatter](https://apify.com/comall-agency/iban-validator-formatter) — ISO 13616 length and mod-97 checksum, fully offline.
- [Email Address Validator](https://apify.com/comall-agency/email-address-validator) — syntax, MX and disposable-domain checks.
- [Barcode Check-Digit Validator](https://apify.com/comall-agency/barcode-checkdigit-validator) — EAN-13, EAN-8 and UPC-A check digits.

# Actor input Schema

## `queries` (type: `array`):

One entry per company to resolve. A 14-digit value is treated as a SIRET, a 9-digit value as a SIREN, anything else as a company name (the best match is returned). Spaces, dots and dashes are ignored in numbers.

## `checkVat` (type: `boolean`):

On (default): the intracommunity VAT number is computed from the SIREN AND checked against the official EU VIES registry, so you know whether the company is actually registered for intra-EU trade. Off: the number is only computed — faster, but a computed number is not a confirmed one.

## Actor input object example

```json
{
  "queries": [
    "55203253400703",
    "443061841",
    "Blablacar"
  ],
  "checkVat": true
}
```

# Actor output Schema

## `partners` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "55203253400703",
        "443061841",
        "Blablacar"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("comall-agency/fr-einvoice-partner-resolver").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "queries": [
        "55203253400703",
        "443061841",
        "Blablacar",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("comall-agency/fr-einvoice-partner-resolver").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "55203253400703",
    "443061841",
    "Blablacar"
  ]
}' |
apify call comall-agency/fr-einvoice-partner-resolver --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,comall-agency/fr-einvoice-partner-resolver"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Y5xbX3otfNUqF3iui/builds/ufXYNaCymGYU7fWc2/openapi.json
