> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/Braian551/viax/llms.txt
> Use this file to discover all available pages before exploring further.

# Trip Pricing

> Calculate trip estimates and find nearby drivers

## Find Nearby Drivers

```
GET /viajes/find_nearby_drivers.php
```

Find available drivers near a specific location.

### Query Parameters

<ParamField query="latitud" type="number" required>
  Search center latitude
</ParamField>

<ParamField query="longitud" type="number" required>
  Search center longitude
</ParamField>

<ParamField query="tipo" type="string" required>
  Vehicle type to search for: `moto`, `auto`, or `mototaxi`
</ParamField>

<ParamField query="radius" type="number" default="5.0">
  Search radius in kilometers
</ParamField>

### Response

<ResponseField name="success" type="boolean">
  Request success status
</ResponseField>

<ResponseField name="drivers" type="array">
  List of available drivers within the radius

  <Expandable title="driver structure">
    <ResponseField name="conductor_id" type="integer">
      Driver ID
    </ResponseField>

    <ResponseField name="nombre" type="string">
      Driver name
    </ResponseField>

    <ResponseField name="calificacion" type="number">
      Driver rating (0-5)
    </ResponseField>

    <ResponseField name="vehiculo_tipo" type="string">
      Vehicle type
    </ResponseField>

    <ResponseField name="vehiculo_placa" type="string">
      Vehicle license plate
    </ResponseField>

    <ResponseField name="latitud" type="number">
      Driver current latitude
    </ResponseField>

    <ResponseField name="longitud" type="number">
      Driver current longitude
    </ResponseField>

    <ResponseField name="distancia_km" type="number">
      Distance from search location
    </ResponseField>

    <ResponseField name="tiempo_estimado_minutos" type="integer">
      Estimated arrival time in minutes
    </ResponseField>
  </Expandable>
</ResponseField>

### Request Example

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://76.13.114.194/viajes/find_nearby_drivers.php?latitud=4.6814&longitud=-74.0479&tipo=moto&radius=5" \
    -H "Accept: application/json"
  ```

  ```dart Dart theme={null}
  Future<List<Map<String, dynamic>>> findNearbyDrivers({
    required double lat,
    required double lng,
    required String tipo,
    double radius = 5.0,
  }) async {
    final response = await http.get(
      Uri.parse(
        'https://76.13.114.194/viajes/find_nearby_drivers.php?'
        'latitud=$lat&longitud=$lng&tipo=$tipo&radius=$radius',
      ),
      headers: {'Accept': 'application/json'},
    );

    if (response.statusCode == 200) {
      final data = jsonDecode(response.body);
      if (data['success'] == true) {
        return List<Map<String, dynamic>>.from(data['drivers'] ?? []);
      }
    }
    return [];
  }
  ```

  ```javascript JavaScript theme={null}
  async function findNearbyDrivers({ lat, lng, tipo, radius = 5 }) {
    const url = new URL('https://76.13.114.194/viajes/find_nearby_drivers.php');
    url.searchParams.append('latitud', lat);
    url.searchParams.append('longitud', lng);
    url.searchParams.append('tipo', tipo);
    url.searchParams.append('radius', radius);
    
    const response = await fetch(url, {
      headers: { 'Accept': 'application/json' },
    });
    
    const data = await response.json();
    return data.success ? data.drivers : [];
  }
  ```
</CodeGroup>

### Response Example

<CodeGroup>
  ```json Drivers Found theme={null}
  {
    "success": true,
    "drivers": [
      {
        "conductor_id": 25,
        "nombre": "Juan Martínez",
        "calificacion": 4.8,
        "vehiculo_tipo": "moto",
        "vehiculo_placa": "ABC123",
        "latitud": 4.6820,
        "longitud": -74.0485,
        "distancia_km": 0.8,
        "tiempo_estimado_minutos": 3
      },
      {
        "conductor_id": 32,
        "nombre": "Carlos Pérez",
        "calificacion": 4.9,
        "vehiculo_tipo": "moto",
        "vehiculo_placa": "DEF456",
        "latitud": 4.6850,
        "longitud": -74.0500,
        "distancia_km": 1.5,
        "tiempo_estimado_minutos": 5
      }
    ]
  }
  ```

  ```json No Drivers Available theme={null}
  {
    "success": false,
    "message": "No hay conductores disponibles en esta área",
    "drivers": []
  }
  ```
</CodeGroup>

***

## Price Estimation

<Note>
  The API calculates price estimates automatically when creating a trip based on distance and service type. There is currently no separate price calculation endpoint.
</Note>

### Pricing Formula

The estimated price is calculated using:

```dart theme={null}
class PriceCalculator {
  // Base fares by service type (COP)
  static const baseFares = {
    'motocicleta': 5000,
    'mototaxi': 6000,
    'auto': 8000,
  };
  
  // Price per kilometer (COP)
  static const pricePerKm = {
    'motocicleta': 2500,
    'mototaxi': 3000,
    'auto': 3500,
  };
  
  // Minimum fare (COP)
  static const minimumFare = 8000;
  
  static double calculatePrice(
    String serviceType,
    double distanceKm, {
    double surchargeMultiplier = 1.0, // For peak hours
  }) {
    final baseFare = baseFares[serviceType] ?? 5000;
    final perKm = pricePerKm[serviceType] ?? 2500;
    
    double price = baseFare + (distanceKm * perKm);
    price = price * surchargeMultiplier;
    
    // Apply minimum fare
    if (price < minimumFare) {
      price = minimumFare;
    }
    
    // Round to nearest 500
    return (price / 500).ceil() * 500;
  }
}

// Example:
final price = PriceCalculator.calculatePrice(
  'motocicleta',
  4.2,
  surchargeMultiplier: 1.0,
);
print(price); // 15500 COP
```

### Dynamic Pricing

Prices may increase during:

* **Peak hours**: 7-9 AM, 5-7 PM (Monday-Friday)
* **High demand**: When driver availability is low
* **Bad weather**: Rain, storms
* **Special events**: Holidays, concerts, sporting events

<Warning>
  Surge pricing multipliers typically range from 1.2x to 2.0x during extreme demand.
</Warning>

***

## Distance Calculation

The API uses the Haversine formula to calculate distances:

```dart theme={null}
import 'dart:math';

class DistanceCalculator {
  static const earthRadiusKm = 6371.0;
  
  static double haversineDistance(
    double lat1,
    double lon1,
    double lat2,
    double lon2,
  ) {
    final dLat = _toRadians(lat2 - lat1);
    final dLon = _toRadians(lon2 - lon1);
    
    final a = sin(dLat / 2) * sin(dLat / 2) +
        cos(_toRadians(lat1)) *
        cos(_toRadians(lat2)) *
        sin(dLon / 2) *
        sin(dLon / 2);
    
    final c = 2 * atan2(sqrt(a), sqrt(1 - a));
    
    return earthRadiusKm * c;
  }
  
  static double _toRadians(double degrees) {
    return degrees * pi / 180;
  }
}

// Example:
final distance = DistanceCalculator.haversineDistance(
  4.6814, -74.0479,  // Origen
  4.6533, -74.0602,  // Destino
);
print('${distance.toStringAsFixed(2)} km'); // 4.23 km
```

***

## Estimated Time of Arrival (ETA)

Calculate ETA based on distance and traffic conditions:

```dart theme={null}
class ETACalculator {
  // Average speeds in km/h
  static const speeds = {
    'moto': 30.0,      // Motorcycles faster in traffic
    'auto': 25.0,      // Cars slower in urban areas
    'mototaxi': 28.0,
  };
  
  static int calculateETA(
    String vehicleType,
    double distanceKm, {
    double trafficMultiplier = 1.0,
  }) {
    final speed = speeds[vehicleType] ?? 25.0;
    final adjustedSpeed = speed / trafficMultiplier;
    
    final hours = distanceKm / adjustedSpeed;
    final minutes = (hours * 60).ceil();
    
    return minutes;
  }
}

// Example:
final eta = ETACalculator.calculateETA(
  'moto',
  4.2,
  trafficMultiplier: 1.2, // 20% slower due to traffic
);
print('$eta minutos'); // 10 minutos
```

***

## Service Type Comparison

<CardGroup cols={3}>
  <Card title="Motocicleta" icon="motorcycle">
    **Base**: \$5,000 COP

    **Per km**: \$2,500 COP

    **Speed**: Fastest in traffic

    **Capacity**: 1 passenger
  </Card>

  <Card title="Mototaxi" icon="van-shuttle">
    **Base**: \$6,000 COP

    **Per km**: \$3,000 COP

    **Speed**: Fast

    **Capacity**: 1-2 passengers
  </Card>

  <Card title="Auto" icon="car">
    **Base**: \$8,000 COP

    **Per km**: \$3,500 COP

    **Speed**: Moderate

    **Capacity**: 3-4 passengers
  </Card>
</CardGroup>

***

## Error Responses

<ResponseField name="400" type="Bad Request">
  Invalid coordinates or parameters
</ResponseField>

<ResponseField name="500" type="Internal Server Error">
  Server error during search
</ResponseField>

## See Also

* [Create Trip](/api/trips/create) - Request a trip with calculated pricing
* [Trip Status](/api/trips/status) - Monitor trip progress
