Territorial taxes (IVA, IGIC, IPSI)
When to use IVA, IGIC (Canary Islands), or IPSI (Ceuta & Melilla) — and which main_tax.type value to send.
Spain has three territorial IVA-equivalent taxes. The right one depends on where the operation is localised, not on the issuer's address. Most lines run on IVA; switch to IGIC or IPSI when the operation happens in those territories.
This page is the canonical reference for main_tax.type values and the rate menus per tax.
The three taxes
main_tax.type | Tax | Territory | AEAT impuesto code |
|---|---|---|---|
IVA | Value added tax (Impuesto sobre el Valor Añadido) | Peninsula + Balearic Islands | 01 |
IPSI | Production, services and import tax (Impuesto sobre la Producción, Servicios e Importación) | Ceuta & Melilla | 02 |
IGIC | Canary Islands general indirect tax (Impuesto General Indirecto Canario) | Canary Islands | 03 |
OTHER | Other taxes | Rare — reserved for non-Spanish taxes carried on the invoice | 05 |
IVA is what almost every line uses, but it is not implicit: main_tax requires both type and percentage. Only regime_key may be omitted (it falls back to "01").
How you set it in the API
main_tax.type, main_tax.percentage, and main_tax.regime_key are sibling fields on each line:
curl -X POST "https://app.beel.es/api/v1/companies/{company_id}/invoices" \
-H "Authorization: Bearer $BEEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "STANDARD",
"recipient": {
"legal_name": "Importaciones Atlántico SL",
"nif": "B12345674",
"address": {
"street": "Avenida Marítima",
"number": "200",
"postal_code": "35001",
"city": "Las Palmas de Gran Canaria",
"province": "Las Palmas",
"country": "España"
}
},
"lines": [
{
"description": "Industrial air conditioning systems",
"quantity": 3,
"unit": "unit",
"unit_price": 3500,
"discount_percentage": 0,
"main_tax": { "type": "IGIC", "percentage": 7, "regime_key": "01" }
}
]
}'Rate menus per tax
IGIC (Canary Islands)
main_tax.percentage | Use |
|---|---|
0 | Zero rate (essentials, intra-canary exports) |
3 | Reduced rate (some food, transport) |
5 | Special reduced rate (temporary energy/utility measures) |
7 | General rate |
9.5 | Increased rate (vehicles, mid-tier goods) |
15 | Special increased rate (luxury) |
20 | Tobacco products |
IPSI (Ceuta & Melilla)
Rates are set per municipality and per product category. The API accepts 0.5, 1, 2, 4, 8 or 10 % — any other percentage on an IPSI line is rejected. Check the tax bylaw (Ordenanza Fiscal) of the specific city.
main_tax.percentage | Typical use |
|---|---|
0.5 | Super-reduced (social housing, games, advertising) |
1 | Reduced (taxis, bars, electricity) |
2 | Intermediate (restaurants, hospitality) |
4 | Medium (renovations, real estate) |
8 | High (telecommunications, electronic services) |
10 | General (construction) |
{
"lines": [
{
"description": "Servicio en Ceuta",
"quantity": 1,
"unit": "service",
"unit_price": 200,
"discount_percentage": 0,
"main_tax": { "type": "IPSI", "percentage": 4, "regime_key": "01" }
}
]
}IVA
main_tax.percentage | Use |
|---|---|
0 | Exempt or out-of-scope (set exemption_reason — see Tax classification) |
4 | Super-reduced rate — basic foodstuffs, books |
5 | Temporary: only on operations dated 2022-07-01 to 2024-09-30 |
2, 7.5 | Temporary: only on operations dated 2024-10-01 to 2024-12-31 |
10 | Reduced rate — hospitality, transport |
21 | General rate |
A temporary rate outside its period answers 422 VAT_RATE_NOT_ACCEPTED_ON_DATE; the date judged is the invoice's operation_date, or the issue date when there is none.
Mixing taxes on the same invoice
Different lines on the same invoice can carry different taxes — for example, a service partly delivered in the peninsula (IVA) and partly in the Canary Islands (IGIC):
{
"lines": [
{ "description": "Consultoría en Madrid", "quantity": 1, "unit_price": 1000, "discount_percentage": 0,
"main_tax": { "type": "IVA", "percentage": 21, "regime_key": "01" } },
{ "description": "Consultoría en Tenerife", "quantity": 1, "unit_price": 1000, "discount_percentage": 0,
"main_tax": { "type": "IGIC", "percentage": 7, "regime_key": "01" } }
]
}BeeL. groups the totals per main_tax.type in the response and submits each line under the correct AEAT impuesto code.
When to pick which
The decision tracks the place of supply of the operation, not the issuer's tax address:
- Goods physically delivered or services consumed in the Canary Islands → IGIC
- Goods or services consumed in Ceuta or Melilla → IPSI
- Everything else inside Spain → IVA
If you're a self-employed person on the peninsula invoicing a Canary client for a service used in the Canaries, IGIC applies — not IVA. Likewise, a Canary issuer invoicing a peninsular client for a service consumed in the peninsula uses IVA.
BeeL. doesn't auto-detect the place of supply — it trusts what you set. When the customer's address is in the Canaries, IPSI territory, or another EU country, double-check the line classification before issuing.
Mixed-territory regime (main_tax.regime_key: "08")
"08" declares an operation subject to another indirect tax: IPSI or IGIC on an IVA line, IPSI or IVA on an IGIC line. It is rare, and it is not the general regime of IGIC — an ordinary IGIC line uses "01". AEAT only accepts it on a line with exemption_reason: NO_SUJETA_LOCALIZACION at 0 %; otherwise the line is rejected with 422 REGIME_KEY_CLASSIFICATION_NOT_ACCEPTED. See Regime keys.
Related
International customers
Every cross-border scenario — intra-EU B2B, B2C with OSS, exports, services to non-EU — with the exact request shape BeeL. accepts.
Auto-submit policy
Whether an issued invoice reaches AEAT is decided by the taxpayer, not by the request — what that means when you issue, and how to read the result.