# API Documentation
## Overview
This API provides endpoints to manage user and driver information, retrieve active orders, and cancel ongoing orders. Authentication is enforced using **Client ID** and **Client Secret**.
---
## Authentication
All API requests must include the following headers:
### Headers:
- **Client-Id**: Unique client ID issued during registration.
- **Client-Secret**: Client secret issued during registration.
### Security Rules:
1. Both `Client-Id` and `Client-Secret` must match the records in the system.
2. Rate limits apply (max 10 requests per minute per user). Requests exceeding this limit will receive an error response.
---
## Endpoints
### 1. Retrieve User Information
**Endpoint:** `GET /api/user-info`
**Description:** Fetch user information based on the phone number, including whether the user has an active order.
#### Request:
- **Headers**:
- `Client-Id`: Client ID issued during registration.
- `Client-Secret`: Client Secret issued during registration.
- **Query Parameters**:
- `phone_number` (string): The phone number of the user.
#### Response:
- **Success Response**:
- **HTTP Status Code**: `200 OK`
```json
{
"status": "success",
"data": {
"is_registered": true,
"has_runnding_ride": true,
"country_id": 1, // Country ID, 1 for BD, 2 for NP
"city_id": 1,
"ride_type": "1|2|3|4|5|6|7|8|9", // Bike, CarLite, CarPlus, CarPrime, CarMax, CarCoach, Bicycle, Tuktuk
}
}
```
- **Unregistered User Response**:
- **HTTP Status Code**: `404 Not Found`
```json
{
"status": "error",
"message": "The provided phone number is not registered. Please use a registered phone number to proceed.",
"error_code": 1001
}
```
---
### 2. Retrieve Driver Information
**Endpoint:** `GET /api/driver-info`
**Description:** Fetch detailed information about a driver, including their `driver_type` and whether they have active orders.
#### Request:
- **Headers**:
- `Client-Id`: Client ID issued during registration.
- `Client-Secret`: Client Secret issued during registration.
- **Query Parameters**:
- `phone_no` (string): The phone number of the driver.
#### Response:
- **Success Response**:
- **HTTP Status Code**: `200 OK`
```json
{
"status": "success",
"data": {
"is_registered": true,
"has_runnding_ride": true,
"driver_type": 1, // DriverType.Bike
"country_id": 1, // Country ID, 1 for BD, 2 for NP
"city_id": 1,
"ride_type": "1|2|3|4|5|6|7|8|9", // Bike, CarLite, CarPlus, CarPrime, CarMax, CarCoach, Bicycle, Tuktuk
}
}
```
- **Unregistered Driver Response**:
- **HTTP Status Code**: `404 Not Found`
```json
{
"status": "error",
"message": "The provided phone number is not registered. Please use a registered phone number to proceed.",
"error_code": 1001
}
```
#### Driver Types:
| Code | Driver Type |
|------|-------------|
| 1 | Bike |
| 2 | CarPlus |
| 4 | Bicycle |
| 5 | CarLite |
| 6 | Tuktuk |
| 7 | CarPrime |
| 8 | CarMax |
| 9 | CarCoach |
---
### 3. Cancel Active Order
**Endpoint:** `POST /api/cancel-active-order`
**Description:** Cancel an active order (ride, food, parcel) based on the provided `vertical` and `cancel_reason`.
#### Request:
- **Headers**:
- `Client-Id`: Client ID issued during registration.
- `Client-Secret`: Client Secret issued during registration.
- **Body**:
```json
{
"phone_no": "string",
"vertical": "string", // One of "ride", "food", "parcel"
"cancel_reason": "string", // Cancellation reason slug
"country_id": "1|2" // Country ID, 1 for BD, 2 for NP
}
```
#### Vertical Parameter:
- `ride`: For ride cancellations.
- `food`: For food order cancellations (future use).
- `parcel`: For parcel cancellations.
#### ExampleCancel Reason Slugs:
##### User Cancellation Reasons (Ride):
1. **Bike**:
- `ua_bike_refused_pickup` - Rider refused to pick me up
- `ua_bike_pickup_or_destination_incorrect` - Incorrect pickup/destination location
- `ua_bike_waiting_time_too_long` - Waited too long
- `ua_bike_dont_need_ride` - Don't need ride anymore
- `ua_bike_unreachable` - Rider unreachable
- `ua_bike_rude` - Rider was rude
- `ua_bike_vehicle_or_person_not_same` - Vehicle/person not matching
- `ua_bike_refused_dp` - Refused digital payment
- `ua_bike_ride_refused_destination` - Refused to go to destination
- `ua_bike_rider_is_far_away` - Rider is too far
- `ua_bike_asked_me_to_cancel` - Rider asked to cancel
2. **Car Plus**:
- `ua_car_plus_refused_pickup` - Captain refused pickup
- `ua_car_plus_pickup_or_destination_incorrect` - Incorrect location
- `ua_car_plus_waiting_time_too_long` - Long wait
- `ua_car_plus_dont_need_ride` - Don't need ride
- `ua_car_plus_unreachable` - Captain unreachable
- `ua_car_plus_rude` - Captain was rude
- `ua_car_plus_vehicle_or_person_not_same` - Vehicle/person mismatch
- `ua_car_plus_refused_dp` - Refused digital payment
- `ua_car_plus_rider_is_far_away` - Captain is far
- `ua_car_plus_asked_me_to_cancel` - Captain asked to cancel
##### Driver Cancellation Reasons (Ride):
1. **Bike**:
- `da_bike_pickup_far_away` - Pickup location far
- `da_bike_pickup_or_destination_incorrect` - Incorrect location
- `da_bike_waiting_time_too_long` - Waited too long
- `da_bike_unreachable` - User unreachable
- `da_bike_more_than_1_person` - More than 1 passenger
- `da_bike_rude` - User was rude
- `da_bike_mistakenly_ordered` - Mistaken order
- `da_bike_asked_to_cancel` - User requested cancellation
- `da_bike_others` - Other reasons
2. **Car Plus**:
- `da_car_plus_pickup_far_away` - Pickup location far
- `da_car_plus_pickup_or_destination_incorrect` - Incorrect location
- `da_car_plus_waiting_time_too_long` - Long wait
- `da_car_plus_unreachable` - User unreachable
- `da_car_plus_more_than_4_people` - More than 4 passengers
- `da_car_plus_rude` - User was rude
- `da_car_plus_mistakenly_ordered` - Mistaken order
- `da_car_plus_had_too_many_baggages` - Too many bags
- `da_car_plus_asked_to_cancel` - User requested cancellation
- `da_car_plus_others` - Other reasons
##### Parcel Cancellation Reasons:
- `da_parcel_overweight_product` - Overweight product
- `da_parcel_pickup_or_destination_incorrect` - Incorrect location
- `da_parcel_sender_or_receiver_unreachable` - Sender/receiver unreachable
- `da_parcel_sender_requested_cancelation` - Sender requested cancellation
- `da_parcel_sender_pickup_location_far_away` - Pickup location too far
- `da_parcel_mistakenly_ordered` - Mistaken order
- `da_parcel_waited_long_time` - Long wait time
- `da_parcel_suspicious_goods` - Suspicious goods
- `da_parcel_others` - Other reasons
#### Response:
- **Successful Cancellation**:
- **HTTP Status Code**: `200 OK`
```json
{
"status": "success",
"message": "Order successfully canceled."
}
```
- **Invalid Cancel Reason**:
- **HTTP Status Code**: `400 Bad Request`
```json
{
"status": "error",
"message": "Invalid cancel reason code.",
"error_code": 2001
}
```
- **Unsupported Vertical**:
- **HTTP Status Code**: `400 Bad Request`
```json
{
"status": "error",
"message": "Invalid vertical specified.",
"error_code": 2002
}
```
- **No Active Order**:
- **HTTP Status Code**: `404 Not Found`
```json
{
"status": "error",
"message": "No active order found for the user.",
"error_code": 2003
}
```
- **User Not Eligible to Cancel**:
- **HTTP Status Code**: `403 Forbidden`
```json
{
"status": "error",
"message": "User is not eligible to cancel the order.",
"error_code": 2004
}
```
---
### 4. Get Cancellation Reasons
**Endpoint:** `GET /api/cancellation-reasons`
**Description:** Retrieve a list of applicable cancellation reasons based on city, country, ride type, and user type.
#### Request:
- **Headers**:
- `Client-Id`: Client ID issued during registration.
- `Client-Secret`: Client Secret issued during registration.
- **Query Parameters**:
- `city_id` (integer): City identifier
- `country_id` (integer): Country identifier (1 for BD, 2 for NP)
- `ride_type` (string): Type of ride (1: Bike, 2: CarLite, 3: CarPlus, etc.)
- `user_type` (string): Type of user ("user" or "driver")
#### Response:
- **Success Response**:
- **HTTP Status Code**: `200 OK`
```json
{
"status": "success",
"data": {
"reasons": [
{
"id": "string",
"slug": "string",
"title": "string",
"description": "string"
}
]
}
}
```
- **Invalid Parameters**:
- **HTTP Status Code**: `400 Bad Request`
```json
{
"status": "error",
"message": "Invalid parameters provided.",
"error_code": 2005
}
```
## Error Handling
### Common Error Response Format
```json
{
"status": "error",
"message": "string",
"error_code": "integer"
}
```
### Error Codes
| Error Code | Description |
|------------|---------------------------------------------------------------------------|
| 1001 | Unregistered user (user not found in the system) |
| 1002 | Invalid phone number format |
| 2001 | Invalid cancel reason code (for `cancel-active-order` endpoint) |
| 2002 | Invalid vertical specified (e.g., unsupported vertical like "food") |
| 2003 | No active order found for the user |
| 2004 | User is not eligible to cancel the order (e.g., already completed, etc.) |
| 2005 | Invalid parameters provided for cancellation reasons request |
| 3001 | Authentication failure (missing or invalid Client-Id or Client-Secret) |
| 3002 | Rate limit exceeded (more than 10 requests per minute) |