API reference

Generated from docs/openapi.yaml (OpenAPI 3.1.0, API version 1.0.0). Servers: https://api.addrova.eu (Production (EU) — not yet live); http://localhost:8000 (Local development).

Authentication

  • ApiKeyHeader: header X-API-Key.
  • BearerKey: bearer token. The API key as a bearer token
  • ConsoleSession: bearer token. Console session token from /console/v1/auth/verify (not an API key).
  • ApiKeyQuery: query key. Accepted on /compat routes only, for drop-in compatibility. Never logged.

Endpoints

geocoding

GET /v1/geocode

Forward geocoding (query string) · operationId geocodeGet

The address appears in the URL; prefer POST when proxies you do not control may log URLs.

Parameter In Required Type Description
q query yes string (max length 512) Free-text address. Unicode NFC normalised, trimmed.
country query no string (pattern ^[A-Za-z]{2}$) Restrict to one country (ISO 3166-1 alpha-2, case-insensitive).
limit query no integer (min 1, max 20, default 5)

Authentication: ApiKeyHeader, BearerKey.

Status Response
200 Candidates, best first, with attribution — SearchResponse
400 Invalid parameters (invalid_request) — Problem
401 Missing or invalid key (unauthorized) — Problem
429 quota_exceeded (monthly) or rate_limited (per second) — Problem
503 Engine temporarily unavailable (engine_unavailable) — Problem

POST /v1/geocode

Forward geocoding (JSON body, recommended) · operationId geocodePost

Request body (application/json, required): GeocodeRequest

{"q":"4 place d'Armes, Belfort","country":"FR","limit":3}

Authentication: ApiKeyHeader, BearerKey.

Status Response
200 Candidates, best first, with attribution — SearchResponse
400 Invalid parameters (invalid_request) — Problem
401 Missing or invalid key (unauthorized) — Problem
429 quota_exceeded (monthly) or rate_limited (per second) — Problem
503 Engine temporarily unavailable (engine_unavailable) — Problem

GET /v1/reverse

Reverse geocoding · operationId reverse

Parameter In Required Type Description
lat query yes number (min -90, max 90)
lon query yes number (min -180, max 180)
limit query no integer (min 1, max 10, default 1)

Authentication: ApiKeyHeader, BearerKey.

Status Response
200 Candidates, best first, with attribution — SearchResponse
400 Invalid parameters (invalid_request) — Problem
401 Missing or invalid key (unauthorized) — Problem
429 quota_exceeded (monthly) or rate_limited (per second) — Problem
503 Engine temporarily unavailable (engine_unavailable) — Problem

GET /v1/autocomplete

Type-ahead suggestions · operationId autocomplete

Designed for checkout and form fields. Keys used from browsers must declare allowed origins. Pass the same session token for all keystrokes of one input to be billed once per session.

Parameter In Required Type Description
q query yes string (max length 512) Free-text address. Unicode NFC normalised, trimmed.
country query no string (pattern ^[A-Za-z]{2}$) Restrict to one country (ISO 3166-1 alpha-2, case-insensitive).
limit query no integer (min 1, max 10, default 5)
lat query no number (min -90, max 90) Focus point latitude
lon query no number (min -180, max 180) Focus point longitude
session query no string (pattern ^[A-Za-z0-9-]{8,64}$)

Authentication: ApiKeyHeader, BearerKey.

Status Response
200 Candidates, best first, with attribution — SearchResponse
400 Invalid parameters (invalid_request) — Problem
401 Missing or invalid key (unauthorized) — Problem
429 quota_exceeded (monthly) or rate_limited (per second) — Problem

POST /v1/repair

Repair and standardise an address · operationId repair

Synchronous: street-type abbreviation rules, component parsing, then fuzzy matching of query variants against official registers. Returns the corrected address, the field-level diff and a confidence. unchanged covers inputs that only needed case/accent normalisation. Asynchronous fallback (allow_async, 202, pending): interface only, currently disabled — no external call is ever made. Billed on success (repaired) only.

Parameter In Required Type Description
Idempotency-Key header no string (max length 255) Makes the POST safe to retry for 24 h (per API key's tenant). Same key and same request: the original result is returned (Idempotent-Replayed: true) and nothing is billed twice. Same key with a different request: 422 idempotency_key_reused; still running: 409 idempotency_in_progress. Addrova stores only a hash of the request, never its content.

Request body (application/json, required): RepairRequest

{"address":"4 pl darmes 90000 belfor","country":"FR"}

Authentication: ApiKeyHeader, BearerKey.

Status Response
200 Repair result — RepairResponse
202 Fallback job queued — RepairResponse
400 Invalid parameters (invalid_request) — Problem
401 Missing or invalid key (unauthorized) — Problem
429 quota_exceeded (monthly) or rate_limited (per second) — Problem

GET /v1/repair/jobs/{job_id}

Result of an asynchronous repair · operationId getRepairJob

Parameter In Required Type Description
job_id path yes string

Authentication: ApiKeyHeader, BearerKey.

Status Response
200 Repair result (status pending while running) — RepairResponse
401 Missing or invalid key (unauthorized) — Problem
404 Unknown resource (not_found) — Problem

batch

POST /v1/batch

Submit a file for asynchronous geocoding · operationId createBatch

CSV (UTF-8, header row, , ; tab or | separated) or JSON Lines. Limits are configurable (defaults: 200 MB, 1,000,000 rows, capped by plan). Files are streamed: processed in blocks with a checkpoint, resumed automatically if a worker stops, progress goes from 0 to 1, and the result is streamed back. Billing: one unit per non-empty address row, reserved at upload (the monthly quota must cover the whole file). The input file is deleted as soon as processing ends; the result and the job metadata are deleted after the retention period (default 1 hour after completion) or immediately with DELETE. A job never processed is purged after 24 hours. Each output row gets addrova_status: matched, uncertain (best candidate returned but confidence low), not_found, invalid (empty or rejected address) or error. rows_matched counts matched rows only. Identical addresses within a file are geocoded once.

Parameter In Required Type Description
Idempotency-Key header no string (max length 255) Makes the POST safe to retry for 24 h (per API key's tenant). Same key and same request: the original result is returned (Idempotent-Replayed: true) and nothing is billed twice. Same key with a different request: 422 idempotency_key_reused; still running: 409 idempotency_in_progress. Addrova stores only a hash of the request, never its content.

Request body (multipart/form-data, required): object

Authentication: ApiKeyHeader, BearerKey.

Status Response
202 Job accepted — BatchJob
400 Invalid parameters (invalid_request) — Problem
401 Missing or invalid key (unauthorized) — Problem
413 File or row count over the limits (payload_too_large) — Problem
429 quota_exceeded (monthly) or rate_limited (per second) — Problem

GET /v1/batch/{job_id}

Job status and progress · operationId getBatch

Parameter In Required Type Description
job_id path yes string

Authentication: ApiKeyHeader, BearerKey.

Status Response
200 Job — BatchJob
401 Missing or invalid key (unauthorized) — Problem
404 Unknown resource (not_found) — Problem

DELETE /v1/batch/{job_id}

Cancel the job and purge its files immediately · operationId deleteBatch

Parameter In Required Type Description
job_id path yes string

Authentication: ApiKeyHeader, BearerKey.

Status Response
204 Purged
401 Missing or invalid key (unauthorized) — Problem
404 Unknown resource (not_found) — Problem

GET /v1/batch/{job_id}/result

Download results · operationId getBatchResult

Parameter In Required Type Description
job_id path yes string

Authentication: ApiKeyHeader, BearerKey.

Status Response
200 Input columns plus addrova_label, addrova_lat, addrova_lon, addrova_precision, addrova_confidence, addrova_confidence_level, addrova_sources, addrova_status. The attribution of all sources used is included as a trailing comment line (CSV) or a final {"attribution": [...]} record (JSONL). — string
401 Missing or invalid key (unauthorized) — Problem
404 Unknown resource (not_found) — Problem
409 Job not finished (conflict) — Problem

account

GET /v1/usage

Usage of the calling tenant · operationId getUsage

Counts only. Addrova does not store the content of your requests.

Parameter In Required Type Description
period query no string (pattern ^\d{4}-\d{2}$) Month, YYYY-MM (default: current)

Authentication: ApiKeyHeader, BearerKey.

Status Response
200 Usage — Usage
401 Missing or invalid key (unauthorized) — Problem

compat-google

Drop-in compatible with the Google Geocoding API request/response shape.

GET /compat/google/maps/api/geocode/json

Google Geocoding API compatible endpoint · operationId compatGoogleGeocode

Replace https://maps.googleapis.com with the Addrova base URL and your Google key with an Addrova key. Supports address (forward) or latlng (reverse), components=country:XX, language. Errors are returned in the Google shape (status field, HTTP 200) for client compatibility. Only the request/response format is emulated; no Google data is used.

Parameter In Required Type Description
address query no string (max length 512)
latlng query no string lat,lng
components query no string Only country:XX is honoured
language query no string
region query no string

Authentication: ApiKeyQuery, ApiKeyHeader.

Status Response
200 Google-shaped response — GoogleGeocodeResponse

compat-nominatim

Drop-in compatible with the Nominatim search / reverse (jsonv2) shape.

Nominatim compatible search · operationId compatNominatimSearch

Parameter In Required Type Description
q query yes string (max length 512)
format query no json \ jsonv2
limit query no integer (min 1, max 40, default 10)
countrycodes query no string Comma-separated ISO alpha-2 codes
addressdetails query no 0 \ 1

Authentication: ApiKeyQuery, ApiKeyHeader.

Status Response
200 Nominatim-shaped list — array of NominatimPlace
400 Invalid parameters (invalid_request) — Problem
401 Missing or invalid key (unauthorized) — Problem

GET /compat/nominatim/reverse

Nominatim compatible reverse · operationId compatNominatimReverse

Parameter In Required Type Description
lat query yes number (min -90, max 90)
lon query yes number (min -180, max 180)
format query no json \ jsonv2
addressdetails query no 0 \ 1

Authentication: ApiKeyQuery, ApiKeyHeader.

Status Response
200 Single Nominatim place, or {"error": "Unable to geocode"} — NominatimPlace or object
400 Invalid parameters (invalid_request) — Problem
401 Missing or invalid key (unauthorized) — Problem

demo

Public demo gateway for the Addrova website: same shapes as /v1, no API key (the server uses an internal demo identity), low daily limits per pseudonymised IP, batch files up to 1,000 rows. CORS is open only to the website origin. Not for production use.

GET /demo/v1/geocode

Demo forward geocoding (query string) · operationId demoGeocodeGet

Parameter In Required Type Description
q query yes string (max length 512) Free-text address. Unicode NFC normalised, trimmed.
country query no string (pattern ^[A-Za-z]{2}$) Restrict to one country (ISO 3166-1 alpha-2, case-insensitive).
limit query no integer (min 1, max 20, default 5)
Status Response
200 Candidates, best first, with attribution — SearchResponse
400 Invalid parameters (invalid_request) — Problem
404 Demo disabled on this server
429 quota_exceeded (monthly) or rate_limited (per second) — Problem

POST /demo/v1/geocode

Demo forward geocoding (JSON body) · operationId demoGeocodePost

Request body (application/json, required): GeocodeRequest

Status Response
200 Candidates, best first, with attribution — SearchResponse
400 Invalid parameters (invalid_request) — Problem
429 quota_exceeded (monthly) or rate_limited (per second) — Problem

GET /demo/v1/reverse

Demo reverse geocoding · operationId demoReverse

Parameter In Required Type Description
lat query yes number (min -90, max 90)
lon query yes number (min -180, max 180)
limit query no integer (min 1, max 10, default 1)
Status Response
200 Candidates, best first, with attribution — SearchResponse
400 Invalid parameters (invalid_request) — Problem
429 quota_exceeded (monthly) or rate_limited (per second) — Problem

POST /demo/v1/batch

Demo file geocoding (max 1,000 rows; counts 1 demo request per 100 rows) · operationId demoCreateBatch

Request body (multipart/form-data, required): object

Status Response
202 Job accepted — BatchJob
400 Invalid parameters (invalid_request) — Problem
413 More than 1,000 rows or file too large (payload_too_large) — Problem
429 quota_exceeded (monthly) or rate_limited (per second) — Problem

GET /demo/v1/batch/{job_id}

Demo job status (only from the same visitor, same day) · operationId demoGetBatch

Parameter In Required Type Description
job_id path yes string
Status Response
200 Job — BatchJob
404 Unknown resource (not_found) — Problem

DELETE /demo/v1/batch/{job_id}

**** · operationId demoDeleteBatch

Parameter In Required Type Description
job_id path yes string
Status Response
204 Purged
404 Unknown resource (not_found) — Problem

GET /demo/v1/batch/{job_id}/result

**** · operationId demoGetBatchResult

Parameter In Required Type Description
job_id path yes string
Status Response
200 CSV or JSON Lines result — string
404 Unknown resource (not_found) — Problem
409 Job not finished (conflict) — Problem

console

Developer console backend (JSON only). Session auth, not API keys.

POST /console/v1/auth/magic-link

Email a single-use sign-in link · operationId consoleMagicLink

Always 202, whether or not the account exists (no account enumeration). At most 5 links per address per hour. The token travels in the URL fragment (/login#token=…).

Request body (application/json, required): object

Status Response
202 Link sent (or silently rate-limited)
400 Invalid parameters (invalid_request) — Problem
503 Engine temporarily unavailable (engine_unavailable) — Problem

POST /console/v1/auth/verify

Exchange a link token for a session · operationId consoleVerify

First sign-in creates the account and a default organization on the default plan.

Request body (application/json, required): object

Status Response
200 Session — object
401 Missing or invalid key (unauthorized) — Problem

POST /console/v1/auth/logout

**** · operationId consoleLogout

Authentication: ConsoleSession.

Status Response
204 Session ended
401 Missing or invalid key (unauthorized) — Problem

GET /console/v1/me

**** · operationId consoleMe

Authentication: ConsoleSession.

Status Response
200 Account — ConsoleAccount
401 Missing or invalid key (unauthorized) — Problem

GET /console/v1/plans

Plan catalog (limits and monthly prices; contract-only plans have no price) · operationId consolePlans

Status Response
200 Catalog — object

GET /console/v1/orgs

**** · operationId consoleListOrgs

Authentication: ConsoleSession.

Status Response
200 Organizations of the account — array of ConsoleOrg
401 Missing or invalid key (unauthorized) — Problem

POST /console/v1/orgs

**** · operationId consoleCreateOrg

Request body (application/json, required): object

Authentication: ConsoleSession.

Status Response
201 Created on the default plan — ConsoleOrg
401 Missing or invalid key (unauthorized) — Problem

GET /console/v1/orgs/{org_id}/keys

**** · operationId consoleListKeys

Parameter In Required Type Description
org_id path yes string

Authentication: ConsoleSession.

Status Response
200 Keys (never the secret) — array of ApiKeyInfo
404 Unknown resource (not_found) — Problem

POST /console/v1/orgs/{org_id}/keys

Create a key (secret shown once) · operationId consoleCreateKey

Parameter In Required Type Description
org_id path yes string

Request body (application/json): object

Authentication: ConsoleSession.

Status Response
201 New key — NewApiKey
404 Unknown resource (not_found) — Problem
409 Plan key limit reached (limit_reached)

POST /console/v1/orgs/{org_id}/keys/{key_id}/rotate

Issue a replacement key; the old one stays valid for the grace period · operationId consoleRotateKey

Parameter In Required Type Description
org_id path yes string
key_id path yes string

Request body (application/json): object

Authentication: ConsoleSession.

Status Response
201 New key — NewApiKey
404 Unknown resource (not_found) — Problem

DELETE /console/v1/orgs/{org_id}/keys/{key_id}

**** · operationId consoleRevokeKey

Parameter In Required Type Description
org_id path yes string
key_id path yes string

Authentication: ConsoleSession.

Status Response
204 Revoked
404 Unknown resource (not_found) — Problem

GET /console/v1/orgs/{org_id}/usage

Daily usage per endpoint (up to one minute behind) · operationId consoleUsage

Parameter In Required Type Description
org_id path yes string
from query no string (date)
to query no string (date)

Authentication: ConsoleSession.

Status Response
200 Usage — object
400 Invalid parameters (invalid_request) — Problem
404 Unknown resource (not_found) — Problem

GET /console/v1/orgs/{org_id}/usage.csv

Daily usage per endpoint as CSV (day,endpoint,units) · operationId consoleUsageCsv

Parameter In Required Type Description
org_id path yes string
from query no string (date)
to query no string (date)

Authentication: ConsoleSession.

Status Response
200 CSV attachment — string
400 Invalid parameters (invalid_request) — Problem
404 Unknown resource (not_found) — Problem

PUT /console/v1/orgs/{org_id}/plan

Switch to another self-serve plan (owner only) · operationId consoleChangePlan

Parameter In Required Type Description
org_id path yes string

Request body (application/json, required): object

Authentication: ConsoleSession.

Status Response
200 Plan applied — object
400 Invalid parameters (invalid_request) — Problem
403 Contract-only plan (forbidden)
404 Unknown resource (not_found) — Problem

meta

GET /metrics

Prometheus metrics (internal) · operationId metrics

Bounded labels only (method, route template, status class, engine operation and outcome). Protected by a bearer token when ADDROVA_METRICS_TOKEN is set; not exposed publicly.

Authentication: BearerKey.

Status Response
200 Prometheus text exposition format — string
401 Missing or invalid key (unauthorized) — Problem

GET /coverage

Countries covered, sources, licences and calibration (public) · operationId coverage

No authentication, cached 10 s. Lists every indexed country with its status, record count, data sources and licences (attribution text as required by each licence), whether confidences are calibrated, and the confident threshold. A country without calibration never returns confidence_level: high.

Status Response
200 Coverage — object

GET /status

Public aggregated status (for the status page) · operationId status

No authentication. Cached 10 s. Overall status is the worst component status. Engine status is per indexed country when the engine reports it, else a single * entry.

Status Response
200 Status — PublicStatus

GET /health

**** · operationId health

Status Response
200 Alive — object

GET /version

**** · operationId version

Status Response
200 Build information — object

Schemas

Schema PublicStatus

Field Type Required Description
status ComponentStatus yes
checked_at string (date-time) yes
components object yes

Schema ComponentStatus

Type: operational | degraded | outage

Schema ConsoleOrg

Field Type Required Description
id string no
name string no
plan string no
role owner \ admin \ member

Schema ConsoleAccount

Field Type Required Description
id string no
email string no
organizations array of ConsoleOrg no

Schema ApiKeyInfo

Field Type Required Description
id string no
name string or null no
prefix string no First 12 characters
env live \ test no
created_at string (date-time) no
expires_at string or null (date-time) no
revoked_at string or null (date-time) no

Schema NewApiKey

Field Type Required Description
id string yes
key string yes Secret
name string or null no
env string no
prefix string no
previous_expires_at string (date-time) no Rotation only

Schema Plan

Field Type Required Description
id string no
name string no
self_serve boolean no
monthly_quota integer no
rate_per_sec number no
max_keys integer no
batch_max_rows integer no
repair on_success \ included \ none
overage boolean no
price object no Omitted while not published

Schema GeocodeRequest

Field Type Required Description
q string (max length 512) yes
country string or null (pattern ^[A-Za-z]{2}$) no
limit integer (min 1, max 20, default 5) no

Schema SearchResponse

Field Type Required Description
results array of Result yes
attribution array of Attribution yes

Schema Result

Field Type Required Description
id string no Stable identifier in the source register
label string yes
components Components yes
location Location yes
precision rooftop \ street \ centroid \
confidence number (min 0, max 1) yes Estimated probability that the result is correct at the stated precision.
confidence_level high \ medium \ low
confidence_calibrated boolean no true when confidence comes from a calibration table for this country and precision (a measured probability); false for the uncalibrated heuristic — do not present it as a percentage.
country string (pattern ^[A-Z]{2}$) yes
sources array of string yes Source ids; see attribution for licences.
distance_m number no Reverse geocoding only — distance from the query point

Schema Components

Field Type Required Description
housenumber string no
street string no
postcode string no
city string no
district string no
region string no
country_code string no
cedex string no FR delivery office suffix, e.g. CEDEX 9
po_box string no PO box (BP, Postfach, apartado)

Schema Location

WGS 84

Field Type Required Description
lat number yes
lon number yes

Schema Attribution

Field Type Required Description
source string yes
text string yes
license string no

Schema RepairRequest

Field Type Required Description
address string (max length 512) no
components object no
country string (pattern ^[A-Za-z]{2}$) no
allow_async boolean (default false) no Opt in to the asynchronous fallback. Not yet available; ignored until enabled.

Schema RepairResponse

Field Type Required Description
status unchanged \ repaired \ unrepairable \
job_id string no Present when status is pending
parsed Components no
result Result no
confidence number (min 0, max 1) no Repair confidence (engine confidence blended with input similarity).
confidence_level high \ medium \ low
changes array of object no
attribution array of Attribution no

Schema BatchJob

Field Type Required Description
id string yes
status queued \ running \ succeeded \
created_at string (date-time) yes
finished_at string or null (date-time) no
expires_at string or null (date-time) no
rows_total integer no
rows_done integer no
rows_matched integer no
progress number (min 0, max 1) no
webhook_secret string no Webhook signing secret (whsec_…), only in the 202 response of the upload.
links object no

Schema Usage

Field Type Required Description
tenant_id string yes
period string yes
plan string no
quota integer yes
used integer yes
by_endpoint object no

Schema Problem

RFC 9457 problem details. The offending input value is never echoed back.

Field Type Required Description
type string (uri) yes
title string yes
status integer yes
code invalid_request \ unauthorized \ forbidden \
detail string no
errors array of object no

Schema GoogleGeocodeResponse

Field Type Required Description
status OK \ ZERO_RESULTS \ OVER_QUERY_LIMIT \
error_message string no
results array of object yes
attribution array of Attribution no Addrova extension, ignored by existing clients.

Schema NominatimPlace

Field Type Required Description
place_id string no
licence string no Attribution text of the source(s)
lat string no
lon string no
display_name string no
category string no format=jsonv2
class string no format=json (same value as category)
type string no
importance number no
address object no
boundingbox array of string no