Skip to main content

Zones

7 API calls in this section.

List Zones

Delivery & Last-Mile / Zones
GET/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

List 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

Send a bearer token in the Authorization header for an authenticated OnDi user session.
Request
curl
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

pageOptional
query string

1

Page number for pagination

limitOptional
query string

10

Number of items per page

is_activeOptional
query string

true

Filter by active status

inbound_enabledOptional
query string

Filter zones by inbound external integration status (true/false)

outbound_enabledOptional
query string

Filter zones by outbound external integration status (true/false)

external_integrationOptional
query string

Filter zones by external integration enabled/disabled status (true/false)

nameOptional
query string

Filter zones by name (partial match)

codeOptional
query string

Filter zones by exact code match

searchOptional
query string

Search by zone name or code

carrier_codeOptional
query string

Filter zones by enabled external carrier code

sort_byOptional
query string

Sort by one of: name, code, created_at, is_active, carrier_code

sort_orderOptional
query string

Sort order: asc or desc. Defaults to desc when sort_by is provided

column_filtersOptional
query string

JSON string with column filters. Supported keys: name, code, is_active, carrier_code, internal_enabled, inbound_enabled, outbound_enabled, external_integration, created_at

tenant_idOptional
query string

Tenant ID (optional if in auth token)

languageOptional
query string

en

Preferred language for response messages

Headers

AuthorizationOptional
header string

Bearer {{access_token}}

Responses

Success Response200OK
Response body
json
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}
Error (500 Internal Server Error)500
Response body
json
1{2  "success": false,3  "message": "Internal server error"4}

Create Zone

Delivery & Last-Mile / Zones
POST/delivery/zones?tenant_id=&language=en

Create 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

Send a bearer token in the Authorization header for an authenticated OnDi user session.
Request
curl
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}'
Request body
json
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_idOptional
query string

Tenant ID (optional if in auth token)

languageOptional
query string

en

Preferred language for response messages

Request body fields

nameExample
string

Example field from the request body.

codeExample
string

Example field from the request body.

boundariesExample
object

Example field from the request body.

boundaries.typeExample
string

Example field from the request body.

boundaries.coordinatesExample
array

Example field from the request body.

zone_metadataExample
object

Example field from the request body.

zone_metadata.population_densityExample
string

Example field from the request body.

tagsExample
array<string>

Example field from the request body.

is_activeExample
boolean

Example field from the request body.

Headers

AuthorizationOptional
header string

Bearer {{access_token}}

Content-TypeOptional
header string

application/json

Responses

Success Response201Created
Response body
json
1{2  "success": true,3  "message": "Zone created successfully"4}
Error (400 Bad Request)400
Response body
json
1{2  "success": false,3  "message": "Zone code already exists"4}

Get Zone

Delivery & Last-Mile / Zones
GET/delivery/zones/:zoneId?tenant_id=&language=en

Get 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

Send a bearer token in the Authorization header for an authenticated OnDi user session.
Request
curl
1curl --request GET "$ONDI_BASE_URL/delivery/zones/:zoneId?tenant_id=&language=en" \2  --header "Authorization: Bearer {{access_token}}"

Path parameters

zoneIdRequired
path string

uuid

ID of the zone to retrieve

Query parameters

tenant_idOptional
query string

Tenant ID (optional if in auth token)

languageOptional
query string

en

Preferred language for response messages

Headers

AuthorizationOptional
header string

Bearer {{access_token}}

Responses

Success Response200OK
Response body
json
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}
Error (404 Not Found)404
Response body
json
1{2  "success": false,3  "message": "Zone not found"4}

Update Zone

Delivery & Last-Mile / Zones
PUT/delivery/zones/:zoneId?tenant_id=&language=en

Update an existing delivery zone. Requires manage:operations:tenant permission.

Send a bearer token in the Authorization header for an authenticated OnDi user session.
Request
curl
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}'
Request body
json
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

zoneIdRequired
path string

uuid

ID of the zone to update

Query parameters

tenant_idOptional
query string

Tenant ID (optional if in auth token)

languageOptional
query string

en

Preferred language for response messages

Request body fields

nameExample
string

Example field from the request body.

codeExample
string

Example field from the request body.

boundariesExample
object

Example field from the request body.

boundaries.typeExample
string

Example field from the request body.

boundaries.coordinatesExample
array

Example field from the request body.

zone_metadataExample
object

Example field from the request body.

zone_metadata.population_densityExample
string

Example field from the request body.

tagsExample
array<string>

Example field from the request body.

is_activeExample
boolean

Example field from the request body.

Headers

AuthorizationOptional
header string

Bearer {{access_token}}

Content-TypeOptional
header string

application/json

Responses

Success Response200OK

Delete Zone

Delivery & Last-Mile / Zones
DELETE/delivery/zones/:zoneId?tenant_id=&language=en

Hard-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).

Send a bearer token in the Authorization header for an authenticated OnDi user session.
Request
curl
1curl --request DELETE "$ONDI_BASE_URL/delivery/zones/:zoneId?tenant_id=&language=en" \2  --header "Authorization: Bearer {{access_token}}"

Path parameters

zoneIdRequired
path string

uuid

ID of the zone to delete

Query parameters

tenant_idOptional
query string

Tenant ID (optional if in auth token)

languageOptional
query string

en

Preferred language for response messages

Headers

AuthorizationOptional
header string

Bearer {{access_token}}

Responses

Success Response200OK
Conflict — active deliveries409Conflict
Conflict — pricing rules409Conflict

List Zone Tags

Delivery & Last-Mile / Zones
GET/delivery/zone-tags?page=1&limit=20&search=&tenant_id=&language=en

List tenant zone tags for tag autocomplete.

Send a bearer token in the Authorization header for an authenticated OnDi user session.
Request
curl
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

pageOptional
query string

1

limitOptional
query string

20

searchOptional
query string
tenant_idOptional
query string
languageOptional
query string

en

Headers

AuthorizationOptional
header string

Bearer {{access_token}}

Responses

Success Response200OK

Show Zone Pricing (Perspective)

Delivery & Last-Mile / Zones
GET/delivery/zones/:zoneId/pricing?page=1&limit=50&service_id=&active=&tenant_id=&language=en

Show 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).

Send a bearer token in the Authorization header for an authenticated OnDi user session.
Request
curl
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

zoneIdRequired
path string

uuid

ID of the zone to show pricing for

Query parameters

pageOptional
query string

1

limitOptional
query string

50

service_idOptional
query string
activeOptional
query string
tenant_idOptional
query string
languageOptional
query string

en

Headers

AuthorizationOptional
header string

Bearer {{access_token}}

Responses

Success Response200OK