Network Exchanges
Network Exchanges: Send and Receive Invoices through ANAF
For Romanian organizations, connect ANAF eFactura to receive invoices and submit the ones you issue to Romanian clients, manually or on a configured schedule. See the exchange status in Enlivy. For other markets, download a supported electronic invoice file for review and separate submission.
Connect to ANAF e-FacturaFree account, no card needed.
NETWORK EXCHANGES
Exchange Romanian Invoices with ANAF from Enlivy
Review incoming invoices and choose when outgoing ones are submitted.
Connect your Romanian organization to ANAF eFactura and see incoming invoices, outgoing submissions and their statuses together. For other markets, download an electronic invoice file in a format Enlivy supports and submit it through the appropriate channel.
-
Manual work slows you down:
downloading XMLs, sorting emails, and uploading to government portals by hand is frustrating, error-prone, and time-consuming.
-
Requirements differ by country:
review the rules that apply to each invoice and choose the available submission route.
-
Sync incoming invoices automatically
Enlivy pulls your incoming invoices from eFactura and displays them clearly, so you review, register, or link them in seconds.
-
Send to ANAF with confidence
Validate, track, and push documents from your dashboard, with full transparency on status, sender identity, and delivery time.
-
Keep exchange status in view
See incoming invoices and the status of outgoing ANAF submissions in the same workspace.
-
Everything connected
Every exchange can be tagged and stays linked to its invoice, so you can trace it back to the rest of the record.
FULL LIFECYCLE
A Full History for Every Exchange
A fast connection with ANAF's eFactura, built to save time, reduce errors, and keep you in control.
Each invoice carries a full sync and push history, from reception to final status. See when it was pulled, what was modified, when it was pushed, and who did it. No guesswork, no gaps, just clarity.
-
Track the full lifecycle:
every step from reception to final status is recorded, with who did what and when.
-
Know which route is available:
Romanian ANAF exchange is connected; other supported formats are files you review and submit separately.
-
See every step
When each invoice was pulled, modified, pushed, and by whom.
-
Full status transparency
Sender identity, delivery time, and final status, all visible at a glance.
-
Fewer errors
Validation catches issues before a document ever goes out.
-
Stay in control
Manage every exchange from one dashboard, with complete context.
MULTIPLE INPUT METHODS
One Connection, Every Way to Exchange
One ANAF connection lets you receive invoices, submit outgoing ones and review exchange status without moving between separate tools.
- Pull invoices from ANAF every hour, or whenever you ask
Automatically fetch incoming invoices from the eFactura system into Enlivy, instead of downloading XML files and email attachments.
- Push outgoing invoices with confidence
Send your invoices directly to ANAF from within Enlivy. You control what goes out, when, and how, with full visibility and logs.
- Review and register in seconds
View structured XML data side-by-side with invoice fields. Link to existing records or create new ones without retyping anything.
- Review fields before submitting
Built-in validation flags fields that need attention; check the document and its exchange result.
Smart Search & Filtering
Search by invoice number, company name, RO/CUI, direction, and more
Results update as you type, and every exchange is clickable for full context.
Getting Started
-
Connect with ANAF
Getting started is simple. Just link your ANAF or SPV account securely to Enlivy with a few clicks, no complex configurations or tech skills required.
-
Sync Incoming Invoices Automatically
Once connected, Enlivy can pull your incoming invoices straight from the government portal automatically. You also have the option to fetch invoices manually whenever you want full control.
-
Push Outgoing Invoices with Confidence
Submit outgoing Romanian invoices to ANAF manually or on the schedule you configure, then check their exchange status.
CHOOSE YOUR SUBMISSION FLOW
Receive Automatically, Submit on Your Terms
For ANAF, choose manual submission or a configured automatic schedule.
Once your Romanian organization is connected, Enlivy can pull incoming invoices. For outgoing invoices to Romanian clients, you can submit manually or enable automatic submission after the delay you choose. Watch the exchange status and address connection warnings when access needs attention.
-
Auto-pull incoming:
Enlivy pulls your eFactura invoices automatically and shows them in a smart, organized dashboard.
-
Auto-push on your schedule:
push invoices to Romanian clients to ANAF automatically 1, 2, 3, or 4 days after the issue date, or push any of them yourself straight away.
-
Full control when you want it:
push any invoice manually at any time, and track every push with clear status indicators.
-
Review due dates
Choose a submission delay that fits the deadline that applies to your invoices.
-
Less manual work
Minimize administrative overhead and repetitive tasks.
-
See what happened
Check the result and any connection warning instead of assuming a scheduled submission succeeded.
-
Your exact cadence
Choose the delay that matches how you operate.
INCOMING INVOICES
Review a suggested tax match before registering
When you open an incoming electronic invoice, Enlivy can suggest a matching tax class from the document and your configured rates. Review the invoice and the suggestion before saving; a missing match does not prevent you from continuing with the ordinary invoice form.
CONNECTION STATUS
Know when ANAF access needs attention
If ANAF blocks access for an expired authorization or a tax-identifier issue, Enlivy records the block and warns the organization. Review the stated reason, correct access, and resume syncing after the connection recovers.
EUROPEAN E-INVOICING COVERAGE
Built for Today. Ready for Tomorrow
Start with ANAF. Grow with Europe.
-
Check the route for your country
See whether Enlivy connects to the exchange or provides a file for you to submit through another channel.
-
Ask about another connection
Tell us which institution matters to your business so we can assess the integration.
Romania has a direct ANAF connection for incoming and outgoing invoices. The other countries shown here offer supported file formats for manual review and submission. A generated file is not proof that the receiving institution accepted it or that every local requirement was met.
API Reference
Network Exchanges from the API
Send e-invoices for your Romanian clients to ANAF e-Factura, and pull the ones addressed to you, programmatically. A network exchange is a single transmission of an invoice to (or from) an institution; the supported institution is ANAF. Enlivy builds the compliant UBL document, submits it, and tracks the response through its lifecycle so you know whether a document was accepted, rejected, or still processing.
Exchanges are outbound (you submit an invoice you issued) or inbound (you pull documents addressed to you). This reference starts with the key action, pushing an invoice onto the network, then covers listing, inspecting, pulling inbound documents, and downloading the signed files. Every exchange carries a status you can poll.
Submit an issued invoice to a network institution. The invoice is the payload; there is no request body. Enlivy generates the compliant UBL, transmits it, and returns the resulting network-exchange record with its initial status. Which institutions an invoice can go to is exposed on the invoice itself.
/organizations/<organization_id>/invoices/<invoice_id> +1# 1. Discover eligible institutions for this invoice.
# invoice.peppol_exchange_push_options lists the institution ids you may push to;
# invoice.peppol_exchanges_pushed lists the ones already sent.
curl 'https://api.enlivy.com/organizations/<organization_id>/invoices/<invoice_id>' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json'
# 2. Push to a specific institution. The id is a string, e.g. "anaf" (Romania / ANAF).
# no request body, the invoice is the document
curl -X POST 'https://api.enlivy.com/organizations/<organization_id>/invoices/<invoice_id>/peppol/anaf' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json'
# The response is the network-exchange record. Poll its `status`:
# pending | processing | success | success_in_exchange_queue | success_pending_archive
# | change_required | rejected | rejected_at_exchange | failed | failed_credentials_expired
# A transport/connectivity failure to the institution returns HTTP 503. const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const invoiceId = "<invoice_id>";
const institution = "anaf";
const headers = {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
};
// 1. Discover eligible institutions for this invoice.
// invoice.peppol_exchange_push_options lists the institution ids you may push to;
// invoice.peppol_exchanges_pushed lists the ones already sent.
const invoice = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/${invoiceId}` , {
method: "GET",
headers,
}).then((response) => response.json());
// 2. Push to a specific institution. The id is a string, e.g. "anaf" (Romania / ANAF).
// no request body, the invoice is the document
const exchange = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/${invoiceId}/peppol/${institution}` , {
method: "POST",
headers,
}).then((response) => response.json());
// The response is the network-exchange record. Poll its `status`:
// pending | processing | success | success_in_exchange_queue | success_pending_archive
// | change_required | rejected | rejected_at_exchange | failed | failed_credentials_expired
// A transport/connectivity failure to the institution returns HTTP 503. List every exchange with pagination and filtering: scope to one invoice, filter by exchange status or by the linked invoice’s state, and bound by date. This is how you build a compliance dashboard of what’s been sent and where each document stands.
/organizations/<organization_id>/invoices/network-exchanges # filters: status, organization_invoice_id, invoice_state (the linked invoice's state),
# created_at_from/to, updated_at_from/to, ids
curl -G 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20' \
--data-urlencode 'status=success' \
--data-urlencode 'include=invoice' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
// filters: status, organization_invoice_id, invoice_state (the linked invoice's state),
// created_at_from/to, updated_at_from/to, ids
const query = new URLSearchParams({
page: "1",
limit: "20",
status: "success",
include: "invoice",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Retrieve a single exchange: its status, the institution’s exchange and message identifiers, the raw institution response_json, and the names of the generated files. Include parsed_data to get the parsed contents of the exchanged document, or invoice for the source invoice.
/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id> # includes: organization, invoice, parsed_data (the parsed UBL as structured data), tag_ids
curl -G 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>' \
--data-urlencode 'include=parsed_data,invoice' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const peppolNetworkExchangeId = "<peppol_network_exchange_id>";
// includes: organization, invoice, parsed_data (the parsed UBL as structured data), tag_ids
const query = new URLSearchParams({
include: "parsed_data,invoice",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${peppolNetworkExchangeId}?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Fetch documents that were sent to you over an institution’s network, supplier invoices delivered through ANAF, for example. Enlivy retrieves and ingests them as inbound exchanges. Bound the sync with date_from.
/organizations/<organization_id>/invoices/network-exchanges/anaf/pull curl -G 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/anaf/pull' \
--data-urlencode 'date_from=2026-07-01' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const institutionId = "anaf";
const query = new URLSearchParams({
date_from: "2026-07-01",
});
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${institutionId}/pull?${query}` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Pull the artifacts of an exchange: the compliant UBL/XML document, its digital signature, and the human-readable PDF. Each returns a file stream.
/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/download +2# the signed UBL / XML document
curl 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/download' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
--remote-name --remote-header-name
# the detached digital signature
curl 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/download-signature' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
--remote-name --remote-header-name
# the human-readable PDF rendering
curl 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/download-pdf' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
--remote-name --remote-header-nameconst baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const peppolNetworkExchangeId = "<peppol_network_exchange_id>";
const headers = {
Authorization: `Bearer ${token}`,
};
// the signed UBL / XML document
const xml = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${peppolNetworkExchangeId}/download` , {
method: "GET",
headers,
}).then((response) => response.blob());
// the detached digital signature
const signature = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${peppolNetworkExchangeId}/download-signature` , {
method: "GET",
headers,
}).then((response) => response.blob());
// the human-readable PDF rendering
const pdf = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${peppolNetworkExchangeId}/download-pdf` , {
method: "GET",
headers,
}).then((response) => response.blob());Retrieve the institution-side status and validation details for an exchange, useful when a document comes back as change_required or rejected and you need the reasons to correct and resubmit.
/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/information curl 'https://api.enlivy.com/organizations/<organization_id>/invoices/network-exchanges/<peppol_network_exchange_id>/information' \
-H "Authorization: Bearer $ENLIVY_API_TOKEN" \
-H 'Accept: application/json' const baseUrl = "https://api.enlivy.com" ;
const token = process.env.ENLIVY_API_TOKEN;
const organizationId = "<organization_id>";
const peppolNetworkExchangeId = "<peppol_network_exchange_id>";
const result = await fetch(`${baseUrl}/organizations/${organizationId}/invoices/network-exchanges/${peppolNetworkExchangeId}/information` , {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/json" ,
},
}).then((response) => response.json());Where it fits
Part of these setups
- Agencies and studios Optional Adds the ANAF e-Factura submission for invoices to Romanian clients, when you turn it on. See the setup
- Course authors Optional Adds the ANAF submission for invoices to Romanian clients. See the setup
- Monthly billing Optional Sends invoices to Romanian clients through ANAF, and brings your suppliers' e-invoices in. See the setup
- Sales teams Optional Adds the ANAF e-Factura submission for invoices to Romanian clients, when you turn it on. See the setup
Works together with
- Invoices Create an invoice, send it to your client, and connect the contract, receipt or bank transaction that belongs with it. For Romanian e-Factura, use the configured ANAF connection.
- Receipts Record money in and money out, keep supporting files together, and connect a receipt to its related invoice or contract when needed.
- Taxes Stop picking VAT rates by hand. Assign a tax class to a product or invoice line and Enlivy resolves the correct rate automatically, based on who the customer is and where they are, with the right EU codes for e-invoicing built in.
- Payslips Your accountant works out the figures. Enlivy is where they land: every amount on its own coded line, in the vocabulary your country actually uses, checked against the payslip's own totals and tied to the employment, the contract and the payment it belongs to.
- Data Export Export your invoices, receipts, payslips, contracts, and transactions in the format and folder structure your accountant expects, for any date range. Built in, at no extra cost, on every plan.
- MCP Connect Enlivy to Claude, ChatGPT, Cursor, or any AI assistant through MCP. Ask about your invoices, contracts, and pipeline, and get real work done, safely scoped to exactly what your own account can already do.