Zones
7 API calls in this section.
List Zones
/delivery/zones?page=1&limit=10&is_active=true&inbound_enabled=&outbound_enabled=&external_integration=&name=&code=&search=&carrier_code=&sort_by=&sort_order=&column_filters=&tenant_id=&language=enList delivery zones with pagination, advanced column filters, sorting, and tenant-wide stats. Requires valid authentication. Authentication: - Requires valid authentication token Query Parameters: - page (optional): Page number for pagination (default: 1) - limit (optional): Number of items per page (default: 10, max: 100) - is_active (optional): Filter by active status (true/false) - inbound_enabled (optional): Filter by inbound external integration status (true/false) - outbound_enabled (optional): Filter by outbound external integration status (true/false) - external_integration (optional): Filter by external integration enabled/disabled status (true/false) - name (optional): Filter zones by name (partial match) - code (optional): Filter zones by exact code match - search (optional): Search by zone name or code - carrier_code (optional): Filter by enabled external carrier code - sort_by (optional): One of name, code, created_at, is_active, carrier_code - sort_order (optional): asc or desc (defaults to desc when sort_by is provided) - column_filters (optional): JSON string with keys name, code, is_active, carrier_code, internal_enabled, inbound_enabled, outbound_enabled, external_integration, created_at - tenant_id (optional): Tenant ID (defaults to authenticated user's tenant) - language (optional): Preferred language for response messages
1curl --request GET "$ONDI_BASE_URL/delivery/zones?page=1&limit=10&is_active=true&inbound_enabled=&outbound_enabled=&external_integration=&name=&code=&search=&carrier_code=&sort_by=&sort_order=&column_filters=&tenant_id=&language=en" \2 --header "Authorization: Bearer {{access_token}}"Query parameters
pageOptional1
Page number for pagination
limitOptional10
Number of items per page
is_activeOptionaltrue
Filter by active status
inbound_enabledOptionalFilter zones by inbound external integration status (true/false)
outbound_enabledOptionalFilter zones by outbound external integration status (true/false)
external_integrationOptionalFilter zones by external integration enabled/disabled status (true/false)
nameOptionalFilter zones by name (partial match)
codeOptionalFilter zones by exact code match
searchOptionalSearch by zone name or code
carrier_codeOptionalFilter zones by enabled external carrier code
sort_byOptionalSort by one of: name, code, created_at, is_active, carrier_code
sort_orderOptionalSort order: asc or desc. Defaults to desc when sort_by is provided
column_filtersOptionalJSON string with column filters. Supported keys: name, code, is_active, carrier_code, internal_enabled, inbound_enabled, outbound_enabled, external_integration, created_at
tenant_idOptionalTenant ID (optional if in auth token)
languageOptionalen
Preferred language for response messages
Headers
AuthorizationOptionalBearer {{access_token}}
Responses
1{2 "success": true,3 "message": "Zones retrieved successfully",4 "zones": [5 {6 "id": "uuid",7 "name": "Downtown",8 "code": "DT-01",9 "internal_enabled": true,10 "is_active": true,11 "created_at": "2023-01-01T00:00:00Z",12 "updated_at": "2023-01-02T00:00:00Z",13 "boundaries": {14 "type": "polygon",15 "coordinates": []16 },17 "zone_geom": null,18 "zone_metadata": {19 "population_density": "high"20 },21 "tags": [22 "erbil",23 "airport"24 ],25 "external_integration": {26 "carrier_code": "PRIME",27 "is_enabled": true,28 "inbound_enabled": true,29 "outbound_enabled": true,30 "warehouse_id": "uuid"31 }32 }33 ],34 "stats": {35 "totalZones": 5,36 "activeZones": 4,37 "externalZones": 2,38 "recentlyAdded": [39 {40 "name": "Airport Zone",41 "created_at": "2025-10-01T00:00:00Z"42 }43 ]44 },45 "page": 1,46 "limit": 10,47 "total": 548}1{2 "success": false,3 "message": "Internal server error"4}Create Zone
/delivery/zones?tenant_id=&language=enCreate a new delivery zone. Requires manage:operations:tenant permission. Authentication: - Requires valid authentication token with manage:operations:tenant permission Query Parameters: - tenant_id (optional): Tenant ID (defaults to authenticated user's tenant) - language (optional): Preferred language for response messages
1curl --request POST "$ONDI_BASE_URL/delivery/zones?tenant_id=&language=en" \2 --header "Authorization: Bearer {{access_token}}" \3 --header "Content-Type: application/json" \4 --header "Content-Type: application/json" \5 --data '{6 "name": "Downtown",7 "code": "DT-01",8 "boundaries": {9 "type": "polygon",10 "coordinates": []11 },12 "zone_metadata": {13 "population_density": "high"14 },15 "tags": [16 "Erbil",17 "Airport"18 ],19 "is_active": true20}'1{2 "name": "Downtown",3 "code": "DT-01",4 "boundaries": {5 "type": "polygon",6 "coordinates": []7 },8 "zone_metadata": {9 "population_density": "high"10 },11 "tags": [12 "Erbil",13 "Airport"14 ],15 "is_active": true16}Query parameters
tenant_idOptionalTenant ID (optional if in auth token)
languageOptionalen
Preferred language for response messages
Request body fields
nameExampleExample field from the request body.
codeExampleExample field from the request body.
boundariesExampleExample field from the request body.
boundaries.typeExampleExample field from the request body.
boundaries.coordinatesExampleExample field from the request body.
zone_metadataExampleExample field from the request body.
zone_metadata.population_densityExampleExample field from the request body.
tagsExampleExample field from the request body.
is_activeExampleExample field from the request body.
Headers
AuthorizationOptionalBearer {{access_token}}
Content-TypeOptionalapplication/json
Responses
1{2 "success": true,3 "message": "Zone created successfully"4}1{2 "success": false,3 "message": "Zone code already exists"4}Get Zone
/delivery/zones/:zoneId?tenant_id=&language=enGet details of a specific delivery zone. Requires view:tenant permission. Authentication: - Requires valid authentication token Path Parameters: - zoneId: ID of the zone to retrieve Query Parameters: - tenant_id (optional): Tenant ID (defaults to authenticated user's tenant) - language (optional): Preferred language for response messages
1curl --request GET "$ONDI_BASE_URL/delivery/zones/:zoneId?tenant_id=&language=en" \2 --header "Authorization: Bearer {{access_token}}"Path parameters
zoneIdRequireduuid
ID of the zone to retrieve
Query parameters
tenant_idOptionalTenant ID (optional if in auth token)
languageOptionalen
Preferred language for response messages
Headers
AuthorizationOptionalBearer {{access_token}}
Responses
1{2 "success": true,3 "message": "Zone retrieved successfully",4 "zone": {5 "id": "uuid",6 "tenant_id": "uuid",7 "name": "Downtown",8 "code": "DT-01",9 "boundaries": {10 "type": "polygon",11 "coordinates": []12 },13 "zone_metadata": {14 "population_density": "high"15 },16 "is_active": true,17 "created_at": "2023-01-01T00:00:00Z",18 "updated_at": "2023-01-02T00:00:00Z"19 }20}1{2 "success": false,3 "message": "Zone not found"4}Update Zone
/delivery/zones/:zoneId?tenant_id=&language=enUpdate an existing delivery zone. Requires manage:operations:tenant permission.
1curl --request PUT "$ONDI_BASE_URL/delivery/zones/:zoneId?tenant_id=&language=en" \2 --header "Authorization: Bearer {{access_token}}" \3 --header "Content-Type: application/json" \4 --header "Content-Type: application/json" \5 --data '{6 "name": "Downtown Updated",7 "code": "DT-01-UPD",8 "boundaries": {9 "type": "polygon",10 "coordinates": []11 },12 "zone_metadata": {13 "population_density": "medium"14 },15 "tags": [16 "Erbil",17 "Out Of City"18 ],19 "is_active": true20}'1{2 "name": "Downtown Updated",3 "code": "DT-01-UPD",4 "boundaries": {5 "type": "polygon",6 "coordinates": []7 },8 "zone_metadata": {9 "population_density": "medium"10 },11 "tags": [12 "Erbil",13 "Out Of City"14 ],15 "is_active": true16}Path parameters
zoneIdRequireduuid
ID of the zone to update
Query parameters
tenant_idOptionalTenant ID (optional if in auth token)
languageOptionalen
Preferred language for response messages
Request body fields
nameExampleExample field from the request body.
codeExampleExample field from the request body.
boundariesExampleExample field from the request body.
boundaries.typeExampleExample field from the request body.
boundaries.coordinatesExampleExample field from the request body.
zone_metadataExampleExample field from the request body.
zone_metadata.population_densityExampleExample field from the request body.
tagsExampleExample field from the request body.
is_activeExampleExample field from the request body.
Headers
AuthorizationOptionalBearer {{access_token}}
Content-TypeOptionalapplication/json
Responses
Delete Zone
/delivery/zones/:zoneId?tenant_id=&language=enHard-delete a delivery zone after checks: blocks if any non-terminal delivery (status not delivered/cancelled/returned) references the zone as pickup or dropoff zone, or if the zone appears in zone pricing origin/destination rules. Clears the zone id from all drivers' preferred_zone_ids for the tenant. Requires manage:operations:tenant permission. Apply migration 20260331130000_zone_delete_driver_preferences_and_delivery_zone_fk so remove_zone_from_tenant_driver_preferences exists and historical deliveries can release FKs (SET NULL).
1curl --request DELETE "$ONDI_BASE_URL/delivery/zones/:zoneId?tenant_id=&language=en" \2 --header "Authorization: Bearer {{access_token}}"Path parameters
zoneIdRequireduuid
ID of the zone to delete
Query parameters
tenant_idOptionalTenant ID (optional if in auth token)
languageOptionalen
Preferred language for response messages
Headers
AuthorizationOptionalBearer {{access_token}}
Responses
List Zone Tags
/delivery/zone-tags?page=1&limit=20&search=&tenant_id=&language=enList tenant zone tags for tag autocomplete.
1curl --request GET "$ONDI_BASE_URL/delivery/zone-tags?page=1&limit=20&search=&tenant_id=&language=en" \2 --header "Authorization: Bearer {{access_token}}"Query parameters
pageOptional1
limitOptional20
searchOptionaltenant_idOptionallanguageOptionalen
Headers
AuthorizationOptionalBearer {{access_token}}
Responses
Show Zone Pricing (Perspective)
/delivery/zones/:zoneId/pricing?page=1&limit=50&service_id=&active=&tenant_id=&language=enShow all pricing rules related to this zone. Each row is projected from the zone perspective: the matched side contains only the main zone, and the counterparty side contains all zones/tags (with names).
1curl --request GET "$ONDI_BASE_URL/delivery/zones/:zoneId/pricing?page=1&limit=50&service_id=&active=&tenant_id=&language=en" \2 --header "Authorization: Bearer {{access_token}}"Path parameters
zoneIdRequireduuid
ID of the zone to show pricing for
Query parameters
pageOptional1
limitOptional50
service_idOptionalactiveOptionaltenant_idOptionallanguageOptionalen
Headers
AuthorizationOptionalBearer {{access_token}}