Pricing & Estimates

Before requesting a Journey as a first step it is necessary to obtain the different products configured in your account in order to select the one that fits your needs and keep the Id that will be used in the Journey.

Through this operation you will be able to obtain not only the estimated price but also the products available for your account.

🚧

Always estimate before requesting a Journey

We highly recommend always making an estimate within 5 minutes prior to creating the Journey as this way the driver can see the price of the estimate in the offer and this increases the acceptance rate.

🚧

Product_id instead Product_name

We suggest using the Product_ID and not the Product_name when identifying a product since the name is subject to commercial changes, while the product is constant and will be available as long as Cabify offers it within the commercial offer.

Identifying the right product

Every estimation carries a product object. Each of its fields is meant for a different job:

FieldStabilityUse it for
idDifferent in every city or zoneBooking. Pass it as product_id
service_typeClosed set of valuesTelling service families apart
slugStable; the equivalent product in another city reuses itClassifying within a family
nameSubject to commercial changesDisplaying to the user

service_type is one of:

ValueMeaning
standardPassenger rides
deliveryParcel deliveries
asset_sharingVehicle sharing
mopedScooter sharing

You do not need to maintain a table of product ids per zone. /estimates only returns what is available for the origin you asked about, so the zone is already resolved for you. The recommended flow is:

  1. Call /estimates with the journey you want.
  2. Filter the results by product.service_type to pick the service family — for example delivery when your user wants to send a parcel.
  3. If you need to narrow down inside a family, such as a motorbike rather than a car for a delivery, filter by product.slug.
  4. Create the journey with the product.id of that same estimation.
🚧

Do not hardcode a product id

The same commercial service has a different id in each city or zone, so an id that works in one city will silently stop matching in another. Always take the id from the estimate you are about to book.

Inside standard, every passenger tier (basic, comfort, executive and so on) shares the same service_type, so use slug to tell them apart. Slugs do not follow a single naming convention, so treat them as values you recognise rather than strings you parse. If you need the exact slugs for the services you operate, ask us and we will confirm them.

Hub Information

When the origin of your estimate is within a large venue (airport, train station, etc.), the response will include a hub field inside each estimation object. This field contains:

  • Hub metadata (uid, title, location_id)
  • A list of meeting points — designated pick-up locations within the venue, each with coordinates, images, and localized instructions

If a hub is present, you should present the meeting points to the user and include the selected one in the journey creation request. See the Changelog for details.

📘

Hub resolution is best-effort

The hub field may be null if hub data is unavailable or takes too long to resolve. You can also use the dedicated GET /api/v4/hub endpoint to look up hub data independently.

Example: Hub in estimates response

When estimating from Madrid Atocha train station, the hub field in each estimation object will look like:

{
  "hub": {
    "uid": "562f925c-b900-4c93-bdd9-15a3d621f02f",
    "title": {
      "es": "Atocha",
      "en": "Atocha"
    },
    "location_id": "2f03be0c-8e66-414c-85be-96fb896a2157",
    "active": true,
    "meeting_points": [
      {
        "uid": "e1cbfac4-7149-482d-95fa-0b69a7f464f8",
        "title": {
          "es": "Bobedas",
          "en": "Bobedas"
        },
        "coordinates": {
          "latitude": 40.402344,
          "longitude": -3.688157
        },
        "header_image_url": null,
        "bottom_image_url": null,
        "instructions": [
          {
            "es": "Llegando de Atocha en AVE, sube por las rampas y atraviesa las cintas transportadoras hasta el vestíbulo.",
            "en": "Arriving from Atocha by AVE train, head up the ramps and walk through the moving walkways towards the arrivals hall.",
            "step_image_url": null
          },
          {
            "es": "Una vez en el vestíbulo, gira a la derecha siguiendo las indicaciones hacia P2-P3 (Parking Bóvedas).",
            "en": "Once at the arrivals hall, turn right following the signs to P2-P3 (Bóvedas Parking).",
            "step_image_url": null
          },
          {
            "es": "Sal por la puerta hacia el Parking.",
            "en": "Exit through the door to the Parking lot.",
            "step_image_url": null
          },
          {
            "es": "Espera al conductor en la acera.",
            "en": "Wait for the driver on the sidewalk.",
            "step_image_url": null
          },
          {
            "es": "Recuerda que puedes contactar al conductor en caso de cualquier duda con el punto de recogida.",
            "en": "Remember that you can contact the driver if you have any questions with the pick up point.",
            "step_image_url": null
          },
          {
            "es": "¡Disfruta el viaje! 😃",
            "en": "Enjoy the ride! 😃",
            "step_image_url": null
          }
        ]
      }
    ]
  }
}
📘

Try it in sandbox

This hub is available in the sandbox environment. Call GET /api/v4/hub?latitude=40.402344&longitude=-3.688157 or estimate with origin at those coordinates to get this response. See Sandbox Environment for details.


Did this page help you?