curl --request POST \
--url https://api.example.com/api/v1/ops/trip-schedules/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"routeId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d",
"transportOperatorId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c",
"vehicleId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d",
"driverId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e",
"name": "São Paulo to Campinas daily morning",
"frequency": "DAILY",
"departureAt": "2026-04-15T08:00:00.000Z",
"stops": [
{
"pointId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c",
"stopOrder": 0,
"arrivalOffsetMinutes": 120,
"departureOffsetMinutes": 135
}
],
"itineraries": [
{
"fromStopOrder": 0,
"toStopOrder": 1,
"price": 15000
}
],
"interval": 1,
"endAt": "2026-12-31T23:59:59.000Z"
}
'import requests
url = "https://api.example.com/api/v1/ops/trip-schedules/preview"
payload = {
"routeId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d",
"transportOperatorId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c",
"vehicleId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d",
"driverId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e",
"name": "São Paulo to Campinas daily morning",
"frequency": "DAILY",
"departureAt": "2026-04-15T08:00:00.000Z",
"stops": [
{
"pointId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c",
"stopOrder": 0,
"arrivalOffsetMinutes": 120,
"departureOffsetMinutes": 135
}
],
"itineraries": [
{
"fromStopOrder": 0,
"toStopOrder": 1,
"price": 15000
}
],
"interval": 1,
"endAt": "2026-12-31T23:59:59.000Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
routeId: '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d',
transportOperatorId: '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c',
vehicleId: '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d',
driverId: '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e',
name: 'São Paulo to Campinas daily morning',
frequency: 'DAILY',
departureAt: '2026-04-15T08:00:00.000Z',
stops: [
{
pointId: '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c',
stopOrder: 0,
arrivalOffsetMinutes: 120,
departureOffsetMinutes: 135
}
],
itineraries: [{fromStopOrder: 0, toStopOrder: 1, price: 15000}],
interval: 1,
endAt: '2026-12-31T23:59:59.000Z'
})
};
fetch('https://api.example.com/api/v1/ops/trip-schedules/preview', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/v1/ops/trip-schedules/preview",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'routeId' => '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d',
'transportOperatorId' => '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c',
'vehicleId' => '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d',
'driverId' => '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e',
'name' => 'São Paulo to Campinas daily morning',
'frequency' => 'DAILY',
'departureAt' => '2026-04-15T08:00:00.000Z',
'stops' => [
[
'pointId' => '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c',
'stopOrder' => 0,
'arrivalOffsetMinutes' => 120,
'departureOffsetMinutes' => 135
]
],
'itineraries' => [
[
'fromStopOrder' => 0,
'toStopOrder' => 1,
'price' => 15000
]
],
'interval' => 1,
'endAt' => '2026-12-31T23:59:59.000Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/ops/trip-schedules/preview"
payload := strings.NewReader("{\n \"routeId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"transportOperatorId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"vehicleId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"driverId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e\",\n \"name\": \"São Paulo to Campinas daily morning\",\n \"frequency\": \"DAILY\",\n \"departureAt\": \"2026-04-15T08:00:00.000Z\",\n \"stops\": [\n {\n \"pointId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"stopOrder\": 0,\n \"arrivalOffsetMinutes\": 120,\n \"departureOffsetMinutes\": 135\n }\n ],\n \"itineraries\": [\n {\n \"fromStopOrder\": 0,\n \"toStopOrder\": 1,\n \"price\": 15000\n }\n ],\n \"interval\": 1,\n \"endAt\": \"2026-12-31T23:59:59.000Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/v1/ops/trip-schedules/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"routeId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"transportOperatorId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"vehicleId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"driverId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e\",\n \"name\": \"São Paulo to Campinas daily morning\",\n \"frequency\": \"DAILY\",\n \"departureAt\": \"2026-04-15T08:00:00.000Z\",\n \"stops\": [\n {\n \"pointId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"stopOrder\": 0,\n \"arrivalOffsetMinutes\": 120,\n \"departureOffsetMinutes\": 135\n }\n ],\n \"itineraries\": [\n {\n \"fromStopOrder\": 0,\n \"toStopOrder\": 1,\n \"price\": 15000\n }\n ],\n \"interval\": 1,\n \"endAt\": \"2026-12-31T23:59:59.000Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/ops/trip-schedules/preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"routeId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"transportOperatorId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"vehicleId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"driverId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e\",\n \"name\": \"São Paulo to Campinas daily morning\",\n \"frequency\": \"DAILY\",\n \"departureAt\": \"2026-04-15T08:00:00.000Z\",\n \"stops\": [\n {\n \"pointId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"stopOrder\": 0,\n \"arrivalOffsetMinutes\": 120,\n \"departureOffsetMinutes\": 135\n }\n ],\n \"itineraries\": [\n {\n \"fromStopOrder\": 0,\n \"toStopOrder\": 1,\n \"price\": 15000\n }\n ],\n \"interval\": 1,\n \"endAt\": \"2026-12-31T23:59:59.000Z\"\n}"
response = http.request(request)
puts response.read_body[
{
"status": "MATERIALIZABLE",
"description": "Driver already booked in this period",
"departureAt": "2026-04-15T08:00:00.000Z",
"estimatedArrivalAt": "2026-04-15T14:00:00.000Z"
}
]{
"errors": [
{
"message": "required",
"path": "name"
}
],
"message": "Bad Request Error",
"statusCode": 400
}{
"message": "Missing or invalid access token",
"statusCode": 401
}{
"message": "Insufficient permissions",
"statusCode": 403
}{
"message": "Internal Server Error",
"statusCode": 500
}Preview Trip Schedule
Previews the trips a schedule would materialize.
curl --request POST \
--url https://api.example.com/api/v1/ops/trip-schedules/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"routeId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d",
"transportOperatorId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c",
"vehicleId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d",
"driverId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e",
"name": "São Paulo to Campinas daily morning",
"frequency": "DAILY",
"departureAt": "2026-04-15T08:00:00.000Z",
"stops": [
{
"pointId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c",
"stopOrder": 0,
"arrivalOffsetMinutes": 120,
"departureOffsetMinutes": 135
}
],
"itineraries": [
{
"fromStopOrder": 0,
"toStopOrder": 1,
"price": 15000
}
],
"interval": 1,
"endAt": "2026-12-31T23:59:59.000Z"
}
'import requests
url = "https://api.example.com/api/v1/ops/trip-schedules/preview"
payload = {
"routeId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d",
"transportOperatorId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c",
"vehicleId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d",
"driverId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e",
"name": "São Paulo to Campinas daily morning",
"frequency": "DAILY",
"departureAt": "2026-04-15T08:00:00.000Z",
"stops": [
{
"pointId": "0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c",
"stopOrder": 0,
"arrivalOffsetMinutes": 120,
"departureOffsetMinutes": 135
}
],
"itineraries": [
{
"fromStopOrder": 0,
"toStopOrder": 1,
"price": 15000
}
],
"interval": 1,
"endAt": "2026-12-31T23:59:59.000Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
routeId: '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d',
transportOperatorId: '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c',
vehicleId: '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d',
driverId: '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e',
name: 'São Paulo to Campinas daily morning',
frequency: 'DAILY',
departureAt: '2026-04-15T08:00:00.000Z',
stops: [
{
pointId: '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c',
stopOrder: 0,
arrivalOffsetMinutes: 120,
departureOffsetMinutes: 135
}
],
itineraries: [{fromStopOrder: 0, toStopOrder: 1, price: 15000}],
interval: 1,
endAt: '2026-12-31T23:59:59.000Z'
})
};
fetch('https://api.example.com/api/v1/ops/trip-schedules/preview', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/v1/ops/trip-schedules/preview",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'routeId' => '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d',
'transportOperatorId' => '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c',
'vehicleId' => '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d',
'driverId' => '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e',
'name' => 'São Paulo to Campinas daily morning',
'frequency' => 'DAILY',
'departureAt' => '2026-04-15T08:00:00.000Z',
'stops' => [
[
'pointId' => '0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c',
'stopOrder' => 0,
'arrivalOffsetMinutes' => 120,
'departureOffsetMinutes' => 135
]
],
'itineraries' => [
[
'fromStopOrder' => 0,
'toStopOrder' => 1,
'price' => 15000
]
],
'interval' => 1,
'endAt' => '2026-12-31T23:59:59.000Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/ops/trip-schedules/preview"
payload := strings.NewReader("{\n \"routeId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"transportOperatorId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"vehicleId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"driverId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e\",\n \"name\": \"São Paulo to Campinas daily morning\",\n \"frequency\": \"DAILY\",\n \"departureAt\": \"2026-04-15T08:00:00.000Z\",\n \"stops\": [\n {\n \"pointId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"stopOrder\": 0,\n \"arrivalOffsetMinutes\": 120,\n \"departureOffsetMinutes\": 135\n }\n ],\n \"itineraries\": [\n {\n \"fromStopOrder\": 0,\n \"toStopOrder\": 1,\n \"price\": 15000\n }\n ],\n \"interval\": 1,\n \"endAt\": \"2026-12-31T23:59:59.000Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/v1/ops/trip-schedules/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"routeId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"transportOperatorId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"vehicleId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"driverId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e\",\n \"name\": \"São Paulo to Campinas daily morning\",\n \"frequency\": \"DAILY\",\n \"departureAt\": \"2026-04-15T08:00:00.000Z\",\n \"stops\": [\n {\n \"pointId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"stopOrder\": 0,\n \"arrivalOffsetMinutes\": 120,\n \"departureOffsetMinutes\": 135\n }\n ],\n \"itineraries\": [\n {\n \"fromStopOrder\": 0,\n \"toStopOrder\": 1,\n \"price\": 15000\n }\n ],\n \"interval\": 1,\n \"endAt\": \"2026-12-31T23:59:59.000Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/ops/trip-schedules/preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"routeId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"transportOperatorId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"vehicleId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d\",\n \"driverId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e\",\n \"name\": \"São Paulo to Campinas daily morning\",\n \"frequency\": \"DAILY\",\n \"departureAt\": \"2026-04-15T08:00:00.000Z\",\n \"stops\": [\n {\n \"pointId\": \"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c\",\n \"stopOrder\": 0,\n \"arrivalOffsetMinutes\": 120,\n \"departureOffsetMinutes\": 135\n }\n ],\n \"itineraries\": [\n {\n \"fromStopOrder\": 0,\n \"toStopOrder\": 1,\n \"price\": 15000\n }\n ],\n \"interval\": 1,\n \"endAt\": \"2026-12-31T23:59:59.000Z\"\n}"
response = http.request(request)
puts response.read_body[
{
"status": "MATERIALIZABLE",
"description": "Driver already booked in this period",
"departureAt": "2026-04-15T08:00:00.000Z",
"estimatedArrivalAt": "2026-04-15T14:00:00.000Z"
}
]{
"errors": [
{
"message": "required",
"path": "name"
}
],
"message": "Bad Request Error",
"statusCode": 400
}{
"message": "Missing or invalid access token",
"statusCode": 401
}{
"message": "Insufficient permissions",
"statusCode": 403
}{
"message": "Internal Server Error",
"statusCode": 500
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Comma-separated list of fields to include in the response. Supports dot notation for nested projection (e.g. id,name,user.email,trips.route.id). Unknown fields are silently dropped.
Body
Preview trip schedule payload
Route identifier
"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d"
Transport operator identifier
"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3c"
Vehicle identifier
"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3d"
Driver identifier
"0195e7a1-8b5c-7d3e-9f4a-2c6b8d0e1f3e"
Trip schedule name
"São Paulo to Campinas daily morning"
Trip schedule frequency
DAILY, WEEKLY, MONTHLY "DAILY"
First scheduled departure
"2026-04-15T08:00:00.000Z"
Trip schedule stops
2Show child attributes
Show child attributes
Trip schedule itineraries
1Show child attributes
Show child attributes
Frequency interval
1
Optional recurrence end
"2026-12-31T23:59:59.000Z"
Response
OK
Materialization status of a candidate trip
MATERIALIZABLE, CONFLICT, DUPLICATE, BLOCKED "MATERIALIZABLE"
Conflict reason when not materializable
"Driver already booked in this period"
Departure time
"2026-04-15T08:00:00.000Z"
Estimated arrival time
"2026-04-15T14:00:00.000Z"