Simplified vs standard (F1 vs F2)
When to issue a factura simplificada (F2), when you must use a factura ordinaria (F1), and what BeeL. enforces at the API boundary.
The simplified invoice (F2) is the "ticket" of the Spanish tax system: less data, fewer obligations, but capped in amount and use case. This page is the decision aid plus the exact rules BeeL. applies before the registro reaches AEAT.
The decision in one table
| Situation | Recommended type | Why |
|---|---|---|
| Total ≤ 3 000 € AND you don't need to identify the customer | F2 (type: SIMPLIFIED) | Quickest path, no NIF required |
| Total > 3 000 € | F1 (type: STANDARD) | F2 is illegal above the threshold |
| Customer is a company / autónomo / business buyer | F1 | They will need the NIF on the invoice for their own deduction |
| Customer is a foreign B2B or B2C in the EU | F1 | Required for VIES, OSS, or exempt operations — see International customers |
| Customer explicitly requests an identified invoice | F1 | You must comply, regardless of amount |
| You're going to apply IRPF withholding | F1 | Withholding requires identifying the payer; F2 doesn't carry it |
What BeeL. enforces
On the F2 path
total(IVA included) must be ≤ 3 000 € — request rejected above the threshold- Up to 400 € IVA-included the
recipientcan be an empty object{}(nonif/alternative_idrequired). Between 400 € and 3 000 €, AEAT requires identifying the customer, so the recipient must carryniforalternative_id. Above 3 000 €, F2 is not allowed at all — use F1 - IRPF lines are not allowed on F2 —
SIMPLIFICADA_FORBIDS_IRPF; see Why no IRPF on F2. The rate is not silently coerced to 0: send noirpf_rateat all, orirpf_rate: 0 - Recargo de equivalencia is not allowed either —
SIMPLIFICADA_FORBIDS_SURCHARGE: a retailer in that regime must receive an identified F1 - Reverse charge is not allowed —
SIMPLIFICADA_FORBIDS_ISP: an anonymous recipient cannot self-assess - Intra-EU operations and the OSS regime are not allowed —
SIMPLIFICADA_FORBIDS_CROSS_BORDER - Apart from those, line semantics work as on F1: IVA rates, regime keys, exemption reasons, etc.
On the F1 path
recipient.niforrecipient.alternative_idis required — request rejected if both are missing- For Spanish NIFs (DNI / NIE / CIF), the name must match the AEAT census — BeeL. pre-validates via the NIF Validation API and rejects mismatches before submission
- For foreign customers, use
alternative_idinstead ofnif
3 000 € is IVA-included. A line at 2 600 € + 21 % IVA = 3 146 € totals over the threshold → must be F1.
Edge cases the law handles
Operations where F2 is never allowed, regardless of amount
The Real Decreto 1619/2012 forbids F2 in a handful of operations. Some of them BeeL. rejects for you at the API boundary, from the line data:
- Intra-EU sales of goods and the OSS regime →
SIMPLIFICADA_FORBIDS_CROSS_BORDER - Operations under inversión del sujeto pasivo →
SIMPLIFICADA_FORBIDS_ISP - Lines carrying recargo de equivalencia →
SIMPLIFICADA_FORBIDS_SURCHARGE - Lines carrying IRPF withholding →
SIMPLIFICADA_FORBIDS_IRPF
The rest depend on facts BeeL. cannot see, so you must explicitly choose STANDARD yourself:
- Distance sales of goods
- Operations not located in Spain that need a Spanish invoice
- Any operation where the customer is required by law to receive an F1
For those last ones AEAT will not reject the registro (the format is valid), but the invoice is non-compliant. Treat F2 as "consumer-facing under 3 000 € only".
Why no IRPF on F2
IRPF withholding requires the buyer to identify themselves and report the withheld amount in their own filings. Simplified invoices don't carry the buyer's NIF, so IRPF cannot be applied. If your customer is a business that must withhold from your invoice, issue an F1 even if the total is below 3 000 €.
Upgrading an F2 to F1 (the canje case)
Sometimes a customer asks for an identified invoice after you already issued a ticket. The clean two-step path:
-
Cancel the F2 with an R5 corrective
curl -X POST "https://app.beel.es/api/v1/companies/{company_id}/invoices/{f2_invoice_id}/corrective" \ -H "Authorization: Bearer beel_sk_live_xxx" \ -H "Content-Type: application/json" \ -d '{ "rectification_type": "TOTAL", "rectification_code": "R5", "reason": "Customer requested an identified invoice replacing the original simplified ticket." }' -
Issue a fresh F1 (
POST /v1/companies/{company_id}/invoiceswithtype: STANDARD) with the customer's NIF and full data.
The running total stays consistent (F2 + R5 cancellation + F1 = F1 net). See Corrective invoices for the worked example.
Canonical request shapes
F2 (no recipient)
{
"type": "SIMPLIFIED",
"recipient": {},
"lines": [
{
"description": "Computer repair service",
"quantity": 1,
"unit": "service",
"unit_price": 300,
"discount_percentage": 0,
"main_tax": { "type": "IVA", "percentage": 21, "regime_key": "01" }
}
],
"payment_info": { "method": "CASH" }
}F1 (Spanish customer identified)
{
"type": "STANDARD",
"recipient": {
"legal_name": "Comercial Martínez SL",
"nif": "B87654321",
"address": {
"street": "Avenida de la Constitución",
"number": "45",
"postal_code": "41001",
"city": "Sevilla",
"province": "Sevilla",
"country": "España"
}
},
"lines": [
{
"description": "Business strategic consulting",
"quantity": 8,
"unit": "hours",
"unit_price": 125,
"discount_percentage": 0,
"main_tax": { "type": "IVA", "percentage": 21, "regime_key": "01" }
}
],
"payment_info": { "method": "BANK_TRANSFER", "iban": "ES9121000418450200051332", "payment_term_days": 30 }
}Related
- Invoice types — the full F1/F2/R catalogue
- Tax classification — IVA rate, exempt operations, ISP
- International customers — when F2 is never appropriate
- createInvoice API reference — full request schema