The style Studio: the console’s editor for custom styles now has layers, sources and every property of the MapLibre spec, expression and filter builders, design tokens (light and dark), a gallery of eight templates and 18 layer groups for the basemap’s own data, a data inspector, undo and redo with autosave, version history with a diff, restore and rollback, read-only share links to the draft (GET /v1/styles/preview/{token}, no key), comments, who is editing now, usage per key, and import of a Mapbox style you own. A behaviour change: publishing, rolling back and restoring a version now need the styles.publish action, held by owners and admins; developers (who could publish before) keep editing the draft but get 403 role_forbidden on these. Styles you already serve are not affected.
More in a style: the sources tareky://terrain (where we serve elevation: Copernicus DEM, with its credit), tareky://traffic and tareky://aqi; the root keys terrain, sky, light and projection; your own fonts (TTF, OTF or WOFF, up to 10 MB, with a licence statement) through tareky://glyphs/{handle}.{stack}; PNG icons, SDF icons and a free icon library. Static maps and raster tiles draw terrain flat. Limits on styles (size, layers, icons) and fonts now follow your plan: the free plan keeps 1 MB, 300 layers, 64 icons and 3 fonts.
Tilesets of three kinds:vector, raster (imagery from a GeoTIFF) and raster-dem (elevation, Terrarium PNG); several named layers in one vector tileset; vector_layers and tilestats in the TileJSON; and a CSV that joins its columns into a vector tileset’s features. The build API takes kind, and its failures and warnings have codes.
Codes of the console:errors lists the specific codes the console shows (style_limit, stale_revision, font_limit, tileset_limit and more). Over /v1 nothing changes.
Tracking links name you, and speak the customer’s language:POST /v1/tracking/devices/{externalId}/shares takes an optional partnerName (ar, en, at most 40 characters each) for the “via” line on your customer’s page; without it the app’s name is used. locale now also sets the language of the page and of the link-preview card, and the arrival notifications say “the driver”. Nothing changes if you send neither.
reverse-geocode in your language:GET /v1/locations/reverse-geocode takes lang (ar, en or ckb; default ar) and returns place, street and address in it, falling back to Arabic where a name has no translation. With en the address is joined with , . Nothing changes without lang, and the response has the same fields.
What each search result is, and where: rows of GET /v1/locations/search carry category (places), area, region, adminLevel and bbox (administrative areas and streets), each null where it does not apply. Nothing existing changes. GET /v1/locations/geocode does not carry them. Short queries (under six letters) are also matched faster.
Opening hours on nearby places:GET /v1/poi/nearby rows carry openingHours (a weekly schedule, or null when none is on record).
Places come ranked, and addresses are gone:GET /v1/poi/in-bounds now returns the most important places first (each row has an importance) and take keeps the top of that list, so a crowded box shows its fuel stations and hospitals before its schools; before, the order was arbitrary. A behaviour change: address-only survey rows (a name such as “behind the court”) are no longer returned by /v1/poi/in-bounds, /v1/poi/nearby or the places in /v1/tilequery.
filters on GET /v1/poi/nearby: the same category-specific JSON as /v1/poi/in-bounds (EV charging: {"accessType":"PUBLIC","minPowerKw":22}), count counts only the matches, and a malformed payload is a 400 invalid_request.
Transit plans say which way, and where: a ride leg has routeNames (ar, en, ckb) and towards, the end of the line it is heading to (null where that end is not confirmed); every leg’s from and to carry a name for the boarding and getting-off points.
Places along a route:POST /v1/poi/along-route returns places of one category near a route, in route order, with the extra driving time to visit each. Costs 2 units.
/v1/optimize honours destination: the option was documented but never reached the routing engine, so destination=last could not fix the final stop. It now does. GET /v1/transit/plan no longer fails with a 400 when one candidate line has no route between its points; that line is left out and the others are returned.
A label for every point from reverse-geocode: the new label field holds the name to show for a point (a nearby place, else a street, else an area, else the plus code) and is never null, with area and region beside it. A behaviour change: street and address no longer return alley codes (like 214-109); street is null when no named street is close. The fix applies to POST /v1/locations/geo-coding too.
GET /v1/locations/search: administrative-area rows carry zoom (the area’s stored map zoom), and null for every other kind.
A new key format:tareky_pk_… and tareky_sk_… with a checksum, so secret scanners recognise them. Older pk_… and sk_… keys keep working.
Organisations and roles: owner, admin, developer and billing, with email invitations and an activity log.
Usage analytics: requests by status, latency, and a month-end estimate.
A playground and code in seven languages.
Monthly invoices in IQD, with upgrade requests.
Each error code links to its own section of these docs.
Key restrictions: secret keys limited to your servers’ addresses, public keys to your mobile apps, and short-lived tokens; secret keys pushed to public GitHub repositories are revoked within seconds.
Custom map styles: recolour the basemap or import a MapLibre style, served from /v1/styles.
Your own data on the map: upload GeoJSON, CSV, Shapefile, KML, GPX, GeoPackage or FlatGeobuf and get vector tiles.
Organisation security: an authenticator code from every member, a limit on how long a session lasts, verified domains, single sign-on (OpenID Connect and SAML), directory sync (SCIM), and the activity log as CSV or NDJSON.