Flovi B2B Partner API v2
Welcome to the Flovi Partner Reservation API v2 documentation. Flovi is a professional car relocation logistics platform that connects car dealers, leasing companies, rental firms, and garages with a network of vetted drivers to manage vehicle transfers. This API allows B2B partners to seamlessly request real-time pricing quotes, check vehicle delivery schedules, and book relocation jobs—such as home deliveries, inter-branch transfers, service/maintenance transport, or collections of purchased vehicles—with absolute pricing certainty.
Seamless Logistics Integration: The Flovi Partner API provides a unified, RESTful interface for all your vehicle transport and relocation needs. From fetching office locations to requesting binding price quotes and confirming reservations, the API is designed to be easily embedded directly into your existing ERP, booking systems, or customer portals.
Quick Start: How to Create a Reservation
Our B2B API leverages a guaranteed 2-step reservation workflow designed to eliminate pricing friction, handle electric vehicle schedules accurately, and secure slots before confirming. For details on how to authenticate your integration, please refer to the Authentication section.
Step 1: Request a Guaranteed Quote
Send the pickup location, dropoff location, ready time, and
vehicle characteristics to
POST /customers/v2/reservation/quote. Partner offices can be queried dynamically from
GET /customers/v2/offices. Providing the registration number enables automatic
charging-break checks and heavy truck license checks.
Step 2: Present Options to Customer
The response contains a unique quoteId valid
for 15 minutes and multiple binding
delivery options. Each option includes its own
optionId, binding total price, and the exact
earliest/latest pickup and delivery timestamps.
Step 3: Confirm the Reservation
Once the customer picks their preference, send the chosen
quoteId (which uniquely locks in both the price
and chosen schedule option), vehicle details, and contact
names/phone numbers to
POST /customers/v2/reservation. This locks in the price and schedule, writing them
directly to the Flovi database.
Warning:
In Production, this creates a real transport job dispatched
to freelance drivers immediately!
Authentication
How to Obtain your API Key
All B2B v2 requests require authentication via a secure Partner API Key. You can generate and retrieve your key directly from the stage.customer.flovi.io/profile dashboard (for Staging) or customer.flovi.io/profile dashboard (for Production). Keep this key strictly confidential, as it grants full programmatic access to your Flovi account.
API Base URL & Environments
Depending on your environment, prepend all endpoint paths with one of the following base URLs:
| Environment | Base URL | Description |
|---|---|---|
| Staging |
https://flovi-customer-api-sg3z5hpkva-lz.a.run.app
|
Staging environment for testing and integration. |
| Production |
https://flovi-customer-api-portuwrnaa-lz.a.run.app
|
Live production API gateway. |
Required HTTP Header
You must include your API Key in the HTTP headers of every request:
| Header Key | Type | Description |
|---|---|---|
| x-api-key | string |
Your secure B2B partner API key (e.g.
flo_partner_...).
|
Errors & Validation
The API uses standard HTTP response status codes to indicate the success or failure of requests. When an error occurs, the response body contains a JSON object with structured details to help you diagnose and handle the problem.
Correlation ID: Every error response includes
a unique correlationId. Please include this ID
when contacting support to help us trace and debug the request
instantly.
Error Response Structure
Every error payload adheres to the following consistent structure:
| Property | Type | Description |
|---|---|---|
| statusCode | number |
The HTTP status code matching the response header (e.g.
400).
|
| errorCode | string |
A machine-readable string key representing the error
category (e.g. VALIDATION_ERROR).
|
| timestamp | string | ISO 8601 formatted timestamp of when the error occurred. |
| path | string | The API request URL path that triggered the error. |
| correlationId | string | A unique UUID generated for request tracing and support references. |
| message | string | array | A descriptive error message. For request validation failures, this is a JSON array listing the exact constraints that failed. |
Standard Error Codes
Here are the typical machine-readable error codes you should handle in your integration:
| HTTP Status | errorCode | When it is returned |
|---|---|---|
400 Bad Request
|
VALIDATION_ERROR | The request payload is invalid. For example, a required parameter is missing, has an incorrect type, or vehicle specs could not be resolved from Traficom. |
401 Unauthorized
|
UNAUTHORIZED |
The x-api-key header is missing, expired, or
invalid.
|
403 Forbidden
|
FORBIDDEN | The API key is valid but you do not have permission to access the requested resource or customer store. |
404 Not Found
|
NOT_FOUND | The requested resource (e.g. office, quote option, or reservation ID) does not exist. |
409 Conflict
|
CONFLICT |
A conflict occurs, such as when a reservation is already
created using the specified quoteId or an
option ID has expired.
|
422 Unprocessable
|
UNPROCESSABLE_ENTITY | The request is syntactically valid but business rules prevent its execution (e.g., trying to book too close to pickup time). |
429 Too Many Requests
|
RATE_LIMITED | You have exceeded the rate limit threshold. Please implement back-off and retry strategies. |
500 Internal Error
|
INTERNAL_ERROR | An unexpected internal error occurred on the Flovi platform. |
Retrieves all active offices (stores) belonging to the
authenticated B2B customer (partner). These office IDs (e.g.
off_1, off_2) are compatible with the
origin/destination officeId fields in quotes and
bookings.
Response Properties
Returns a JSON array of office objects with the following fields:
| Field | Type | Description |
|---|---|---|
| id | string |
The Office ID (e.g. off_5) to be used as
officeId in quotes/bookings.
|
| name | string | The descriptive name of the office (e.g. "Helsinki HQ"). |
| street | string | The street address of the office. |
| zip | string | Postal code (e.g. "00100"). |
| city | string | City (e.g. "Helsinki"). |
| country | string | Country (e.g. "FI"). |
| lat | number | Latitude coordinate. |
| lng | number | Longitude coordinate. |
| isCostCenter | boolean | Whether this office can be used as a valid cost center. |
Calculates the binding, guaranteed price and delivery schedule. It verifies if the vehicle is electric (dynamically adding charging breaks if needed) and locks the resulting terms for 15 minutes.
Request Parameters
| Field | Type | Description |
|---|---|---|
| reservationType | string |
Type of transport. Must be one of:
officeToOffice,
homeDelivery,
serviceDrive,
purchaseCar,
replacementCar.
|
| costCenter | string |
Billing cost center reference. Must be a valid
preconfigured office/store ID fetched from the
GET /customers/v2/offices
endpoint (e.g. 1234).
|
| origin | object |
Pickup location. Must contain EITHER an
officeId
OR structured address fields.
Show Allowed Schemas (Choice)
Option 1: Office
Option 2: Custom Address
|
| destination | object |
Dropoff location. Must contain EITHER an
officeId
OR structured address fields.
Show Allowed Schemas (Choice)
Option 1: Office
Option 2: Custom Address
|
| pickupTime | string (ISO Date) |
Earliest pickup timestamp in ISO format (e.g.
2026-06-20T09:00:00Z). If the vehicle is
immediately ready for pickup, you can use the timestamp of the
next quarter hour.
|
| vehicle | object |
Vehicle characteristics. Providing this block with at
least the registration number (regNo) is required to calculate accurate EV/C1 specs, binding
schedule windows, and prices.
Show object schema
|
| returnDrive | object |
Optional return drive details. If provided, details for a
return trip transport will be included.
Show object schema
|
Response Properties
Returns a JSON object with the following fields:
| Field | Type | Description |
|---|---|---|
| expiresAt | string (ISO Date) | The absolute timestamp when the generated quote options expire (guaranteed for 15 minutes). |
| reservationType | string |
The type of reservation requested (must be one of:
officeToOffice, homeDelivery,
serviceDrive, purchaseCar,
replacementCar).
|
| origin | object |
Resolved details of the origin pickup location.
Show object schema
|
| destination | object |
Resolved details of the destination dropoff location.
Show object schema
|
| route | object |
Calculated optimal route characteristics.
Show object schema
|
| options | array (object) |
Available binding transport and speed schedule options.
Show item schema
|
| vehicle | object |
Resolved specifications of the transport vehicle.
Show object schema
|
Vaporizes booking friction by turning your guaranteed
quoteId into a confirmed job. The details specified
in the quote must match the booking parameters.
PRODUCTION DISPATCH WARNING
Calling this endpoint in the
Production environment
(https://flovi-customer-api-portuwrnaa-lz.a.run.app)
creates a live, binding transport order. The job is
immediately dispatched to real freelance drivers!
All integration development and testing MUST be conducted
exclusively in the Staging environment
(https://flovi-customer-api-sg3z5hpkva-lz.a.run.app).
Request Parameters
| Field | Type | Description |
|---|---|---|
| quoteId | string | The active, unexpired quote UUID obtained from the `/quote` endpoint. |
| contactInfo | object |
Operational contact name and phone number at pickup site.
Show object schema
|
| recipientContactInfo | object (Optional) |
Contact name and phone number at dropoff site.
Show object schema
|
| publicNotes | string (Optional) | Public notes visible to all drivers searching for gigs. |
| privateNotes | string (Optional) | Driver instructions (keys, parking info, etc.) visible only after the driver has accepted the gig. |
| deliveryTimeWindow | object (Optional) |
Precise delivery time window. Overrides the time window
from the quote. Must fall entirely within the original
quote time window, must be at least 1 hour long, and will
be automatically rounded to the nearest 15 minutes.
Show object schema
|
| externalId | string (Optional) | External identifier from your system. Use this to link the reservation to your own records (e.g. order ID, work order number). Returned in all reservation responses and webhook payloads. |
Response Properties
Returns a JSON object with the following fields:
| Field | Type | Description |
|---|---|---|
| reservationId | string | The unique system ID generated for the confirmed transport order. |
| reservationType | string |
The type of reservation requested (must be one of:
officeToOffice, homeDelivery,
serviceDrive, purchaseCar,
replacementCar).
|
| status | string | The booking status, always confirmed. |
| externalId | string | null | External identifier from your system, if provided when creating the reservation. |
| quoteId | string | The exact speed-profile quote ID confirmed from the quote calculation. |
| price | number | The final binding cost billed for the transport order. |
| currency | string |
Three-letter ISO currency code (e.g. EUR).
|
| schedule | object |
The definitive pickup and dropoff schedule window.
Show object schema
|
| vehicle | object |
The transport vehicle specs confirmed.
Show object schema
|
Allows editing basic reservation details after creation. Details like contact info, recipient contact info, and public notes can be modified. Note that any changes that affect the quote (e.g. locations, schedules) cannot be updated via this endpoint and require a reschedule.
Request Parameters
| Field | Type | Description |
|---|---|---|
| contactInfo | object (Optional) |
Operational contact name and phone number at pickup site.
Show object schema
|
| recipientContactInfo | object (Optional) |
Contact name and phone number at dropoff site.
Show object schema
|
| publicNotes | string (Optional) | Public notes visible to all drivers searching for gigs. |
| privateNotes | string (Optional) | Driver instructions (keys, parking info, etc.) visible only after the driver has accepted the gig. |
| vehicle | object (Optional) |
Vehicle details to update. Note that modifying quote-affecting fields (isElectric/fuelType, fastCharge, testPlates, requiresC1) will return a Bad Request validation error.
Show object schema
|
| returnDrive | object (Optional) |
Optional return drive update details.
Show object schema
|
NOT YET SUPPORTED
This endpoint is not yet supported in the backend. Currently, calling this returns a placeholder stub response.
Retrieves all reservations (and their associated drives/trips) belonging to the authenticated B2B customer (partner), sorted by ID in descending order (newest first). Supports cursor-based pagination.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| start | string | Optional | The reservation ID cursor (BigInt string) to start fetching after. If omitted, retrieves the first page. |
| limit | number | Optional |
Maximum number of items to return. Default is
20, maximum is 100.
|
| status | string | Optional |
Filter reservations by simplified status. Possible values:
confirmed, sealed,
cancelled, driving.
|
| regNo | string | Optional |
Filter reservations by vehicle registration number (e.g.
ABC-123).
|
Response Properties
Returns a paginated JSON object containing the reservations:
| Property | Type | Description |
|---|---|---|
| data | array |
An array of reservation objects, containing the following
fields:
Show Reservation Fields
|
| nextStart | string | null |
The cursor ID to pass as the start query
parameter to retrieve the next page of results. Null when
there are no more pages.
|
Retrieves the full details and real-time status of a specific B2B reservation by its unique BigInt ID string.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | The unique BigInt reservation ID string. |
Response Properties
Returns the full reservation object, identical to the response format of creating a reservation.
| Field | Type | Description |
|---|---|---|
| reservationId | string | Unique reservation ID. |
| reservationType | string |
The type of reservation (must be one of:
officeToOffice,
homeDelivery,
serviceDrive, purchaseCar,
replacementCar).
|
| createdAt | string | ISO timestamp of reservation creation. |
| status | string |
The reservation status. Possible values:
confirmed, sealed,
cancelled.
|
| price | number | Billed reservation price. |
| currency | string | Currency code (e.g. EUR). |
| priceBreakdown | array |
Detailed cost breakdown items.
Show object schema
|
| route | object |
Route details.
Show object schema
|
| origin | object |
Pickup location details.
Show object schema
|
| destination | object |
Dropoff location details.
Show object schema
|
| schedule | object |
Schedule details.
Show object schema
|
| vehicle | object |
Vehicle details.
Show object schema
|
| returnDrive | object | null |
Return drive details if configured.
Show object schema
|
Webhooks
Flovi supports webhooks to notify your application in real-time about important events. This allows your system to react to changes automatically without polling the API.
Creating Webhooks
Go to https://customer.flovi.io/organisation/settings, click on Webhooks -> Add. Enter your desired URL and choose the events you want to subscribe to.
The
reservation_status_change webhook
is triggered whenever the status of a reservation is updated.
Supported Events
This webhook may be triggered for the following events:
-
created- A reservation has been created. -
taken– All the drives in reservation has assigned. -
driving– The driver has started driving. -
sealed– The reservation is completed and sealed. -
final_costs- After two weeks of reservation sealing webhook is called to inform total costs. Format is the same as state: sealed, but also includes vehicles information. -
cancelled- The reservation is cancelled.
Cancelled event also adds
cancellation_reason field.
Possible reasons are:
DOUBLE_BOOKING,
NO_DRIVER_WAS_FOUND,
DRIVER_CANCELED_OR_NOT_ARRIVED, SCHEDULE_ISSUE,
DRIVER_WAS_FOUND_THROUGH_ANOTHER_WAY,
UNTRANSPORTABLE_VEHICLE and
OTHER_REASON
Webhook Security
To ensure the authenticity of incoming webhook requests, each request includes a signature header that can be used to verify the request was sent by Flovi.
Secret & Signature
When you configure a webhook endpoint, you'll receive a webhook secret. This secret is used to sign each payload using HMAC SHA256.
-
Header:
x-hub-signature - Signature Method: HMAC SHA256
- Secret: Provided in the Flovi Dashboard
Calculating Signature
To verify that a webhook request is legitimate, you can compute the HMAC SHA256 signature of the request body using your webhook secret. Here's how to calculate the signature:
-
Obtain the webhook secret
You can find your secret in the Flovi Dashboard. Keep it safe and never expose it publicly. -
Extract the request body
Read the raw request body exactly as it was received, without any modifications. -
Compute the HMAC SHA256 hash
Use the webhook secret as the key and the raw request body as the message. The output should be a lowercase hexadecimal string. -
Compare with the
x-hub-signatureheader
The signature sent by Flovi is included in thex-hub-signatureheader. Compare it against your computed hash to confirm authenticity.
Example (in Node.js)
Example Headers
Model Context Protocol (MCP)
Flovi supports the Model Context Protocol (MCP), allowing you to connect your AI agents, IDEs, and developer assistants (such as Claude Desktop, Cursor, or Windsurf) directly to the Flovi API.
By configuring the Flovi MCP server, your AI assistants can query offices, calculate quotes, and create or list reservations directly through chat interface using natural language.
Client Configuration
To connect your AI assistant, configure the MCP server by adding
the following block to your client's configuration file (e.g.
claude_desktop_config.json).
Production Environment
Live / Real CarsStaging Environment
Testing / SandboxExposed AI Tools
The Flovi MCP server exposes the following tools directly to the AI model:
-
list_offices
Retrieve the list of active B2B offices / cost centers for the authenticated partner. Use these IDs to specify origin/destination offices and cost centers in quotes and reservations. -
calculate_quote
Calculate guaranteed price options and alternative schedules for a transport order before booking. Accepts either office IDs or custom address fields. -
create_reservation
Confirm and book a live, binding transport order using a guaranteed quoteId. Supports an optionalexternalIdto link the reservation to your own system. WARNING: In production, this is immediately binding, dispatches to real drivers, and incurs real costs. Even cancelling the reservation afterwards may incur cancellation fees and costs. -
list_reservations
Retrieve all reservations and associated drives/trips belonging to the authenticated partner.
B2B Flow Sandbox
Step through real B2B integration scenarios: get a quote, then confirm a reservation.
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...