Bytero API

API documentation

REST API for the four Bytero products: Engine, Recover, Shield and SIQ.

REST API for Engine, Recover, Shield and SIQ. Every endpoint is read-only. Technical details and error codes are at the end of the page.

https://api.bytero.ai/api/v1Authorization: Bearer bk_live_...

Scopes

One scope per product.

read:engineBytero Engine: AVM valuations. Market price with a confidence band, asking price and the statutory values, with model versions behind every figure.
read:recoverBytero Recover: the property record from a single address. Flat/house classification, official floor areas, the modeled build year and LiDAR house dimensions.
read:shieldBytero Shield: risk assessments. Flood zone, nine perils and the expected annual loss as a % of property value.
read:siqBytero SIQ (Single Input Quote): one address in, the combined answer out. Property type, floor area, market price, statutory values and risk.

Bytero Engine

POST/api/v1/engine/valuationread:engine

Automated valuation from an address or GPS point, the floor area and the property type. A flat returns the market value with its Q25-Q75 band, the asking price and the statutory values; a house returns the band and the statutory values only, no point price. The Flat / House toggle shows each shape.

NameTypeExampleDescription
countryenumrequiredskyour two-letter country code (sk | cz | pl | si | hu | us). The response echoes the detected country.
addressstringLocation option AMýtna 21, 811 07 Bratislavamytna 21 bratislavalocation requirement, option A: free-form address: street with number and a city, optionally a postal code, in any order, diacritics optional. Ambiguous street name → add a city or postal code.
lat + lonnumberLocation option B48.1512, 17.1083location requirement, option B: GPS coordinates (decimal degrees WGS84) instead of the address; the building is taken at the point.
usable_areanumberrequired65net usable living area in m², [5, 10000]
property_typeenumrequiredflatflat | house
dispositionenum2_roomstudio | 1_room | 2_room | 3_room | 4_room | 5_plus_rooms. The room count; for an atypical unit (loft, maisonette), send its room count.
conditionenumnew_buildoriginal_state | partial_renovation | full_renovation | new_build. The renovation ladder, priced strictly monotone in this order; new_build is priced on the dedicated new-build model.
constructionenumbrickbrick | panel | reinforced_concrete | mixed | skeleton | wooden | stone | prefab
ownershipenumprivateprivate | cooperative | company | state | other
energy_ratingenumBA | B | C | D | E | F | G
furnishedenumfurnishedfurnished | partially_furnished | unfurnished | shell
floornumber3[-3, 100]; 0 = ground
total_floorsnumber6[1, 100]
floor_areanumber65total floor area in m² (incl. internal walls); defaults to usable_area when omitted
land_areanumber450m² (for houses)
year_of_constructionnumber2022[1800, 2100]; enables the technical value (depreciation)
renovation_yearnumber2015[1800, 2100]
bathroom_countnumber1[0, 20]
curl -X POST https://api.bytero.ai/api/v1/engine/valuation \
  -H "Authorization: Bearer bk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "country": "sk",
  "address": "Mýtna 21, 811 07 Bratislava",
  "usable_area": 65,
  "property_type": "flat",
  "disposition": "2_room",
  "condition": "new_build",
  "construction": "brick",
  "ownership": "private",
  "furnished": "furnished",
  "energy_rating": "B",
  "floor": 3,
  "total_floors": 6,
  "year_of_construction": 2022
}'
FieldDescription
countrythe detected country of the property
market_value_eurthe market (sale) price, EUR. Returned for flats only; a house is valued to a band, so this field is omitted and price_band is the headline
price_bandthe Q25-Q75 price band around the value ({ q25, q75 }, EUR), from the model's own quartiles; the value always falls inside it. For a house this band is the headline (no point market_value_eur)
predicted_asking_eurthe asking price the same property would list at, EUR (flats only)
confidencehigh (20+ comparable listings near the address) | medium (10+) | low (fewer); degraded answers never claim high
statutory_valuesthe vyhláška 492/2004 figures: insurance_sum_eur (reproduction value, the basis of the insured sum) always when the area resolves; technical_value_eur (reduced for age and wear) when year_of_construction is given
modelwhich model produced the number: branch (flat / new-build / house), version, how the price band was derived, and whether the asking-to-sale adjustment applied. basis is "model" normally, "comparables-fallback" when the model was briefly unavailable (never claimed as high confidence)
median_price_per_m2 / comparables_band_eur / comparables_usedcontext from comparable listings near the address; comparables_band_eur is their { q25, q75 } in EUR
ml_location_usedthe location context the model actually used (city, district, region), derived server-side from the address
address_matchhow the address resolved: matched address, coordinates, precision, match score, and alternatives when the address exists in several towns
inputsecho of the normalized payload that was priced
warningspresent only when something needs attention: ambiguous address, model fallback

Bytero Recover

GET/api/v1/recover/propertyread:recover

The property record from an address or GPS point: flat/house classification, the unit's floor area with a confidence band and floor, the modeled build year, and LiDAR dimensions for a house. A flats address without flat_number returns every unit as flat_options. No prices: valuation is Bytero Engine or SIQ.

NameTypeExampleDescription
countryenumrequiredskyour two-letter country code (sk | cz | pl | si | hu | us)
addressstringLocation option AMýtna 21, 811 07 Bratislavamytna 21 bratislavalocation requirement, option A: free-form address: street with number and a city, optionally a postal code, in any order, diacritics optional
lat + lonnumberLocation option B48.1562, 17.1176location requirement, option B: GPS coordinates (decimal degrees WGS84) instead of the address; the building is taken at the point
flat_numberstringrequired19the official flat number, pins the exact unit for its floor area. Without it a flats address returns every unit as flat_options
property_typeenumflatflat | house. Optional: omitted, the classified type is returned; declared, the record is cross-checked against it
curl "https://api.bytero.ai/api/v1/recover/property?country=sk&address=M%C3%BDtna%2021,%20811%2007%20Bratislava&property_type=flat&flat_number=19" \
  -H "Authorization: Bearer bk_live_..."
FieldDescription
property_typethe classification of what stands at the address: flat, house, or other (non-residential)
area_m2the unit's floor area (m²); exact where the unit is uniquely identified, otherwise a modeled value with a band
confidenceper-part confidence: property_type, address match, flat match (with the unit's floor + total_floors, floor 0 = ground), and the area basis + band; numbering says whether flat numbers run per entrance or building-wide
buildinghouses only: LiDAR footprint (m²), storeys, ridge/eave heights and obostavaný priestor (m³ per STN 73 4055); null for flats
accuracythe record's validated accuracy, returned with every record
address_matchhow the address resolved: matched address, building id, coordinates, and alternatives when ambiguous
model_versionsversions of the models used. year_of_construction is the modeled build year with source, confidence, tier (anchor / gps / era) and a low..high range
flat_optionsevery unit in the entrance (numbers, areas, floors), returned only when no exact flat matched
inputecho of the processed input
warnings / elapsed_msanything needing attention (e.g. the declared type disagrees with the classification) and the processing time

Bytero Shield

GET/api/v1/shield/assessmentread:shield

The address-level risk assessment: the flood zone (1-4) and the expected annual loss rate (per-mille of value) with its tail (PML), water depth by return period, nine natural perils, the national risk rank and 2050 climate pathways. The declared insured exposure refines the loss model.

NameTypeExampleDescription
countryenumrequiredskyour two-letter country code (sk | cz | pl | si | hu | us), cross-checked against the detected location
addressstringLocation option ARovniankova 14, Bratislavarovniankova 14 bratislavalocation requirement, option A: free-form address: street with number and a city, optionally a postal code, in any order, diacritics optional
lat + lonnumberLocation option B48.1147, 17.1098location requirement, option B: GPS coordinates (decimal degrees WGS84) instead of the address
property_typeenumrequiredflatflat | house
floor_above_groundint2the insured floor (2 = a 2nd-floor flat): the flood exposure is floor-aware. A flat with no floor is weighted by the probability the unit sits at ground level (12%)
insured_value_eurnumber250000optional: your insured sum. The loss rate always returns in per-mille of value; the EUR figure is priced against this sum when sent, otherwise against a modeled default sum.
area_m2number68.5floor area, refines the loss model
curl "https://api.bytero.ai/api/v1/shield/assessment?country=sk&address=Rovniankova%2014,%20Bratislava&property_type=flat&floor_above_ground=2&insured_value_eur=250000" \
  -H "Authorization: Bearer bk_live_..."
FieldDescription
country / coveredthe detected country and whether the address is covered
zonethe flood zone 1-4 (4 = worst) with its controlling_layer (fluvialDefended / fluvialUndefended / pluvial / maxCredible), confidence and any caveats. Thresholds: flooded to Q20, or Q100 depth over 1.5 m, or depth × velocity over 1.0 m²/s ⇒ zone 4
lossexpected annual loss: aal_rate_permille (per-mille of value, always returned) and aal_rate_percent (the same rate as a percent, ‰ ÷ 10), plus aal_eur (priced against your insured_value_eur, or a modeled default sum when omitted - insured_value_basis says which), the flood_exposure assumptions and the full by_peril breakdown
loss.by_perilthe nine perils priced (flood_fluvial, flood_pluvial, wind, hail, lightning, seismic, snow, landslide, wildfire), each with aal_rate_permille, aal_eur, share of total, the pre-calibration hazard_rate_permille + market_factor (for audit) and the physical intensity
loss.pmlthe tail: rp100 / rp200 (the Solvency II capital horizon) / rp500, each with damage_pct, loss_eur and the driving peril; q100_eur, the rarest modeled flood event, and the overall worst_case (peril + return period). rp_note lists which perils the occurrence-basis PML covers
score / bandthe overall risk score (0-100) and its band (low | moderate | elevated | high)
decisionready-made underwriting action - action: accept | refer | decline - plus triggered_rules (each { metric, label, action, value, threshold, text }) and ruleset_version. Default SK bands: flood zone ≥3 refer / ≥4 decline; AAL ‰ >2 refer / >8 decline. Configurable per key.
fluvial / pluvialriver and rain flood: score, in_official_zone flag, depth_by_return_period (5-1000y), and for rain also velocity_by_return_period and hazard_basis (hydraulic | susceptibility)
depthheadline water depth by return period - unit is metres ("m") - with per-dataset provenance in sources[]
perilsraw per-peril hazard scores (0-100) with the model behind each (e.g. seismic_model: eshm20-pga475) and auditable physical intensities (wind_v50_gust m/s, snow_sk_kn_m2, seismic_pga475g, hail_days_yr). The priced view is loss.by_peril
defensesflood-defense screening: status (likely-protected / exposed-despite-defenses / no-floodplain / …), the defended vs undefended signal, and the official protection_standard (protected to ~1-in-N) at the address
climateforward-looking 2050 loss pathways (RCP2.6 / RCP8.5) - each with the scaled aal_rate_permille + band, aal_change_pct and per-peril drivers; a screening sensitivity for CSRD / EU-Taxonomy disclosure, not a hydraulic re-run
rankthe address's national percentile by loss rate (overall.pct) within the dwelling-weighted reference population, plus the location grade and per-peril ranks
locationgeocode quality: precision, confidence and the uncertainty_radius_m
address_matchhow the address resolved: matched address, coordinates, precision and score
scenarios / wind_explain / product / assessed_at / query / notesprovenance: the six depth scenarios (official / defended / undefended / pluvial / pluvial_velocity / max_credible), the windstorm explanation, product version, timestamp, the resolved coordinates and human-readable notes

Bytero SIQ

POST/api/v1/siqread:siq

One address (or GPS point) in, the combined answer of all three products out: property type and floor area, market and list price, the statutory values, and the risk view. Size comes as your own floor area (area_m2) or via flat_number for the official floor area.

NameTypeExampleDescription
countryenumrequiredskyour two-letter country code (sk | cz | pl | si | hu | us)
addressstringLocation option AMýtna 21, 811 07 Bratislavamytna 21 bratislavalocation requirement, option A: free-form address: street with number and a city, optionally a postal code, in any order, diacritics optional
lat + lonnumberLocation option B48.1512, 17.1083location requirement, option B: GPS coordinates (decimal degrees WGS84) instead of the address; the building is taken at the point
area_m2numberSize option A68.5size requirement, option A: your own floor area (m²), prices without the unit lookup. Wins over flat_number when both are given.
flat_numberstringSize option B5size requirement, option B: the official building-wide flat number, uses the unit's official floor area. Omit both sizes → building band + flat_options.
yearint1985construction year, refines technická & všeobecná hodnota. Omit → the modeled build year is used when available.
constructionenumpaneloptional: panel / brick / concrete…, refines the statutory values
include_market_priceboolfalsedefault true. Set false to skip the AVM (fastest; record + statutory values + risk only).
curl -X POST https://api.bytero.ai/api/v1/siq \
  -H "Authorization: Bearer bk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "country": "sk",
  "address": "Mýtna 21, 811 07 Bratislava",
  "area_m2": 68.5
}'
FieldDescription
property_typeflat, house, or other (non-residential: footprint returned, no valuation), with confidence
area_m2the unit's floor area (m²) with a confidence band; a dom instead carries the building block below
confidenceper-part confidence: property_type, address match, flat match (with floor + total_floors) and area
buildinghouses: LiDAR volume (obostavaný priestor, m³), footprint, storeys and heights; the € values are then priced per m² of built-up area. Non-residential buildings carry footprint + height only.
pricesthe market figures, each with a plain-language explanation and its official term: market price with its band, list price, price per m²
statutory_valuesthe vyhláška 492/2004 figures as one object, same shape as Engine: insurance_sum_eur always, technical_value_eur when the build year is known
riskthe compact Bytero Shield block: risk score, flood zone and the expected annual loss rate for the matched building
address_matchhow the address resolved, with alternatives when it exists in several towns
model_versionsversions behind every figure, incl. the modeled build year (source, confidence, tier, range) when no year was sent
flat_optionsevery unit in the entrance, returned last and only when no exact flat matched
warnings / elapsed_ms / inputanything needing attention, the processing time, and the echo of what was processed

Account

GET/api/v1

Discovery: what your key can do. Products with their endpoints, your scopes and your enabled countries.

curl "https://api.bytero.ai/api/v1" \
  -H "Authorization: Bearer bk_live_..."
FieldDescription
api / versionAPI name and version
keyyour key: prefix, scopes, enabled countries ('all' when unrestricted)
productsthe four products with their endpoints and scopes
accountaccount-level endpoints
enums / docsinput conventions and the documentation URL
GET/api/v1/status

Service health, no key needed. Always HTTP 200; status is ok or degraded, with per-component checks.

curl "https://api.bytero.ai/api/v1/status" \
  -H "Authorization: Bearer bk_live_..."
FieldDescription
statusok | degraded
timeserver time, ISO 8601
versionthe public API version (v1); independent of the app build
componentsper-component health: database, valuation_model, risk_engine (ok | down) and valuation_bake (ok | drift | unknown)
GET/api/v1/account/usage

Your own API usage. Any active key works; no product scope needed.

curl "https://api.bytero.ai/api/v1/account/usage" \
  -H "Authorization: Bearer bk_live_..."
FieldDescription
countsrequest totals: all time, last 24h / 7d / 30d
by_endpointper-endpoint request counts with average and p95 latency (30d)
by_daydaily request counts with error counts (30d)

Base URLhttps://api.bytero.ai/api/v1
AuthenticationAuthorization: Bearer bk_live_... 401 = missing or invalid key; 403 = valid key without the required scope or country. Multiple keys per account; rotate by creating a new key and revoking the old one.
Formatapplication/json (UTF-8)
EnvelopeSuccess responses wrap the payload in {"data": ...}; read data on 2xx. Error responses are not wrapped: branch on the code field (listed under Error codes below).
RequestsBodies are accepted as JSON, form-urlencoded or multipart. Enum inputs use the documented values. Every endpoint is read-only, so any call is safe to retry.
ErrorsStandard HTTP codes; body {"code": "...", "error": "...", "message": "...", "request_id": "..."}, plus context fields on validation errors. Branch on code (stable, listed below); the texts may be reworded. Every response carries X-Request-Id; error bodies repeat it as request_id. Quote it in support requests.
Rate limits120 requests/min per key; higher limits on request. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset; a 429 carries Retry-After. Portfolio-scale runs are delivered as a service: send the file, we return it enriched.
Versioning/v1 is the current version and the compatibility boundary. Changes within /v1 are additive — new fields and endpoints only — so existing integrations keep working; a breaking change would ship as a new URL version, announced in advance with a migration window. The version reported on GET /api/v1 and /status is the API version, independent of the app build.
SandboxTest keys (bk_test_, created in the app) behave identically; responses carry Bytero-Environment: test; test requests are never billed.
OpenAPIGET /api/v1/openapi.json (no key needed).
StatusGET /api/v1/status (no key needed): ok | degraded + per-component checks.
Support & stability24/7/365 via bytero@bytero.sk. Include your request_id. Changes within /v1 are additive only; any deprecation is announced in advance with a migration window.
DataProcessed and stored in the EU. Request parameters are retained 24 months for support, debugging and service improvement; usage metadata is retained 24 months for billing. Successful response bodies are not stored. DPA available on request.
CountriesRequests run under your key's country access. The required country param declares your country (sk | cz | pl | si | hu | us); a mismatch returns one of the country errors listed below, and responses echo the detected country. GET /api/v1 lists the countries enabled on your key.

CodeHTTPWhen
MISSING_API_KEY401No Authorization header. Send Authorization: Bearer <key>.
INVALID_API_KEY401The key does not exist or was revoked.
MISSING_SCOPE403The key lacks the scope this endpoint needs.
PLAN_REQUIRED403The account plan does not include API access.
ACCOUNT_INACTIVE403The key owner's account is deactivated.
COUNTRY_REQUIRED400The country param is missing.
UNKNOWN_COUNTRY400The country code is not one of sk | cz | pl | si | hu | us.
NO_COUNTRY_ACCESS403Your plan does not include the declared country. The response lists your_countries.
LOCATION_OUTSIDE_COUNTRY422The location resolves to a different country than declared.
LOCATION_NOT_AVAILABLE422The product is not available for this location.
LOCATION_REQUIRED400Neither an address nor lat + lon was sent.
ADDRESS_REQUIRED400The endpoint needs an address and none was sent.
ADDRESS_NOT_RESOLVED422The address could not be matched. The response carries address_match with the closest candidates.
PROPERTY_TYPE_REQUIRED400property_type is missing.
INVALID_PROPERTY_TYPE400property_type is not flat or house.
SIZE_REQUIRED400No usable_area and no way to derive it.
FLAT_NOT_RESOLVED422The flat_number did not match a known unit at the address.
NO_COMPARABLES422Too little market data around the location to value it.
PAYLOAD_TOO_LARGE413The request body exceeds the 1 MB limit.
RATE_LIMITED429Rate limit exceeded. Retry after Retry-After seconds.
NOT_FOUND404Unknown endpoint path.
INTERNAL_ERROR500Unexpected failure on our side. Quote the X-Request-Id in support requests.