Welcome to BaaS! 🎉
Let's set up your first organization and project.
Dashboard
Loading... -
📈 Requests
Organizations
Projects
API Keys & Security
🔑 API Keys
| Name | Key Prefix | Status | Requests | Last Used | Actions |
|---|---|---|---|---|---|
| Select a project | |||||
🛡️ IP Whitelist
Restrict API access to specific IPs. Empty = all IPs allowed.
| IP Address | Description | Added | Actions |
|---|---|---|---|
| Select a project | |||
API Documentation
Enter your API key to test endpoints directly
API Overview
Base URL
https://baas.dapita.net
Authentication
All API requests require an API key sent in the X-API-Key header.
curl -H "X-API-Key: baas_sk_your_key_here" https://baas.dapita.net/geo/ip/8.8.8.8
Request Headers
| Header | Required | Description |
|---|---|---|
X-API-Key | Yes | Your API key |
Content-Type | For POST | application/json |
Error Responses
| Code | Description |
|---|---|
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 429 | Rate limit exceeded |
| 500 | Internal Server Error |
Rate Limits
| Plan | Requests/Month | Requests/Hour |
|---|---|---|
| Free | 1,000 | 5 |
| Pay-as-you-go | 5,000 | 20 |
| Growth | 50,000 | 100 |
| Scale | 500,000 | 700 |
Special Rate Limits
| Endpoint | Limit | Reason |
|---|---|---|
/vat/validate | 1 req / 10 sec | External VIES API |
/ip/reputation | 1 req / 60 sec | External AbuseIPDB |
/email/validate | 1 req / 5 sec | SMTP verification |
/compliance/{jurisdiction}Data-retention & GDPR-style compliance rules for a jurisdiction. Per data category: action (delete / anonymize / restrict / retain), retention period (days), legal reference, source URL and a ready-to-use policy clause. Also returns jurisdiction-level request (days to fulfil a data-subject request + extension) and data_residency (none / local_copy_required / transfer_restricted). For the 30 EEA countries and the UK it also returns supervisory_authority — name, abbreviation, complaint URL, phone, email and postal address of the national data protection authority, ready to drop into a privacy notice (GDPR art. 13(2)(d) / 14(2)(e), WP260 transparency guidance). Unlike the other blocks it never falls back to EU or DEFAULT: a complaint is lodged with the authority of the data subject’s own country (art. 77(1)), so the field is simply absent outside the EEA and the UK. Falls back to EU / DEFAULT when a country has no specific rule, so the response is never empty.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
jurisdiction | string | Yes | ISO 3166-1 alpha-2 (ES, DE, US…) or EU / DEFAULT |
category | string | No | contact, credentials, tokens, audit, financial or consent. Omit to return all categories. |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/compliance/ES?category=financial"
Response
{"jurisdiction":"ES","resolved_from":"ES","version":1,"request":{"max_days_to_fulfill":30,"extension_days":60,"legal_reference":"GDPR Art. 12(3)","resolved_from":"EU","reviewed":false},"data_residency":{"mode":"none","required":false,"resolved_from":"EU","reviewed":false},"supervisory_authority":{"name":"Agencia Española de Protección de Datos","abbr":"AEPD","website":"https://www.aepd.es/","complaint_url":"https://www.aepd.es/","phone":"900 293 183","email":"internacional@aepd.es","address":"C/ Jorge Juan 6, 28001 Madrid","source_url":"https://www.edpb.europa.eu/about-edpb/about-edpb/members_en","version":1,"reviewed":false},"categories":{"financial":{"action":"retain","retention_days":2190,"legal_reference":"Código de Comercio art. 30","source_url":"https://www.boe.es/buscar/act.php?id=BOE-A-1885-6627","clause":{"en":"Accounting books and records are retained for 6 years.","es":"..."},"resolved_from":"ES","version":1,"reviewed":false}}}Field guide
| Field | Meaning |
|---|---|
action | delete erase · anonymize irreversibly de-identify (row kept) · restrict keep but block processing (legal hold) · retain keep and use |
retention_days | 0 delete now · N keep N days then delete · null keep indefinitely |
request | Days to fulfil a data-subject request (max_days_to_fulfill) plus permitted extension_days |
data_residency | none · local_copy_required (primary copy stays in-country) · transfer_restricted (cross-border needs assessment/approval); required is a bool shortcut |
supervisory_authority | National data protection authority to name in your privacy notice: name, abbr, complaint_url, phone, email, address. Present for the 30 EEA countries and GB only — never inherited from EU or DEFAULT, since a complaint goes to the authority of the data subject’s own country (GDPR art. 77(1)) |
resolved_from | Which tier supplied the rule: the country, EU, or DEFAULT (shown per category and on request / data_residency) |
version | Policy version — store it with any action you take to prove which rule applied; the top-level value is the max, use it for cache invalidation |
reviewed | false until confirmed by legal counsel — treat unreviewed rules as provisional |
How to use correctly
- Fetch
GET /compliance/{jurisdiction}once per user's jurisdiction; cache byversionwith a short TTL and refetch when it changes. - Per data category, read
action+retention_daysto decide whether and when to delete, anonymize, restrict or retain. - For data-subject (deletion / access) requests, take the deadline from
request.max_days_to_fulfill(plusextension_days). - Choose the storage region according to
data_residencybefore storing personal data. - Generate policy text from
clauseand keepsource_urlas proof of the legal basis. - Record the
(jurisdiction, category, version)you acted on, so the exact rule can be reproduced later.
Try It
/geo/ip/{ip}Get geolocation data for an IP address.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
ip | string | Yes | IPv4 or IPv6 address |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/geo/ip/8.8.8.8
Response
{"ip":"8.8.8.8","country_code":"US","country":"United States","city":"","timezone":"America/Chicago","latitude":37.751,"longitude":-97.822}Try It
/ip/meGet geolocation data for your current IP address.
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/ip/me
Response
{"ip":"57.131.32.227","country_code":"FR","country":"France","city":"","timezone":"Europe/Paris","latitude":48.8582,"longitude":2.3387}Try It
/ip/reputation/{ip}Get IP reputation data including abuse score, reports, and threat indicators. Rate limited: 1 request per 60 seconds.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
ip | string | Yes | IPv4 or IPv6 address |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/ip/reputation/8.8.8.8
Response
{"ip":"8.8.8.8","is_public":true,"abuse_score":0,"country_code":"US","isp":"Google LLC","domain":"google.com","total_reports":140,"last_reported_at":"2025-12-29T02:57:13Z","is_whitelisted":true,"is_tor":false,"source":"abuseipdb"}Try It
/country/{code?}Get country information. Without code returns all countries. With code returns specific country details.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
code | string | No | ISO 2-letter country code. Empty = all countries. |
format | query | No | Use "compact" for smaller payload (list mode only) |
Example Requests
# All countries curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/country/list # Compact format curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/country/list?format=compact" # Single country curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/country/ES
Response (single)
{"code":"ES","name":"Spain","native_name":"España","flag":"🇪🇸","dial_code":"+34","currency":"EUR","languages":["es"],"capital":"Madrid","region":"Europe"}Try It
/trade-blocs/{code?}Trade, customs and travel bloc membership for a country, plus the territorial exclusions that override it. Built for shipping and tax logic: deciding whether a consignment needs a customs declaration, which duty regime applies, and whether a postal code falls outside its country's VAT territory. Sources are the EU VAT Directive, the Union Customs Code and the founding treaties of each bloc. Kept separate from /country/ so that ordinary country lookups stay small.
Modes
| Request | Returns |
|---|---|
/trade-blocs/ES | One country: blocs and bloc_exclusions |
/trade-blocs/ | All countries with membership, without exclusions |
/trade-blocs/?bloc=EU_VAT | Only countries belonging to one bloc |
/trade-blocs/exclusions | Every territorial exclusion in one response |
/trade-blocs/reference | All bloc tokens with their legal basis |
Bloc tokens
| Token | Meaning |
|---|---|
EU | European Union membership (27) |
EU_VAT | Territory where the VAT Directive applies. This is the field that decides whether a declaration is needed |
EU_CUSTOMS | Customs territory of the Union. Wider than EU_VAT: the Canary Islands sit inside it but outside the VAT territory |
EU_CU_ASSOC | Bilateral customs union with the EU (Türkiye, Andorra, San Marino). A declaration is still required; only the duty changes, via an A.TR or EUR.1 certificate |
EU_VAT_GOODS | Aligned with EU VAT rules for goods only. Applies to Northern Ireland |
EEA | European Economic Area (30). Switzerland is not a member |
SCHENGEN | Schengen Area (29). Affects transit times, not customs |
EAEU | Eurasian Economic Union (5) |
USMCA | United States, Mexico, Canada |
MERCOSUR | Argentina, Brazil, Paraguay, Uruguay; Bolivia transitional |
GCC | Gulf Cooperation Council (6). Intra-GCC movements still need a unified statistical declaration |
CH_LI | Switzerland and Liechtenstein customs union |
Example Requests
# One country curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/trade-blocs/ES # Everything you need to cache locally curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/trade-blocs/ curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/trade-blocs/exclusions # Countries inside the EU VAT territory curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/trade-blocs/?bloc=EU_VAT"
Response (single)
{"code":"ES","blocs":["EEA","EU","EU_CUSTOMS","EU_VAT","SCHENGEN"],"bloc_exclusions":[{"country":"ES","name":"Canary Islands","postal_prefixes":["35","38"],"excluded_from":["EU_VAT"],"included_in":[]},{"country":"ES","name":"Ceuta","postal_prefixes":["51"],"excluded_from":["EU_VAT","EU_CUSTOMS"],"included_in":[]}]}Deciding whether a shipment needs customs clearance
No declaration is required only when all three conditions hold: both countries carry EU_VAT; neither address falls under an exclusion listing EU_VAT in excluded_from; and a postal code was resolved for both addresses. If a postal code is missing or unrecognised, treat the shipment as requiring clearance — absent data must never be read as a clean route. Match postal codes on the longest prefix after stripping spaces and hyphens.
// Madrid -> Berlin both EU_VAT, no exclusion -> no declaration // Madrid -> Las Palmas (35001) ES excluded from EU_VAT -> declaration // Berlin -> Istanbul TR is EU_CU_ASSOC -> declaration + A.TR // London -> Belfast (BT1) both GB, one is BT -> declaration
Both blocs and bloc_exclusions are always present. An empty array means no membership, never missing data. Cache /trade-blocs/ and /trade-blocs/exclusions locally and refresh them occasionally — the data changes only when treaties do.
Try It
/geo/countriesGet countries with detailed geographic data from GeoNames. Supports filtering.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
iso | string | No | Filter by ISO 2-letter code |
iso3 | string | No | Filter by ISO 3-letter code |
name | string | No | Search by name |
lang | string | No | Language code for localized names |
continent | string | No | Filter: EU, AS, NA, SA, AF, OC, AN |
currency | string | No | Filter by currency code |
phone | string | No | Filter by phone code |
tld | string | No | Filter by TLD domain |
Example Requests
# All countries curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/geo/countries # European countries curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/geo/countries?continent=EU" # Single country by ISO curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/geo/countries?iso=ES"
Response
{"count":1,"countries":[{"iso":"ES","iso3":"ESP","iso_numeric":"724","name":"Spain","capital":"Madrid","continent":"EU","continent_name":"Europe","population":46723749,"currency_code":"EUR","currency_name":"Euro","phone":"34","tld":".es"}]}Try It
/geo/regionsGet regions/states/provinces for a country.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
country | string | Yes | ISO 2-letter country code |
code | string | No | Filter by region code |
name | string | No | Search by name |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/geo/regions?country=ES"
Response
{"count":19,"regions":[{"name":"Andalusia","asciiname":"Andalusia","country_code":"ES","country_iso3":"ESP","country_name":"Spain","admin1_code":"51","latitude":37.5,"longitude":-4.58333,"population":8631862,"timezone":"Europe/Madrid"},...]}Try It
/geo/citiesGet cities for a country with pagination. Includes postal codes.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
country | string | Yes | ISO 2-letter country code |
iso3 | string | No | ISO 3-letter country code |
admin1 | string | No | Filter by region code |
name | string | No | Search by city name |
limit | int | No | Results per page (default: 100, max: 1000) |
offset | int | No | Skip N results |
short | bool | No | Return minimal fields (true/false) |
Example Requests
# Basic request with limit curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/geo/cities?country=ES&limit=10" # Search by city name curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/geo/cities?country=ES&name=Madrid" # Filter by region code curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/geo/cities?country=ES&admin1=29" # Short format (minimal fields) curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/geo/cities?country=ES&short=true&limit=100"
Response
{"count":2,"total":30871,"limit":2,"offset":0,"cities":[{"name":"Madrid","asciiname":"Madrid","admin1_code":"29","admin1_name":"Comunidad de Madrid","latitude":40.4165,"longitude":-3.70256,"population":3255944,"timezone":"Europe/Madrid","continent_name":"Europe","phone_code":"34","currency_code":"EUR","currency_name":"Euro","tld":".es","postal_codes":["28001","28002",...]},...]}Try It
/currency/rates/{base?}Get current exchange rates. Base defaults to EUR.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
base | string | No | Base currency (default: EUR) |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/currency/rates/EUR
Response
{"base":"EUR","date":"2025-12-29","rates":{"USD":1.04,"GBP":0.83,"JPY":164.5,...}}Try It
/currency/convertConvert amount from one currency to another.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
from | string | Yes | Source currency code |
to | string | Yes | Target currency code |
amount | number | Yes | Amount to convert |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/currency/convert?from=USD&to=EUR&amount=100"
Response
{"from":"USD","to":"EUR","amount":100,"result":96.15,"rate":0.9615}Try It
/currency/historyGet historical exchange rates for a specific date.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
base | string | No | Base currency (default: EUR) |
date | string | Yes | Date in YYYY-MM-DD format |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/currency/history?base=EUR&date=2025-12-01"
Response
{"base":"EUR","date":"2025-12-01","rates":{"USD":1.05,"GBP":0.84,...}}Try It
/currency/list/{code?}Get currency info with symbol, flag and ISO 4217 minor units. Without code returns all currencies.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
code | string | No | Currency code. Empty = all currencies. |
Example Requests
# All currencies curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/currency/list/ # Single currency curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/currency/list/EUR
Response (single)
{"code":"EUR","name":"Euro","symbol":"€","flag":"🇪🇺","decimals":2}Response Fields
| Name | Type | Description |
|---|---|---|
code | string | ISO 4217 currency code |
name | string | Currency name in English |
symbol | string | Currency symbol |
flag | string | Flag emoji of the issuing country |
decimals | integer | ISO 4217 minor units — number of digits after the decimal separator. 0 for JPY, KRW, VND and 13 others; 3 for KWD, BHD, JOD and 4 others; 2 for the remaining 132. Use it to round and display amounts returned by /currency/convert. |
Try It
/vat/rates/{country}Get VAT rates for a country including standard, reduced, and super-reduced rates.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
country | string | Yes | ISO 2-letter country code |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/vat/rates/ES
Response
{"country_code":"ES","country_name":"Spain","local_name":"IVA","standard_rate":21,"reduced_rates":[10],"super_reduced_rate":4,"parking_rate":null,"updated_at":"2025-12-03"}Try It
/vat/rates/batch?countries={codes}VAT rates for up to 250 countries in one call, charged as one request. Same data as /vat/rates/{country}, reduced to the rate fields and keyed by country code. Countries without data, and codes in a wrong format, are listed in missing instead of failing the whole request.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
countries | query | Yes | ISO 3166-1 alpha-2 codes separated by commas, case-insensitive, up to 250. Duplicates are ignored |
Response Fields
| Field | Description |
|---|---|
countries.{code}.standard_rate | Standard rate, percent |
countries.{code}.reduced_rates | Reduced rates, percent; empty array when there are none |
countries.{code}.super_reduced_rate | Super-reduced rate, percent, or null |
countries.{code}.parking_rate | Parking rate, percent, or null |
countries.{code}.local_name | Local name of the tax (MwSt, IVA, TVA) |
missing | Requested codes with no data or a wrong format; always present |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/vat/rates/batch?countries=DE,FR,ES,US"
Response
{"countries":{"DE":{"standard_rate":19,"reduced_rates":[7],"super_reduced_rate":null,"parking_rate":null,"local_name":"MwSt"},"ES":{"standard_rate":21,"reduced_rates":[10],"super_reduced_rate":4,"parking_rate":null,"local_name":"IVA"},"FR":{"standard_rate":20,"reduced_rates":[10,5.5],"super_reduced_rate":2.1,"parking_rate":null,"local_name":"TVA"}},"missing":["US"]}Errors
| Code | When |
|---|---|
| 400 | countries is empty, or holds more than 250 codes |
Try It
/docpacks/schemaDocument rules pack format: the JSON Schema every pack follows, the canonical field dictionary, the closed lists (document categories, statuses, filters, checksums, rate sources) and how packs are signed, with the public key. Call it when the plugin is installed and when the schema version changes.
Response Fields
| Field | Description |
|---|---|
schema | JSON Schema 2020-12 of a pack |
fields | Canonical field dictionary (EN 16931 business terms plus extensions) |
registries | Closed lists with their version |
signature.algorithm | ecdsa-p256-sha256 |
signature.signed | What is signed: the UTF-8 bytes of meta.hash |
signature.hash | How meta.hash is computed |
signature.public_key | PEM public key that verifies every pack |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/docpacks/schema"
Response (live, shortened)
{
"schema": "{… JSON Schema 2020-12 …}",
"fields": "{… canonical field dictionary …}",
"registries": "{… closed lists …}",
"signature": {
"algorithm": "ecdsa-p256-sha256",
"format": "ecdsa-p256:<base64 ASN.1 DER>",
"hash": "sha256 of the pack JSON without meta.hash, meta.signature, meta.published_at and meta.next_check_after; object keys sorted, no whitespace",
"public_key": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECdU3gkef1gpmcm6LkNpYpbg6vzTv\nBPcW6IHIKSENETp1MlZVzrNqWZ5Wlyp32JsIwZrX85P4gqP6aa3L/soq/A==\n-----END PUBLIC KEY-----\n",
"signed": "UTF-8 bytes of meta.hash"
}
}Errors
| Code | When |
|---|---|
| 503 | signer_unavailable: the public key could not be read, retry later |
Try It
/docpacks/indexJurisdictions that have published rules: subdivisions and special territories, seller profiles (entity types and tax regimes), the current version and hash of the country rules, coverage and the outgoing hosts of government channels.
Response Fields
| Field | Description |
|---|---|
count | Number of jurisdictions |
jurisdictions[].jurisdiction | ISO 3166-1 alpha-2 code |
jurisdictions[].version, hash | Version and hash of the published country layer |
jurisdictions[].coverage | full, rules_only (no channels, formats or returns) or none |
jurisdictions[].missing | Sections absent from the country rules |
jurisdictions[].subdivisions, territories | ISO 3166-2 subdivisions and special territories with own rules |
jurisdictions[].entity_types, tax_regimes | Seller profiles: id and label |
jurisdictions[].hosts | Hosts of the government channels, for the plugin's allowed outgoing hosts |
jurisdictions[].published_at | When the country rules were published |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/docpacks/index"
Response (live, shortened)
{
"count": 7,
"jurisdictions": [
{
"jurisdiction": "BE",
"version": "2026.10.1",
"hash": "sha256:d7924dbe58a8dd06f1e5af053cd3a058c7b8de3b61bd5582bdb2cc50c13d8b02",
"coverage": "rules_only",
"missing": [
"numbering",
"integrity",
"… 6 more"
],
"subdivisions": [],
"territories": [],
"entity_types": [
{
"id": "company",
"label": {
"en": "Company (legal person)",
"fr": "Société (personne morale)",
"nl": "Vennootschap (rechtspersoon)"
}
},
{
"id": "sole_trader",
"label": {
"en": "Sole proprietorship (natural person)",
"fr": "Entreprise individuelle (personne physique)",
"nl": "Eenmanszaak (natuurlijke persoon)"
}
}
],
"tax_regimes": [
{
"id": "standard",
"label": {
"en": "Standard VAT regime",
"fr": "Régime normal de TVA",
"nl": "Normale btw-regeling"
}
},
{
"id": "small_business",
"label": {
"en": "Small enterprise VAT exemption scheme (franchise)",
"fr": "Régime de la franchise des petites entreprises",
"nl": "Vrijstellingsregeling voor kleine ondernemingen"
}
},
"… 1 more"
],
"hosts": [
"ec.europa.eu"
],
"published_at": "2026-10-24T14:35:58.085428Z"
},
{
"jurisdiction": "ES",
"version": "2026.10.1",
"hash": "sha256:6cf99431db497b7f7f81e5e85015986aa840a80647d148a4b0d4e6274189c5fe",
"coverage": "full",
"missing": [
"pos",
"trade",
"… 1 more"
],
"subdivisions": [
"ES-BI",
"ES-SS",
"… 1 more"
],
"territories": [
"CE",
"CN",
"… 1 more"
],
"entity_types": [
{
"id": "company",
"label": {
"en": "Company (legal person: S.A., S.L. and other entities)",
"es": "Sociedad / persona jurídica"
}
},
{
"id": "sole_trader",
"label": {
"en": "Sole trader (autónomo, natural person)",
"es": "Empresario o profesional persona física (autónomo)"
}
}
],
"tax_regimes": [
{
"id": "standard",
"label": {
"en": "General VAT regime",
"es": "Régimen general del IVA"
}
},
{
"id": "recargo_equivalencia",
"label": {
"en": "Equivalence surcharge special regime (retailers)",
"es": "Régimen especial del recargo de equivalencia"
}
},
"… 1 more"
],
"hosts": [
"ec.europa.eu",
"sede.agenciatributaria.gob.es",
"… 2 more"
],
"published_at": "2026-10-24T14:35:58.699694Z"
},
"… 5 more"
]
}Errors
| Code | When |
|---|---|
| 401 | Missing or invalid API key |
| 402 | Not enough credits |
Try It
/docpacks/batchAssembled, signed rules packs for up to 100 addresses (country, optional subdivision or CC:TERRITORY, seller profile) in one request, charged as one request. Pass have_hash to get {"unchanged": true} instead of a pack you already have. Every rule carries origin, the layer it came from.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
items[].jurisdiction | body | Yes | ISO 3166-1 alpha-2, or CC:TERRITORY (e.g. ES:CN) |
items[].subdivision | body | No | ISO 3166-2 of the same country (e.g. US-CA); not together with a territory |
items[].profile.entity_type | body | Yes | Id from index |
items[].profile.tax_regime | body | Yes | Id from index |
items[].have_hash | body | No | Hash of the pack the caller has |
Response Fields
| Field | Description |
|---|---|
items[].hash | Hash of the current pack (sha256:…) |
items[].pack | The pack; absent when unchanged |
items[].unchanged | true when have_hash equals the current hash |
items[].warning, missing | coverage_rules_only and the absent sections: documents can be issued and stored, not transmitted |
items[].error, message | Per item: unknown_jurisdiction, profile_not_supported, pack_unavailable, bad_request |
pack.meta.hash, pack.meta.signature | Verify with the public key from /docpacks/schema before use |
pack.meta.next_check_after | Do not ask again before this time |
Example Request
curl -H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" -X POST "https://baas.dapita.net/docpacks/batch" \
-d '{"items": [{"jurisdiction": "ES", "profile": {"entity_type": "company", "tax_regime": "standard"}}, {"jurisdiction": "US", "subdivision": "US-CA", "profile": {"entity_type": "company", "tax_regime": "standard"}}]}'Response (live, shortened)
{
"items": [
{
"hash": "sha256:7594bd79718ec2a7823300d2b040b1b1c9c9d7c7c5e7ca8e426db9cebf3f9a67",
"jurisdiction": "ES",
"pack": {
"meta": {
"coverage": "full",
"currency": {
"local": "EUR"
},
"hash": "sha256:7594bd79718ec2a7823300d2b040b1b1c9c9d7c7c5e7ca8e426db9cebf3f9a67",
"jurisdiction": "ES",
"languages": [
"es",
"en"
],
"layers": [
{
"key": "ES/country",
"version": "2026.10.1"
}
],
"missing": [
"pos",
"trade",
"… 1 more"
],
"next_check_after": "2026-10-25T14:36:01Z",
"profile": {
"entity_type": "company",
"tax_regime": "standard"
},
"published_at": "2026-10-24T14:36:01Z",
"signature": "ecdsa-p256:MEQCIEhTwN9+2M4QBfDXwB3XB7U8UcVJAJ831D2qiX2LrMz2AiBEZopyzWGICY7rIabQQYzSFDpPpQcOH53buA3XYF4E/Q==",
"sources": [
{
"checked_at": "2026-10-24",
"id": "boe_liva",
"title": {
"en": "Ley 37/1992 del Impuesto sobre el Valor Añadido (consolidated text, last update 07/10/2026)",
"es": "Ley 37/1992, de 28 de diciembre, del Impuesto sobre el Valor Añadido (texto consolidado)"
},
"url": "https://www.boe.es/eli/es/l/1992/12/28/37/con"
},
{
"checked_at": "2026-10-24",
"id": "boe_rdl_20_2012",
"title": {
"en": "Real Decreto-ley 20/2012 (VAT 18->21 % and 8->10 % from 1 September 2012)",
"es": "Real Decreto-ley 20/2012, de 13 de julio"
},
"url": "https://www.boe.es/buscar/act.php?id=BOE-A-2012-9364"
},
"… 34 more"
],
"version": "2026.10.1"
},
"profiles": {
"entity_types": [
{
"effective_from": "2008-07-01",
"id": "company",
"identifiers": [
{
"ref": "identifiers.es_nif"
}
],
"issues": [
{
"ref": "document_types.invoice"
},
{
"ref": "document_types.simplified_invoice"
},
"… 1 more"
],
"label": {
"en": "Company (legal person: S.A., S.L. and other entities)",
"es": "Sociedad / persona jurídica"
},
"origin": "ES/country",
"source": "boe_nif_entities"
},
{
"effective_from": "2008-07-01",
"id": "sole_trader",
"identifiers": [
{
"ref": "identifiers.es_nif"
}
],
"issues": [
{
"ref": "document_types.invoice"
},
{
"ref": "document_types.simplified_invoice"
},
"… 1 more"
],
"label": {
"en": "Sole trader (autónomo, natural person)",
"es": "Empresario o profesional persona física (autónomo)"
},
"origin": "ES/country",
"source": "aeat_nif_fisica"
}
],
"tax_regimes": [
{
"effective_from": "2012-09-01",
"id": "standard",
"label": {
"en": "General VAT regime",
"es": "Régimen general del IVA"
},
"origin": "ES/country",
"source": "boe_liva",
"thresholds": [
{
"ref": "thresholds.large_company"
}
]
},
{
"effective_from": "2025-01-01",
"entity_types": [
"sole_trader"
],
"id": "recargo_equivalencia",
"label": {
"en": "Equivalence surcharge special regime (retailers)",
"es": "Régimen especial del recargo de equivalencia"
},
"origin": "ES/country",
"source": "aeat_re_regime"
},
"… 1 more"
]
},
"document_types": [
{
"category": "invoice",
"code": "F1",
"corrections": [
{
"doc_type": "corrective_invoice",
"id": "rectificativa",
"reason_codes": [
"R1",
"R2",
"… 2 more"
],
"reason_required": true
}
],
"effective_from": "2012-12-01",
"id": "invoice",
"issuer": "seller",
"label": {
"en": "Invoice (full)",
"es": "Factura completa u ordinaria"
},
"legal_texts": [
{
"ref": "legal_texts.reverse_charge"
},
{
"ref": "legal_texts.exempt"
},
"… 3 more"
],
"mandatory_when": {
"any": [
{
"field": "buyer.type",
"is": "eq",
"value": "business"
},
{
"field": "buyer.type",
"is": "eq",
"value": "government"
}
]
},
"numbering": {
"ref": "numbering.invoice"
},
"origin": "ES/country",
"outputs": [
{
"ref": "formats.pdf"
},
{
"ref": "formats.spfe_ubl"
}
],
"required_fields": [
{
"field": "doc.number"
},
{
"field": "doc.issue_date"
},
"… 13 more"
],
"retention": {
"ref": "retention.invoices"
},
"source": "boe_rd1619",
"transmission": [
{
"channel": {
"ref": "channels.sii"
},
"deadline": {
"calendar": "business",
"days": 4,
"from": "doc.issue_date",
"holidays": "baas.holidays"
},
"required_when": {
"field": "settings.transmission_mode",
"is": "eq",
"value": "sii"
},
"timing": "after_delivery"
},
{
"channel": {
"ref": "channels.verifactu"
},
"required_when": {
"all": [
{
"field": "settings.transmission_mode",
"is": "eq",
"value": "verifactu"
},
{
"field": "doc.issue_date",
"is": "gte",
"value": "2027-01-01"
},
"… 1 more"
]
}
}
]
},
{
"category": "simplified_invoice",
"code": "F2",
"corrections": [
{
"doc_type": "corrective_simplified",
"id": "rectificativa_simplificada",
"reason_codes": [
"R5"
],
"reason_required": true
}
],
"effective_from": "2012-12-01",
"id": "simplified_invoice",
"issuer": "seller",
"label": {
"en": "Simplified invoice",
"es": "Factura simplificada"
},
"legal_texts": [
{
"ref": "legal_texts.reverse_charge"
},
{
"ref": "legal_texts.exempt"
},
"… 1 more"
],
"limits": [
{
"else": "convert_to:invoice",
"field": "totals.total",
"is": "lte",
"value": "400.00"
}
],
"numbering": {
"ref": "numbering.simplified"
},
"origin": "ES/country",
"outputs": [
{
"ref": "formats.pdf"
}
],
"required_fields": [
{
"field": "doc.number"
},
{
"field": "doc.issue_date"
},
"… 7 more"
],
"retention": {
"ref": "retention.invoices"
},
"source": "boe_rd1619",
"transmission": [
{
"channel": {
"ref": "channels.sii"
},
"deadline": {
"calendar": "business",
"days": 4,
"from": "doc.issue_date",
"holidays": "baas.holidays"
},
"required_when": {
"field": "settings.transmission_mode",
"is": "eq",
"value": "sii"
},
"timing": "after_delivery"
},
{
"channel": {
"ref": "channels.verifactu"
},
"required_when": {
"all": [
{
"field": "settings.transmission_mode",
"is": "eq",
"value": "verifactu"
},
{
"field": "doc.issue_date",
"is": "gte",
"value": "2027-01-01"
},
"… 1 more"
]
}
}
]
},
"… 4 more"
],
"taxes": {
"exemptions": [
{
"basis": {
"en": "Exempt under article 20 of Ley 37/1992",
"es": "Exenta por el artículo 20 de la Ley 37/1992"
},
"code": "E1",
"effective_from": "2024-10-29",
"id": "e1",
"legal_text": {
"ref": "legal_texts.exempt"
},
"origin": "ES/country",
"source": "boe_hac1177"
},
{
"basis": {
"en": "Exempt under article 21 of Ley 37/1992 (exports)",
"es": "Exenta por el artículo 21 de la Ley 37/1992"
},
"code": "E2",
"effective_from": "2024-10-29",
"id": "e2",
"legal_text": {
"ref": "legal_texts.export"
},
"origin": "ES/country",
"source": "boe_hac1177"
},
"… 4 more"
],
"kinds": [
{
"effective_from": "2012-09-01",
"id": "vat",
"label": {
"en": "Value added tax (IVA)",
"es": "Impuesto sobre el Valor Añadido (IVA)"
},
"level": "country",
"origin": "ES/country",
"payer": "seller",
"separate_line": true,
"source": "boe_rd1619"
}
],
"rates": [
{
"applies_to": {
"product_tax_class": [
"standard"
]
},
"category": "S",
"effective_from": "2012-09-01",
"id": "vat_standard",
"kind": "vat",
"origin": "ES/country",
"rate": "21.00",
"source": "boe_rdl_20_2012"
},
{
"applies_to": {
"product_tax_class": [
"reduced"
]
},
"category": "S",
"effective_from": "2025-01-01",
"id": "vat_reduced",
"kind": "vat",
"origin": "ES/country",
"rate": "10.00",
"source": "aeat_iva_rates_2025"
},
"… 2 more"
],
"selection": [
{
"effective_from": "2012-12-01",
"id": "intra_eu_goods_b2b",
"order": 1,
"origin": "ES/country",
"result": {
"category": "K",
"exemption": {
"ref": "exemptions.e5"
},
"legal_text": {
"ref": "legal_texts.intra_eu_supply"
}
},
"source": "boe_rd1619",
"when": {
"all": [
{
"field": "supply.type",
"is": "eq",
"value": "goods"
},
{
"field": "buyer.type",
"is": "eq",
"value": "business"
},
"… 2 more"
]
}
},
{
"effective_from": "2012-12-01",
"id": "export_goods",
"order": 2,
"origin": "ES/country",
"result": {
"category": "G",
"exemption": {
"ref": "exemptions.e2"
},
"legal_text": {
"ref": "legal_texts.export"
}
},
"source": "boe_rd1619",
"when": {
"all": [
{
"field": "supply.type",
"is": "eq",
"value": "goods"
},
{
"field": "delivery.address.country",
"is": "not_in",
"value": [
"ES",
"AT",
"… 25 more"
]
}
]
}
},
"… 2 more"
],
"thresholds": [
{
"consequence": "change_regime",
"effective_from": "2017-07-01",
"id": "large_company",
"measure": "sales_amount",
"origin": "ES/country",
"period": "previous_year",
"source": "aeat_gran_empresa_sii",
"value": "6010121.04"
}
]
},
"channels": [
{
"auth": {
"certificate": {
"ref": "signatures.aeat_certificate"
},
"type": "mtls"
},
"batch": {
"max_items": 10000
},
"effective_from": "2017-07-01",
"environments": {
"prod": "https://www1.agenciatributaria.gob.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP",
"test": "https://www7.aeat.es/wlpl/SSII-FACT/ws/fe/SiiFactFEV1SOAP"
},
"errors": [
{
"canonical": "malformed_request",
"code": "soapenv:Client",
"fix": {
"en": "Read the faultstring, correct the message and resend",
"es": "Revise el faultstring, corrija y reenvíe"
},
"message": {
"en": "Malformed message or incorrect data",
"es": "Mensaje mal formado o datos incorrectos"
}
},
{
"canonical": "server_error",
"code": "soapenv:Server",
"fix": {
"en": "Resend the message",
"es": "Reenvíe el mensaje"
},
"message": {
"en": "Server-side error",
"es": "Error del servidor"
}
}
],
"id": "sii",
"model": "real_time_reporting",
"offline": {
"max_delay": {
"days": 4
},
"queue": true
},
"operations": {
"submit": {
"port": "SuministroFactEmitidas",
"wsdl": "SuministroFactEmitidas.wsdl"
}
},
"origin": "ES/country",
"protocol": "soap",
"source": "aeat_sii_ws",
"status_map": [
{
"canonical": "accepted",
"external": "Aceptada"
},
{
"canonical": "accepted_with_errors",
"external": "Aceptada con errores"
},
"… 1 more"
]
},
{
"auth": {
"certificate": {
"ref": "signatures.aeat_certificate"
},
"type": "mtls"
},
"batch": {
"max_items": 1000
},
"effective_from": "2024-10-29",
"id": "verifactu",
"model": "real_time_reporting",
"offline": {
"queue": true,
"retry": {
"backoff_seconds": [
3600
]
}
},
"origin": "ES/country",
"protocol": "soap",
"rate_limit": {
"per_minute": 1
},
"source": "boe_hac1177"
},
"… 2 more"
],
"test_vectors": [
{
"description": "Domestic B2C sale of one standard-rated item, simplified invoice under 400 EUR",
"expect": {
"tax": {
"S": {
"21.00": {
"amount": "21.00",
"taxable_amount": "100.00"
}
}
},
"totals": {
"net": "100.00",
"tax": "21.00",
"total": "121.00"
}
},
"id": "b2c_simplified_21",
"input": {
"buyer": {
"type": "consumer"
},
"doc": {
"currency": "EUR",
"issue_date": "2026-10-24",
"type": "simplified_invoice"
},
"lines": [
{
"net_amount": "100.00",
"net_price": "50.00",
"product_tax_class": "standard",
"quantity": "2"
}
],
"seller": {
"entity_type": "company",
"tax_id": "B12345674",
"tax_regime": "standard"
},
"supply": {
"type": "goods"
}
}
},
{
"description": "Domestic B2B full invoice with 21 % and 10 % lines",
"expect": {
"tax": {
"S": {
"10.00": {
"amount": "5.00",
"taxable_amount": "50.00"
},
"21.00": {
"amount": "42.00",
"taxable_amount": "200.00"
}
}
},
"totals": {
"net": "250.00",
"tax": "47.00",
"total": "297.00"
}
},
"id": "b2b_domestic_mixed_rates",
"input": {
"buyer": {
"address": {
"country": "ES"
},
"name": "Cliente SA",
"tax_id": "A87654321",
"type": "business"
},
"doc": {
"currency": "EUR",
"issue_date": "2026-10-24",
"type": "invoice"
},
"lines": [
{
"net_amount": "200.00",
"net_price": "200.00",
"product_tax_class": "standard",
"quantity": "1"
},
{
"net_amount": "50.00",
"net_price": "10.00",
"product_tax_class": "reduced",
"quantity": "5"
}
],
"seller": {
"entity_type": "company",
"tax_id": "B12345674",
"tax_regime": "standard"
},
"supply": {
"type": "goods"
}
}
},
"… 4 more"
],
"…": "also: changes, fields, formats, identifiers, integrity, legal_texts, numbering, obligations, payments, retention, signatures"
},
"profile": {
"entity_type": "company",
"tax_regime": "standard"
}
},
{
"hash": "sha256:df8e15dbe681ecc2ad993f62364f9b43cd5252ce80cae29f4b6e13bb97b5b2af",
"jurisdiction": "US",
"pack": {
"meta": {
"coverage": "full",
"currency": {
"local": "USD"
},
"hash": "sha256:df8e15dbe681ecc2ad993f62364f9b43cd5252ce80cae29f4b6e13bb97b5b2af",
"jurisdiction": "US",
"languages": [
"en"
],
"layers": [
{
"key": "US/country",
"version": "2026.10.1"
},
{
"key": "US/subdivision/US-CA",
"version": "2026.10.1"
}
],
"missing": [
"numbering",
"integrity",
"… 5 more"
],
"next_check_after": "2026-10-25T14:36:02Z",
"profile": {
"entity_type": "company",
"tax_regime": "standard"
},
"published_at": "2026-10-24T14:36:02Z",
"signature": "ecdsa-p256:MEYCIQCGhg5myA9A7w0wKjAR93mvIQkdYl0I8KURF4TG34nVGwIhAJqIn1iBD1jazRUEX6wRYmdMpMv8G1T+rmm/oa9grfcp",
"sources": [
{
"checked_at": "2026-10-24",
"id": "irs_iw2w3",
"title": {
"en": "IRS, General Instructions for Forms W-2 and W-3 (2026), Taxpayer identification numbers (TINs)"
},
"url": "https://www.irs.gov/instructions/iw2w3"
},
{
"checked_at": "2026-10-24",
"id": "irs_records_kind",
"title": {
"en": "IRS, What kind of records should I keep"
},
"url": "https://www.irs.gov/businesses/small-businesses-self-employed/what-kind-of-records-should-i-keep"
},
"… 10 more"
],
"subdivision": "US-CA",
"version": "2026.10.1"
},
"profiles": {
"entity_types": [
{
"effective_from": "2026-10-24",
"id": "company",
"identifiers": [
{
"ref": "identifiers.ein"
}
],
"issues": [
{
"ref": "document_types.invoice"
},
{
"ref": "document_types.credit_note"
},
"… 1 more"
],
"label": {
"en": "Company (corporation, S corporation or limited liability company)"
},
"origin": "US/subdivision/US-CA",
"receives": [
{
"ref": "document_types.resale_certificate"
}
],
"source": "ca_reg_1668"
},
{
"effective_from": "2026-10-24",
"id": "sole_proprietor",
"issues": [
{
"ref": "document_types.invoice"
},
{
"ref": "document_types.credit_note"
},
"… 1 more"
],
"label": {
"en": "Sole proprietorship"
},
"origin": "US/subdivision/US-CA",
"receives": [
{
"ref": "document_types.resale_certificate"
}
],
"source": "ca_reg_1668"
}
],
"tax_regimes": [
{
"effective_from": "2026-10-24",
"id": "standard",
"label": {
"en": "Standard (state sales and use tax rules of the selling state apply)"
},
"origin": "US/country",
"source": "irs_business_structures"
}
]
},
"document_types": [
{
"category": "invoice",
"code": "380",
"corrections": [
{
"doc_type": "credit_note",
"id": "credit_note"
}
],
"effective_from": "2003-01-01",
"id": "invoice",
"issuer": "seller",
"label": {
"en": "Invoice"
},
"origin": "US/subdivision/US-CA",
"outputs": [
{
"ref": "formats.pdf"
}
],
"retention": {
"ref": "retention.ca_records"
},
"source": "ca_reg_1698"
},
{
"category": "credit_note",
"code": "381",
"effective_from": "2003-01-01",
"id": "credit_note",
"issuer": "seller",
"label": {
"en": "Credit memo"
},
"origin": "US/subdivision/US-CA",
"outputs": [
{
"ref": "formats.pdf"
}
],
"retention": {
"ref": "retention.ca_records"
},
"source": "ca_reg_1698"
},
"… 2 more"
],
"taxes": {
"exemptions": [
{
"basis": {
"en": "Sale for resale, supported by a timely resale certificate taken in good faith (Regulation 1668)"
},
"code": "resale",
"effective_from": "2026-10-24",
"id": "ca_resale",
"origin": "US/subdivision/US-CA",
"source": "ca_reg_1668"
}
],
"kinds": [
{
"effective_from": "2017-01-01",
"id": "ca_sales_use_tax",
"label": {
"en": "California sales and use tax"
},
"level": "subdivision",
"origin": "US/subdivision/US-CA",
"payer": "seller",
"separate_line": true,
"source": "ca_cdtfa_rate_history"
}
],
"rates": [
{
"applies_to": {
"product_tax_class": [
"standard"
]
},
"category": "S",
"effective_from": "2017-01-01",
"id": "ca_statewide_base",
"kind": "ca_sales_use_tax",
"origin": "US/subdivision/US-CA",
"rate": "7.25",
"scope": "US-CA",
"source": "ca_cdtfa_rate_history"
}
],
"selection": [
{
"effective_from": "2019-10-01",
"id": "ca_marketplace_facilitated",
"order": 1,
"origin": "US/subdivision/US-CA",
"result": {
"category": "O"
},
"source": "ca_cdtfa_mpf",
"when": {
"field": "doc.marketplace_facilitated",
"is": "eq",
"value": true
}
}
],
"thresholds": [
{
"consequence": "register",
"effective_from": "2019-04-01",
"id": "ca_nexus_current_year",
"includes": [
"sales of tangible personal property for delivery in California by the retailer and related persons",
"sales facilitated through a marketplace facilitator"
],
"measure": "sales_amount",
"origin": "US/subdivision/US-CA",
"period": "calendar_year",
"scope": "US-CA",
"source": "ca_cdtfa_wayfair",
"value": "500000.00"
},
{
"consequence": "register",
"effective_from": "2019-04-01",
"id": "ca_nexus_preceding_year",
"includes": [
"sales of tangible personal property for delivery in California by the retailer and related persons",
"sales facilitated through a marketplace facilitator"
],
"measure": "sales_amount",
"origin": "US/subdivision/US-CA",
"period": "previous_year",
"scope": "US-CA",
"source": "ca_cdtfa_wayfair",
"value": "500000.00"
}
]
},
"channels": [
{
"effective_from": "2026-10-24",
"id": "no_government_channel",
"model": "none",
"origin": "US/country"
}
],
"test_vectors": [
{
"description": "Taxable sale of goods delivered in US-CA at the state base rate 7.25% only (local taxes not included).",
"expect": {
"tax": {
"amount": "7.25",
"category": "S",
"rate": "7.25",
"taxable_amount": "100.00"
},
"totals": {
"lines_net": "100.00",
"net": "100.00",
"tax": "7.25",
"total": "107.25"
}
},
"id": "taxable_sale_b2c",
"input": {
"buyer": {
"address": {
"country": "US",
"subdivision": "US-CA"
},
"name": "Example Buyer",
"type": "consumer"
},
"delivery": {
"address": {
"country": "US",
"subdivision": "US-CA"
}
},
"doc": {
"category": "invoice",
"currency": "USD",
"issue_date": "2026-11-02",
"type": "invoice"
},
"lines": [
{
"id": "1",
"item_name": "Item 1",
"net_amount": "100.00",
"net_price": "100.00",
"product_tax_class": "standard",
"quantity": "1"
}
],
"seller": {
"address": {
"country": "US",
"subdivision": "US-CA"
},
"entity_type": "company",
"name": "Example Seller",
"tax_regime": "standard"
},
"supply": {
"place_country": "US",
"place_subdivision": "US-CA",
"type": "goods"
}
}
},
{
"description": "Taxable sale to a business without a resale certificate, delivered in US-CA, state base rate 7.25% only.",
"expect": {
"tax": {
"amount": "14.50",
"category": "S",
"rate": "7.25",
"taxable_amount": "200.00"
},
"totals": {
"lines_net": "200.00",
"net": "200.00",
"tax": "14.50",
"total": "214.50"
}
},
"id": "taxable_sale_b2b",
"input": {
"buyer": {
"address": {
"country": "US",
"subdivision": "US-CA"
},
"name": "Example Buyer",
"type": "business"
},
"delivery": {
"address": {
"country": "US",
"subdivision": "US-CA"
}
},
"doc": {
"category": "invoice",
"currency": "USD",
"issue_date": "2026-11-02",
"type": "invoice"
},
"lines": [
{
"id": "1",
"item_name": "Item 1",
"net_amount": "200.00",
"net_price": "200.00",
"product_tax_class": "standard",
"quantity": "1"
}
],
"seller": {
"address": {
"country": "US",
"subdivision": "US-CA"
},
"entity_type": "company",
"name": "Example Seller",
"tax_regime": "standard"
},
"supply": {
"place_country": "US",
"place_subdivision": "US-CA",
"type": "goods"
}
}
}
],
"…": "also: changes, fields, formats, identifiers, legal_texts, obligations, retention"
},
"profile": {
"entity_type": "company",
"tax_regime": "standard"
},
"subdivision": "US-CA"
}
]
}With have_hash:
{
"items": [
{
"hash": "sha256:7594bd79718ec2a7823300d2b040b1b1c9c9d7c7c5e7ca8e426db9cebf3f9a67",
"jurisdiction": "ES",
"profile": {
"entity_type": "company",
"tax_regime": "standard"
},
"unchanged": true
}
]
}Errors
| Code | When |
|---|---|
| 400 | Body is not {"items": [...]}, or has 0 or more than 100 items |
| 401 | Missing or invalid API key |
| 402 | Not enough credits |
Try It
/docpacks/{country}/changes?since={version}Change journal of a jurisdiction after a version: what changed, what it affects (impact) and what the seller must do (action_required). The plugin shows it to the owner and applies auto_fixable changes to templates itself.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
country | path | Yes | ISO 3166-1 alpha-2 |
since | query | No | Version the caller has; only later entries are returned |
Response Fields
| Field | Description |
|---|---|
changes[].version, effective_from | Version and the date it applies |
changes[].summary | Text for people |
changes[].items[].rule, change | Changed rule and the kind of change |
changes[].items[].impact | templates, documents, settings or none |
changes[].items[].action_required, auto_fixable | What the owner must do; whether the plugin can do it |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/docpacks/ES/changes?since=2026.1.0"
Response (live, shortened)
{
"changes": [
{
"effective_from": "2026-10-24",
"items": [],
"layer": "ES/country",
"summary": {
"en": "Initial rules",
"es": "Reglas iniciales"
},
"version": "2026.10.1"
}
],
"jurisdiction": "ES",
"since": "2026.1.0"
}Errors
| Code | When |
|---|---|
| 400 | Invalid country code |
| 401 | Missing or invalid API key |
Try It
/docpacks/assets/batchLarge files referenced by packs (XSD, schematron, trusted lists, base templates) by id, up to 50 per request. Files are base64 in data; cache them by sha256. Files over the 32 MB response budget come back in deferred: ask for them again.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
ids | body | Yes | Asset ids, 1–50 |
Response Fields
| Field | Description |
|---|---|
assets[].asset_id, sha256, media_type, size | File identity |
assets[].data | File content, base64 |
missing | Unknown ids; error is then asset_not_found |
deferred | Ids to request in a next call |
Example Request
curl -H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" -X POST "https://baas.dapita.net/docpacks/assets/batch" \
-d '{"ids":["peppol-bis-envelope-rules-sch"]}'Response (live, shortened)
{
"assets": [
{
"asset_id": "peppol-bis-envelope-rules-sch",
"data": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHNjaGVtYSB4bWxucz0iaHR0cDovL3B1cmwub2NsYy5vcmcvZHNkbC9zY2hlbWF0cm9u… (6284 chars)",
"media_type": "application/xml",
"sha256": "96648791fb824b6b58ddae9cc5575e8298e0061fc43dd0934a0b1459396d76f9",
"size": 4713
}
],
"deferred": [],
"error": "asset_not_found",
"missing": [
"no_such_asset"
]
}Errors
| Code | When |
|---|---|
| 400 | Body is not {"ids": [...]}, 0 or more than 50 ids, or an invalid id |
| 401 | Missing or invalid API key |
Try It
/docpacks/verify-idsChecks counterparty tax numbers in official registers (EU VIES), up to 20 per request. The register is chosen by the identifier's verification channel in the country rules. Results are cached for 24 hours.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
items[].id | body | Yes | Caller's reference, echoed back |
items[].jurisdiction | body | Yes | Country whose rules define the identifier |
items[].identifier | body | Yes | Identifier id from the pack (e.g. vat_id) |
items[].value | body | Yes | The number to check |
Response Fields
| Field | Description |
|---|---|
items[].valid | Whether the register confirms the number |
items[].name, address | Registered name and address when the register returns them |
items[].checked_at, source | When and in which register it was checked |
items[].error | Pattern mismatch, no register for this identifier, or register unavailable |
Example Request
curl -H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" -X POST "https://baas.dapita.net/docpacks/verify-ids" \
-d '{"items": [{"id": "1", "jurisdiction": "BE", "identifier": "vat_id", "value": "BE0403170701"}]}'Response (live, shortened)
{
"items": [
{
"address": "Boulevard Simon Bolivar 36\n1000 Bruxelles",
"checked_at": "2026-10-24T14:36:05Z",
"id": "1",
"name": "SA ELECTRABEL",
"source": "vies",
"valid": true
}
]
}Errors
| Code | When |
|---|---|
| 400 | Body is not {"items": [...]}, or has 0 or more than 20 items |
| 401 | Missing or invalid API key |
Try It
/vat/validate/{vat_number}Validate EU VAT number via VIES service. Rate limited: 1 request per 10 seconds.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
vat_number | string | Yes | VAT number with country prefix (e.g. ESB12345678) |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/vat/validate/ESB12345678
Response
{"valid":true,"country_code":"ES","vat_number":"B12345678","company_name":"Example Company SL","company_address":"Calle Example 123, Madrid"}Try It
/phone/validate/{number}Validate phone number and get carrier information.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
number | string | Yes | Phone number with country code (e.g. +34612345678) |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/phone/validate/+34612345678
Response
{"valid":true,"number":"+34612345678","country_code":"ES","national_number":"612345678","type":"mobile","carrier":"Syma","formatted":{"international":"+34 612 34 56 78","national":"612 34 56 78","e164":"+34612345678"}}Try It
/phone/format/{number}Format phone number in various formats (international, national, E.164).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
number | string | Yes | Phone number with country code |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/phone/format/+34612345678
Response
{"number":"+34612345678","formatted":{"international":"+34 612 34 56 78","national":"612 34 56 78","e164":"+34612345678"}}Try It
/phone/mask/{country}Get phone input mask for a country.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
country | string | Yes | ISO 2-letter country code |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/phone/mask/ES
Response
{"country_code":"ES","country_name":"Spain","dial_code":"+34","mask":"### ## ## ##","example":"+34 810 12 34 56"}Try It
/email/validate/{email}Validate email address with syntax and MX record check. Rate limited: 1 request per 5 seconds.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Email address to validate |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/email/validate/test@gmail.com
Response
{"email":"test@gmail.com","valid":true,"syntax_valid":true,"mx_valid":true,"mx_records":["gmail-smtp-in.l.google.com","alt1.gmail-smtp-in.l.google.com",...],"domain":"gmail.com"}Try It
/timezone/{location}Get timezone information and current time for a location.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
location | string | Yes | IANA timezone identifier (e.g. Europe/Madrid) |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/timezone/Europe/Madrid
Response
{"timezone":"Europe/Madrid","offset":"+01:00","offset_seconds":3600,"current_time":"2025-12-29T12:53:42+01:00","is_dst":false}Try It
/timezonesGet all world timezones with country bindings. Filter by country code.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
country | query | No | ISO 2-letter country code to filter (e.g. ES, RU, US) |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/timezones?country=ES"
Response
{"count":6,"timezones":[{"timezone":"Europe/Madrid","utc_offset":"+01:00","offset_seconds":3600,"countries":[{"code":"ES","name":"Spain"}]},...]}Try It
/business-day/{country}/{date}Check if a date is a business day (not weekend or holiday).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
country | string | Yes | ISO 2-letter country code |
date | string | Yes | Date in YYYY-MM-DD format |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/business-day/ES/2025-12-25
Response
{"date":"2025-12-25","country_code":"ES","is_business_day":false,"is_weekend":false,"is_holiday":true,"holiday_name":"Christmas Day","day_of_week":"Thursday"}Try It
/holiday/{country}/{year}Get public holidays for a country and year.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
country | string | Yes | ISO 2-letter country code |
year | int | Yes | Year (e.g. 2025) |
type | query | No | Filter by holiday type (e.g. Public) |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/holiday/ES/2025
Response
{"country_code":"ES","year":2025,"holidays":[{"date":"2025-01-01","name":"New Year's Day"},{"date":"2025-01-06","name":"Epiphany"},{"date":"2025-12-25","name":"Christmas Day"},...]}Try It
/languagesGet all world languages with country mappings.
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/languages
Response
{"count":279,"languages":[{"code":"aa","name":"Afar","native_name":"Afaraf","family":"Afro-Asiatic","is_regional":false,"countries":[{"country_code":"DJ","is_official":true},...]},...]}Try It
/languages/{code}Get a single language by ISO 639 code.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
code | string | Yes | ISO 639-1 (2-char) or ISO 639-3 (3-char) language code |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/languages/es
Response
{"code":"es","name":"Spanish","native_name":"Español","family":"Indo-European","is_regional":false,"countries":[{"country_code":"ES","is_official":true},{"country_code":"MX","is_official":true},...]}Try It
/languages/search?q={query}Search languages by name, native name, or code.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search query |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/languages/search?q=catalan"
Response
{"count":1,"languages":[{"code":"ca","name":"Catalan","native_name":"Català","family":"Indo-European","is_regional":true,"countries":[{"country_code":"ES","is_official":false},{"country_code":"AD","is_official":true},...]},...]}Try It
/languages/country/{code}Get all languages spoken in a country, including regional and minority languages.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
code | string | Yes | ISO 3166-1 alpha-2 country code |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/languages/country/ES
Response
{"count":8,"languages":[{"code":"es","name":"Spanish","native_name":"Español","family":"Indo-European","is_regional":false,"countries":[{"country_code":"ES","is_official":true}]},{"code":"ca","name":"Catalan","native_name":"Català",...},...]}Try It
/language/detectDetect the language of a text.
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
text | string | Yes | Text to analyze |
Example Request
curl -X POST -H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" \
-d '{"text":"Hola, ¿cómo estás?"}' \
https://baas.dapita.net/language/detectResponse
{"language":"Spanish","code":"es","confidence":0.66}Try It
/useragent/parseParse User-Agent string to get browser, OS, and device information.
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
user_agent | string | Yes | User-Agent string to parse |
Example Request
curl -X POST -H "X-API-Key: YOUR_KEY" -H "Content-Type: application/json" \
-d '{"user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}' \
https://baas.dapita.net/useragent/parseResponse
{"user_agent":"Mozilla/5.0...","browser":"Chrome","browser_version":"120.0","os":"Windows 10/11","os_version":"10.0","device":"PC","is_mobile":false,"is_tablet":false,"is_desktop":true,"is_bot":false}Try It
/whois/{domain}Get WHOIS information for a domain.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain name (e.g. google.com) |
Example Request
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/whois/google.com
Response
{"domain":"google.com","registrar":"MarkMonitor Inc.","created_date":"1997-09-15T04:00:00Z","expiry_date":"2028-09-14T04:00:00Z","updated_date":"2019-09-09T15:39:04Z","name_servers":["ns1.google.com","ns2.google.com","ns3.google.com","ns4.google.com"],"domain_available":false}Try It
/ip-lists/{dataset}?version={version}Official IP ranges in three ready-to-use datasets: verified crawlers and services to exempt from rate limits, known malicious networks to block or challenge, and cloud data centers to rate-limit harder. Ranges come straight from the publishers (Google, Bing, Apple, OpenAI, Stripe, Cloudflare, Spamhaus, AWS and others), are validated, deduplicated and merged into the shortest equivalent list. Collected once a day at 03:00 UTC; a source that fails keeps its previous data, so a dataset is never published empty or truncated.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
dataset | path | Yes | verified-bots, threat-ips or datacenter-ips |
version | query | No | Version you already hold. If it is still current, the answer is only {"version","not_modified":true} (about 100 bytes) |
Datasets
| Dataset | Categories | Use | Size (gzip) |
|---|---|---|---|
verified-bots | search, ai-search, ai-training, payment, cdn | Exempt from rate limits | ~1,250 ranges, ~6 KB |
threat-ips | drop, tor, attack | Block or challenge | ~30,500 ranges, ~140 KB |
datacenter-ips | aws, gcp | Stricter limits, no block | ~4,600 ranges, ~15 KB |
Categories
| Category | Sources |
|---|---|
search | Googlebot, Google special crawlers, Google user-triggered fetchers, Bingbot, Applebot, DuckDuckBot |
ai-search | OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User. Bring visitors from AI answers |
ai-training | GPTBot, CCBot. Collect training data, bring no visitors |
payment | Stripe webhooks |
cdn | Cloudflare. Needed to read the real client IP behind the proxy |
drop | Spamhaus DROP v4 and v6: hijacked and criminal networks |
tor | Tor exit nodes |
attack | blocklist.de, CINS Army: hosts seen attacking SSH, mail and logins |
aws, gcp | Amazon Web Services and Google Cloud ranges |
Example Requests
# Full dataset, gzip curl --compressed -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/ip-lists/verified-bots # Daily refresh: send the version you hold curl --compressed -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/ip-lists/verified-bots?version=ccd368b3331dcaa510ef2fe84507ff4bdc206678d89f2675d7c2216430ce52bf"
Response
{"dataset":"verified-bots","version":"ccd368b3331dcaa510ef2fe84507ff4bdc206678d89f2675d7c2216430ce52bf","updated_at":"2026-10-23T22:10:40Z","sources":{"googlebot":{"category":"search","created":"2026-10-23T14:45:59Z","count":317,"fetched_at":"2026-10-23T22:10:40Z","status":"ok"}},"categories":{"search":["66.249.64.0/27","2001:4860:4801:10::/64"],"ai-search":["..."],"ai-training":["..."],"payment":["..."],"cdn":["..."]}}
# Version unchanged
{"version":"ccd368b3331dcaa510ef2fe84507ff4bdc206678d89f2675d7c2216430ce52bf","not_modified":true}Notes
version is a SHA-256 of the dataset content and changes only when the ranges change. Refresh once a day and store the last answer; a not_modified answer costs one credit like any request. status of a source is stale when its last fetch failed and the previous data is served. Spamhaus data requires attribution, carried in the notice field of its sources. Each category is ready for an nginx geo block or a firewall set.
Try It
/ip-lists/check/{ip}Checks one IPv4 or IPv6 address against all three IP list datasets and returns the most specific matching range of each, with its source. Answered from memory in under a microsecond, no database access. Use it at decision points such as registration, checkout, review forms or admin login; for per-request filtering download the full datasets with /ip-lists/{dataset}.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
ip | path | Yes | IPv4 or IPv6 address |
Example Requests
curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/ip-lists/check/66.249.66.1 curl -H "X-API-Key: YOUR_KEY" https://baas.dapita.net/ip-lists/check/2001:4860:4801:10::1
Response
{"ip":"66.249.66.1","verified_bot":{"category":"search","source":"googlebot","cidr":"66.249.66.0/27"},"threat":null,"datacenter":null}
{"ip":"2.26.97.42","verified_bot":null,"threat":{"category":"tor","source":"tor-exit","cidr":"2.26.97.42/32"},"datacenter":null}Notes
verified_bot, threat and datacenter are always present; null means the address is in no range of that dataset. An invalid address returns 400 {"error":"invalid_ip"}.
Try It
/dns/lookup/{domain}?type={type}DNS lookup for domain. Returns A, AAAA, MX, TXT, CNAME, or NS records. Useful for email validation and domain verification.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain name (e.g. google.com) |
type | query | No | Record type: A, AAAA, MX, TXT, CNAME, NS (default: A) |
Example Request
curl -H "X-API-Key: YOUR_KEY" "https://baas.dapita.net/dns/lookup/google.com?type=MX"
Response
{"domain":"google.com","query_type":"MX","records":[{"host":"smtp.google.com","priority":10}],"count":1}Try It
Usage & Analytics
📈 Requests Over Time
🎯 Requests by Endpoint
⚠️ Errors by Endpoint
| Endpoint | Requests | Errors | Error Rate | Last Error |
|---|---|---|---|---|
| No errors | ||||
📋 Detailed Stats
| Date | Endpoint | Requests | Errors | Avg Response |
|---|---|---|---|---|
| Select a project | ||||
Settings
Billing & Plans
Free ForeverFree
Free Forever
- ✓ 1,000 requests/month
- ✓ 5 requests/hour
- ✓ All 30+ APIs
- ✓ 1 organization
- ✓ 1 project
- ✓ 1 API key
- ✗ IP Whitelist
- ✗ Support
Pay-as-you-go
- ✓ 5,000 requests/month
- ✓ 20 requests/hour
- ✓ All 30+ APIs
- ✓ 3 organizations
- ✓ 3 projects each
- ✓ 3 API keys per project
- ✓ Email support
- +£5 per 5,000 extra
Growth
- ✓ 50,000 requests/month
- ✓ 100 requests/hour
- ✓ All 30+ APIs
- ✓ 10 organizations
- ✓ 10 projects each
- ✓ 10 API keys per project
- ✓ IP Whitelist
- ✓ Priority support
Scale
- ✓ 500,000 requests/month
- ✓ 700 requests/hour
- ✓ All 30+ APIs
- ✓ Unlimited organizations
- ✓ Unlimited projects
- ✓ Unlimited API keys
- ✓ IP Whitelist
- ✓ SLA 99.9%
- ✓ Dedicated support
⚡ API Rate Limits
▼Some APIs have additional per-request limits:
| API | Limit | Reason |
|---|---|---|
/vat/validate | 1 req / 10 sec | External VIES API |
/ip/reputation | 1 req / 60 sec | External AbuseIPDB |
/email/validate | 1 req / 5 sec | SMTP verification |
Enterprise
Custom limits, dedicated infrastructure, SLA guarantees.
Top Up Extra Requests
Need more requests? Purchase extra requests that never expire.
Billing History
| Date | Description | Amount | Status | Invoice |
|---|---|---|---|---|
| No billing history yet | ||||
🔒 Secure payment via Stripe. Cancel anytime. All prices in GBP.