> ## Documentation Index
> Fetch the complete documentation index at: https://docs.invopop.com/llms.txt
> Use this file to discover all available pages before exploring further.

# RO e-Factura supplier registration guide

> Register parties (suppliers) with Romania's RO e-Factura system so you can send and receive invoices on their behalf.

## Introduction

[RO e-Factura](https://mfinante.gov.ro/ro/web/efactura) is Romania's mandatory national e-invoicing system, run by the Ministry of Finance and [ANAF](https://www.anaf.ro), the Romanian tax authority. Before you can send or receive invoices through RO e-Factura on behalf of a party (supplier), the party must authorize Invopop with ANAF.

Authorization uses ANAF's OAuth flow. Invopop generates a registration link, and a person with rights for the company in SPV (*Spațiul Privat Virtual*), ANAF's online portal, opens it, accepts the terms and signs in on ANAF's site with their qualified digital certificate. Certificates belong to people, not companies: ANAF grants the access that the certificate holder has in SPV. The certificate never leaves its owner: Invopop only receives the access ANAF grants, valid for one year.

> [!NOTE]
>
> The party doesn't need to register its own application with ANAF or provide a client ID and secret. Invopop connects through its own ANAF application, and the party only has to authorize it.

This guide will...

1. Walk you through the process of creating the workflows necessary to register your own company and/or your customers' parties (in a [white label setup](https://docs.invopop.com/guides/white-label.md)) using the [Romania app](https://docs.invopop.com/apps/romania.md),
2. Explain how the certificate holder accepts the terms and authorizes Invopop on ANAF's site, and
3. Explain how to renew or revoke the authorization.

Once a party is registered, continue with the companion guides: [Romania: Issuing invoices](https://docs.invopop.com/guides/ro-efactura.md) and [Romania: Receiving invoices](https://docs.invopop.com/guides/ro-efactura-receiving.md).

| - | Sandbox | Live |
| - | - | - |
| **Party** | Real Romanian CIF and SPV digital certificate | Real Romanian CIF and SPV digital certificate |
| **Environment** | ANAF test environment, documents have no fiscal value | ANAF production environment |

## Prerequisites

To register a party with RO e-Factura, you will need:

* **The party's Romanian tax ID (CIF)**, entered as the party's `tax_id` with country `RO`.
* **A qualified digital certificate** of a person registered in SPV as legal representative, designated representative or authorized person (*împuternicit*) of the company, installed in the browser used to open the registration link.
* **An active SPV enrolment for the company.** If the certificate holder isn't enrolled in SPV for the company yet, they must complete [ANAF's SPV registration](https://www.anaf.ro/anaf/internet/ANAF/servicii_online/inreg_inrol_pf_pj_SPV) first. ANAF can take several days to approve it.
* **The Cron app**, if you want to receive invoices. The registration workflow subscribes the party to the periodic sync of received invoices.

> [!NOTE]
>
> ANAF signs in with the same certificate in both environments, so even sandbox registrations need a real certificate with SPV access. Only the invoices are kept apart: in sandbox, they go to ANAF's test environment.

## Setup

All of the following steps must be carried out from the [Invopop Console](https://console.invopop.com).

**1. Connect the Romania app**

1. Navigate to **Configuration** → **Apps**
2. Find **Romania** in the app discovery list
3. Click **Connect** to activate

![Connect the Romania app](https://mintcdn.com/invopop/FN59cfkHlyzc_NNB/assets/guides/ro-efactura-connect.png?fit=max\&auto=format\&n=FN59cfkHlyzc_NNB\&q=85\&s=f033100a066268d8ef14b16e473def3c)

The initial connection requires no configuration.

**2. Connect the Cron app**

> [!NOTE]
>
> You can skip this step if you don't plan to receive invoices.

1. Navigate to **Configuration** → **Apps**
2. Find **Cron** in the app discovery list
3. Click **Connect** to activate

The [Cron app](https://docs.invopop.com/apps/cron.md) runs the sync of received invoices at the interval you choose.

**3. Configure the party registration workflow**

This workflow registers a party with RO e-Factura, then subscribes it to the periodic sync of received invoices:

1. **Set state** to Processing.
2. **Register with ANAF** generates the registration link and stores it in the party's **Meta** section.
3. **Wait ANAF link registration** pauses the workflow until the certificate holder accepts the terms and completes the authorization.
4. **Set state** to Registered.
5. **Subscribe to periodic execution** subscribes the party to the sync workflow through the Cron app.

**Error flow:** if a step fails, for example because the party's `tax_id` isn't Romanian or ANAF turns the registration down, the job ends with a `KO` and the error branch runs **Set state** to `Error`. Fix the cause and run the workflow again: a party can be registered again at any time.

The **Subscribe to periodic execution** step needs the **RO sync received invoices** workflow, created in the [receiving invoices guide](https://docs.invopop.com/guides/ro-efactura-receiving.md#setup). Select it in the step, along with how often the sync should run.

> [!NOTE]
>
> If you only want to send invoices, remove the **Subscribe to periodic execution** step. You don't need the Cron app or the sync workflow then.

![RO register party workflow subscribing the party to the sync workflow](https://mintcdn.com/invopop/FN59cfkHlyzc_NNB/assets/guides/ro-efactura-subscribe-config.png?fit=max\&auto=format\&n=FN59cfkHlyzc_NNB\&q=85\&s=d0ab6025833f26674609642e88afc311)

> [tab] Workflow

> [tab] Code
>
> Copy and paste into a new [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) code view.
>
> ```json RO register party workflow theme={"system"}
> {
>     "name": "RO register party",
>     "description": "Register a party with RO e-Factura (ANAF)",
>     "schema": "org/party",
>     "steps": [
>         {
>             "id": "94ab9ba5-d12c-11f1-9d7a-92000739e901",
>             "name": "Set state",
>             "provider": "silo.state",
>             "summary": "Set state to `processing`{.state .processing}",
>             "config": {
>                 "state": "processing"
>             }
>         },
>         {
>             "id": "94b535f3-d12c-11f1-a18c-92000739e901",
>             "name": "Register with ANAF",
>             "provider": "gov-ro.register"
>         },
>         {
>             "id": "94b536fa-d12c-11f1-8d76-92000739e901",
>             "name": "Wait ANAF link registration",
>             "provider": "gov-ro.wait.register"
>         },
>         {
>             "id": "94b53785-d12c-11f1-b646-92000739e901",
>             "name": "Set state",
>             "provider": "silo.state",
>             "summary": "Set state to `registered`{.state .registered}",
>             "config": {
>                 "state": "registered"
>             }
>         },
>         {
>             "id": "94b537f3-d12c-11f1-b146-92000739e901",
>             "name": "Subscribe to periodic execution",
>             "provider": "cron.subscribe",
>             "summary": "Periodic RO e-Factura sync"
>         }
>     ],
>     "rescue": [
>         {
>             "id": "94b53867-d12c-11f1-a89c-92000739e901",
>             "name": "Set state",
>             "provider": "silo.state",
>             "summary": "Set state to `error`{.state .error}",
>             "config": {
>                 "state": "error"
>             }
>         }
>     ]
> }
> ```

> [!NOTE]
>
> We will offer notifications before an ANAF authorization expires in the future. Until then, keep track of the one-year expiry and [renew the authorization](#renew-the-authorization) in time.

## Register a supplier

**1. Create the party**

Use the [Create an entry](https://docs.invopop.com/api-ref/silo/entries/create-an-entry-put.md) endpoint to upload a new [party](https://docs.gobl.org/draft-0/org/party), setting the `folder` to `suppliers` so it appears in that section. Or, in the [Invopop Console](https://console.invopop.com), navigate to **Parties** → **Suppliers** and click <kbd>+ New Supplier</kbd>.

Use the company's Romanian CIF and address. The county goes in `state` as its ISO 3166-2:RO code (`B` for Bucharest) and, in Bucharest, the sector goes in `locality`:

```json Romania supplier example theme={"system"}
{
    "$schema": "https://gobl.org/draft-0/org/party",
    "name": "Exemplu Digital SRL",
    "tax_id": {
        "country": "RO",
        "code": "12345674"
    },
    "addresses": [
        {
            "num": "10",
            "street": "Strada Exemplu",
            "locality": "Sector 1",
            "state": "B",
            "code": "010101",
            "country": "RO"
        }
    ],
    "emails": [
        {
            "addr": "facturare@exemplu.ro"
        }
    ]
}
```

In the Console, click <kbd>Build</kbd>, ensure there are no errors, and click <kbd>Save</kbd>. The party appears with an `Empty` state.

**2. Run the workflow**

* **Via API**: send the party to the registration workflow with the [Create a job](https://docs.invopop.com/api-ref/transform/jobs/create-a-job-post.md) endpoint, using the IDs of the **silo entry** and the **RO register party** workflow.
* **Via Console**: in the party entry, click <kbd>Select Workflow</kbd>, choose your **RO register party** workflow, and click <kbd>Run Workflow</kbd>.

The party moves to Processing and the job stops at the **Wait ANAF link registration** step until the authorization is complete.

![Registration job waiting for the ANAF authorization](https://mintcdn.com/invopop/FN59cfkHlyzc_NNB/assets/guides/ro-efactura-wait-step.png?fit=max\&auto=format\&n=FN59cfkHlyzc_NNB\&q=85\&s=38920b4b8573031a540dc52f72f97f20)

The **Wait ANAF link registration** step waits indefinitely. It continues as soon as the terms are accepted and the authorization on ANAF's site ends with the **Registration Successful** page.

* **To cancel the registration**, cancel the job.
* **To restart the registration**, run the **RO register party** workflow again.

> [!WARNING]
>
> Make sure the job is waiting on the **Wait ANAF link registration** step before completing the authorization on ANAF's site.

**3. Get the registration link**

> [tab] Your own company
>
> In Console, go to the party entry → **Meta** tab → click the **link** entry to open the registration page.
>
> ![Party entry Meta tab with the registration link](https://mintcdn.com/invopop/FN59cfkHlyzc_NNB/assets/guides/ro-efactura-meta-link.png?fit=max\&auto=format\&n=FN59cfkHlyzc_NNB\&q=85\&s=c1426097b29747fe0a87599aeb3695eb)

> [tab] Third-party companies
>
> If you issue invoices for third parties ([white label](https://docs.invopop.com/guides/white-label.md)), add a webhook after the **Register with ANAF** step to receive the `siloEntryId`.
>
> Use the [Fetch an Entry endpoint](https://docs.invopop.com/api-ref/silo/entries/fetch-an-entry.md) to get the registration link from the `meta` object:
>
> ```json theme={"system"}
> {
>   "data": {
>     "meta": [
>       {
>         "src": "gov-ro",
>         "key": "link",
>         "link_url": "https://gov-ro.invopop.com/reg/..."
>       }
>     ]
>   }
> }
> ```
>
> Send the `link_url` to the certificate holder. To show the terms in your own interface instead, follow the [white label registration](#white-label-registration) flow.

> [!NOTE]
>
> The link can be opened as many times as needed until the authorization succeeds, for example after choosing the wrong certificate.

**4. Accept the terms**

The certificate holder opens the link. Before connecting to ANAF, Invopop shows the terms of the connection: the company authorizes Invopop to connect it to the tax authority for invoicing, the person confirms they can act on its behalf, the company stays responsible for the data it provides, and Invopop may update the terms with prior notice.

Tick **I have read this information and authorize the connection** and click <kbd>Connect to ANAF</kbd>. **Setup guide** opens this guide.

![Registration page with the terms accepted](https://mintcdn.com/invopop/FN59cfkHlyzc_NNB/assets/guides/ro-efactura-terms-and-conditions.png?fit=max\&auto=format\&n=FN59cfkHlyzc_NNB\&q=85\&s=4039b3c09795445ab22b91ab49a847b1)

Invopop records the acceptance together with the exact terms accepted and when. The terms are accepted on every registration, including a renewal. Once accepted, opening the link again goes straight to ANAF.

**5. Authorize Invopop on ANAF's site**

The certificate holder continues to ANAF in a browser where their digital certificate is installed:

1. The browser asks which certificate to use. Choose the certificate registered in SPV for the company.

   ![Browser certificate selection for ANAF](https://mintcdn.com/invopop/FN59cfkHlyzc_NNB/assets/guides/ro-efactura-certificate-select.png?fit=max\&auto=format\&n=FN59cfkHlyzc_NNB\&q=85\&s=25597a51a809b308b4ad5613fd6d4ac3)

2. ANAF signs in with the certificate and sends the browser straight back to Invopop, which shows the result:

   * ✓ **Registration Successful**: the window can be closed.

     ![Registration successful page](https://mintcdn.com/invopop/FN59cfkHlyzc_NNB/assets/guides/ro-efactura-registration-success.png?fit=max\&auto=format\&n=FN59cfkHlyzc_NNB\&q=85\&s=1d428981fae9a1f1865d6d6aea373b75)

   * × **Registration could not be completed**: the page shows the error. Fix the cause and open the same link again.

     ![Registration failed page with the error](https://mintcdn.com/invopop/FN59cfkHlyzc_NNB/assets/guides/ro-efactura-registration-failure.png?fit=max\&auto=format\&n=FN59cfkHlyzc_NNB\&q=85\&s=5178d9bc00fba9773b074a39d5fa90c2)

**6. Registration completes**

Invopop stores the ANAF authorization and wakes the waiting job up. The registration link is removed from the party's meta, the party moves to Registered and, if the workflow includes it, the party is subscribed to the periodic sync of received invoices.

![Party entry in Registered state, with the link removed from meta](https://mintcdn.com/invopop/FN59cfkHlyzc_NNB/assets/guides/ro-efactura-registered.png?fit=max\&auto=format\&n=FN59cfkHlyzc_NNB\&q=85\&s=050e81dd9f45928d42ac77e6d3d0bf87)

× **Failure**: see [Why did my party registration fail?](https://docs.invopop.com/faq/romania.md#why-did-my-party-registration-fail) in Romania's FAQ.

At this point, you're ready to start sending invoices on behalf of the party. Head over to the [RO e-Factura issuing invoices guide](https://docs.invopop.com/guides/ro-efactura.md) to continue.

## White label registration

If you register parties for your own customers ([white label](https://docs.invopop.com/guides/white-label.md)), you can show the terms in your own interface and send the certificate holder straight to ANAF. Call the endpoints in this order, with your workspace's API token:

**1. Create the party**

Store the supplier with the [Create an Entry endpoint](https://docs.invopop.com/api-ref/silo/entries/create-an-entry-post.md) and keep its silo entry ID.

**2. Run the registration workflow**

Run the **RO register party** workflow on the party with the [Create a Job endpoint](https://docs.invopop.com/api-ref/transform/jobs/create-a-job-post.md). The **Register with ANAF** step prepares the registration and the job waits on **Wait ANAF link registration**.

**3. Show the terms to your customer**

Fetch the terms with [Fetch terms](https://docs.invopop.com/api-ref/apps/gov-ro/terms-fetch.md) and show them to your customer:

```bash theme={"system"}
GET https://api.invopop.com/apps/gov-ro/v1/entry/{silo_entry_id}/terms
```

The response is the terms as Markdown.

**4. Record the acceptance**

Once your customer accepts the terms, record it with [Accept terms](https://docs.invopop.com/api-ref/apps/gov-ro/terms-accept.md):

```bash theme={"system"}
POST https://api.invopop.com/apps/gov-ro/v1/entry/{silo_entry_id}/terms
```

The response carries the ANAF link and the acceptance time:

```json theme={"system"}
{
  "link": "https://logincert.anaf.ro/anaf-oauth2/v1/authorize?response_type=code&client_id=...&state=...",
  "accepted_at": "2026-10-30T10:15:00Z"
}
```

Invopop records the acceptance together with the exact terms accepted.

**5. Send the ANAF link**

Send the `link` to the certificate holder, who signs in on ANAF's site with their certificate. To fetch the link again later, use [Fetch ANAF link](https://docs.invopop.com/api-ref/apps/gov-ro/link-fetch.md).

**6. Wait for the registration**

The job continues once the authorization succeeds, and the party moves to Registered. Add a webhook step at the end of the workflow, or [fetch the job](https://docs.invopop.com/api-ref/transform/jobs/fetch-a-job.md), to know when it is done.

> [!NOTE]
>
> The `/terms` endpoints answer `409` if the **Register with ANAF** step hasn't run for the party, and the link endpoint answers `409` until the terms are accepted.

## Renew the authorization

ANAF authorizations last one year. To renew one, run the **RO register party** workflow again on the same party entry and complete the authorization with the certificate. The party keeps its history and received invoices continue from where they stopped. Terms already accepted carry over, so the link goes straight to ANAF unless the terms have changed since.

> [!NOTE]
>
> Notifications before an authorization expires are in development and will soon be supported through the app configuration.

## Unregister a supplier

Unregistering a party revokes Invopop's access to ANAF on its behalf. You might need to do so because the party is no longer your customer or because of a change in their CIF. The following workflow unregisters the party from RO e-Factura, removes the ANAF credentials stored in Invopop and stops the periodic sync:

> [tab] Workflow

> [tab] Code
>
> Copy and paste into a new [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) code view.
>
> ```json RO unregister party workflow theme={"system"}
> {
>     "name": "RO unregister party",
>     "description": "Unregister a party from RO e-Factura (ANAF)",
>     "schema": "org/party",
>     "steps": [
>         {
>             "id": "94b538d5-d12c-11f1-ae64-92000739e901",
>             "name": "Set state",
>             "provider": "silo.state",
>             "summary": "Set state to `processing`{.state .processing}",
>             "config": {
>                 "state": "processing"
>             }
>         },
>         {
>             "id": "94b53935-d12c-11f1-b8eb-92000739e901",
>             "name": "Unregister from ANAF",
>             "provider": "gov-ro.unregister"
>         },
>         {
>             "id": "94b539c4-d12c-11f1-b2c5-92000739e901",
>             "name": "Unsubscribe from periodic execution",
>             "provider": "cron.unsubscribe"
>         },
>         {
>             "id": "94b5397c-d12c-11f1-a944-92000739e901",
>             "name": "Set state",
>             "provider": "silo.state",
>             "summary": "Set state to `void`{.state .void}",
>             "config": {
>                 "state": "void"
>             }
>         }
>     ],
>     "rescue": [
>         {
>             "id": "94b53a0d-d12c-11f1-8ff1-92000739e901",
>             "name": "Set state",
>             "provider": "silo.state",
>             "summary": "Set state to `error`{.state .error}",
>             "config": {
>                 "state": "error"
>             }
>         }
>     ]
> }
> ```

Run the **RO unregister party** workflow on the party entry. The party moves to Void, the ANAF credentials are deleted from Invopop and the periodic sync stops.

> [!WARNING]
>
> An unregistered party can no longer send or receive invoices through Invopop. To start again, run the registration workflow, accept the terms and complete the ANAF authorization again.

> [!TIP]
>
> To stop receiving invoices without unregistering the party, create a workflow with only the **Unsubscribe from periodic execution** step of the Cron app and run it on the party.

## Legal information

> [accordion] RO e-Factura connection terms
>
> Before authorizing Invopop on ANAF's site, the certificate holder accepts the terms of the connection on the registration page: the company authorizes Invopop to connect it to the tax authority for invoicing, the person confirms they can act on its behalf, the company stays responsible for the data it provides, and Invopop may update the terms with prior notice.
>
> Invopop records the acceptance together with the exact terms accepted and when. The terms are accepted on every registration, including a renewal. To read them before registering, or to show them in your own interface, use the [Fetch terms](https://docs.invopop.com/api-ref/apps/gov-ro/terms-fetch.md) endpoint once the **Register with ANAF** step has run.

> [accordion] Who can authorize Invopop
>
> ANAF grants Invopop the access that the certificate holder has in SPV, so only a person registered in SPV for the company as legal representative, designated representative or authorized person (*împuternicit*) can complete the authorization. The certificate must be a qualified digital certificate accepted by ANAF for SPV, the same one the person uses to sign in to SPV. Invopop never receives the certificate: it only receives the access ANAF grants, which lasts one year.

## FAQ

> [accordion] What does a party need to register with RO e-Factura?
>
> A Romanian tax ID (CIF) and a qualified digital certificate of a person with access to the company's SPV (*Spațiul Privat Virtual*) as legal representative or authorized person. The certificate holder opens the registration link, accepts the terms and authorizes Invopop on ANAF's site. Invopop never sees or stores the certificate.

> [accordion] Can one person register several companies?
>
> Yes. An accountant or representative with SPV rights for several companies can use the same certificate for all of them, but each company is a separate party in Invopop. Run the registration workflow and complete the authorization once per party.

> [accordion] Where do I find the registration link?
>
> After the **Register with ANAF** step runs, the link is stored in the **Meta** section of the party entry under the `link` key. It opens the terms first and then continues to ANAF. The workflow waits on the **Wait ANAF link registration** step until the certificate holder completes the authorization, and the link is removed once the party is registered.

> [accordion] Can I show the terms in my own interface?
>
> Yes. If you register parties for your own customers, fetch the terms with `GET /apps/gov-ro/v1/entry/{silo_entry_id}/terms`, show them in your own interface and record your customer's acceptance with `POST` on the same path. The response carries the ANAF link to send to the certificate holder. See the [white label registration](https://docs.invopop.com/guides/ro-efactura-supplier.md#white-label-registration) flow.

> [accordion] Where is the acceptance of the terms stored?
>
> Invopop records the acceptance together with the exact terms accepted and when, whether they were accepted on the registration page or through the API. Nothing is stored on the party entry. The terms are accepted on every registration, including a renewal.

> [accordion] Why did my party registration fail?
>
> Common reasons:
>
> * **Wrong certificate**: the certificate chosen in the browser does not belong to a person with SPV rights for the company's CIF.
> * **SPV rights missing**: the certificate holder is not registered in SPV as legal representative or authorized person of the company.
> * **Party not Romanian**: the party's `tax_id` country must be `RO`.
> * **Terms not accepted**: the ANAF authorization only goes through once the terms have been accepted.
> * **Registration expired**: the terms of a registration can only be accepted while it is open. One left unaccepted for 32 days shows `registration expired, register the party again`: run the registration workflow again and use the new link.
>
> After fixing the cause, open the same registration link again.
>
> > [!NOTE]
> >
> > The page shown at the end of the authorization tells whether it succeeded, and shows the error otherwise. The workflow error logs in the Invopop Console have more detail.

> [accordion] How long does an ANAF authorization last?
>
> One year. Invopop renews access automatically during that year, after which the party has to complete the registration again. Notifications before the deadline are in development and will soon be supported through the app configuration.

> [accordion] Can I test with the sandbox?
>
> Yes. In an Invopop sandbox workspace, every call goes to ANAF's test environment, so invoices sent there have no fiscal value. The registration still uses a real digital certificate, since ANAF authenticates the same way in both environments.

> [accordion] How do I stop sending and receiving for a party?
>
> Run the **RO unregister party** workflow on the party. It removes the ANAF authorization from Invopop and unsubscribes the party from periodic sync. To receive again, run the registration workflow again.

More available in our [Romania FAQ](https://docs.invopop.com/faq/romania.md) section

***

> [accordion] 🇷🇴 Invopop resources for Romania
>
> | | |
> | - | - |
> | Compliance | [Invoicing compliance in Romania](https://docs.invopop.com/compliance/romania.md)   [Compliance timeline](https://docs.invopop.com/timelines/romania.md) |
> | Apps | [Romania](https://docs.invopop.com/apps/romania.md) |
> | Guides | [Supplier registration](https://docs.invopop.com/guides/ro-efactura-supplier.md)   [Issuing invoices](https://docs.invopop.com/guides/ro-efactura.md)   [Receiving invoices](https://docs.invopop.com/guides/ro-efactura-receiving.md) |
> | FAQ | [Romania FAQ](https://docs.invopop.com/faq/romania.md) |
> | GOBL | [Romanian RO e-Factura addon](https://github.com/invopop/gobl.ro.anaf/tree/main/addon) |

> [card] [Participate in our community](https://community.invopop.com)
>
> Ask and answer questions about invoicing in Romania →


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.