Mobility / Public transport operations
Tbilisi Transport Company passenger information
TTC's passenger-information backend exposes the city's bus network and genuinely changing vehicle positions. It returns route and stop reference data, ordered stops and route shapes, route-specific bus coordinates with headings and next-stop IDs, stop-level live arrival predictions, and multimodal journey plans. The service is operationally rich but is not a documented open-data API: access was validated through a community TypeScript wrapper around the public passenger application.
Provenance and access
How the data is reached
JSON over HTTPS. The community wrapper calls TTC's passenger gateway with an application credential. Use server-side requests, cache selected routes, and never copy the embedded credential into client code or public documentation.
Underlying TTC data reuse terms were not found. The wrapper is MIT-licensed, but that software license does not establish a license for TTC data.
Community TypeScript wrapper
https://github.com/sxnney/ttc-api ↗- Method
- Library methods wrapping GET requests
- Format
- JSON mapped to TypeScript types
- Authentication
- Wrapper contains the passenger application's credential; do not expose it
Routes and stops API family
https://transit.ttc.com.ge/pis-gateway/api/v2 ↗- Method
- GET
- Format
- JSON
- Authentication
- Application API-key header required
Observed paths include /routes, /stops, /routes/1:{routeId}/stops and /stops/1:{stopId}/routes.
- Method
- GET with forward=true|false
- Format
- JSON array
- Authentication
- Application API-key header required
Route-specific; no validated all-vehicle endpoint.
- Method
- GET
- Format
- JSON array
- Authentication
- Application API-key header required
Accepts locale and ignoreScheduledArrivalTimes parameters.
Journey planning
https://transit.ttc.com.ge/pis-gateway/api/v2/plan ↗- Method
- GET
- Format
- JSON
- Authentication
- Application API-key header required
Observed parameters include fromPlace, toPlace, departMode, modes, optimize, and locale.
Field-level detail
What is actually returned
Route
Reference record returned by the bus-route listing.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
id | string | No | 1:R29981 | Namespaced internal route identifier.The wrapper adds a separate `1:` prefix to route-specific paths, so callers strip the returned prefix first. | reference |
shortName | string | No | 301 | Passenger-facing route number. | reference |
longName | string | No | Saint Barbare Ubani - Politkovskaya St | Route endpoints or descriptive name in the requested locale. | reference |
color | hex-color string | No | 00B38B | Display color associated with the route family. | reference |
mode | enum string | No | BUS | Transport mode.The tested route listing was requested with modes=BUS. | reference |
Stop
Stop reference record, also nested inside journey-plan legs.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
id | string | No | 1:3482 | Namespaced internal stop identifier. | reference |
code | string | Yes | 3482 | Passenger-facing or lookup stop code. | reference |
name | string | No | Dositeos Kutateli Street | Localized stop name.Some English-locale plan responses still contained Georgian names. | reference |
lat | number | No | 41.659792 | Stop latitude in WGS84 decimal degrees.Unit: degrees north. | reference |
lon | number | No | 44.901204 | Stop longitude in WGS84 decimal degrees.Unit: degrees east. | reference |
vehicleMode | enum string | No | BUS | Mode served by the stop.Observed/documented values include BUS, GONDOLA, and SUBWAY. | reference |
Vehicle position
One vehicle observed on one route and direction at request time.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
vehicleId | string | No | 1:3873 | Namespaced public-service vehicle identifier. | live |
lat | number | No | 41.6767921 | Current reported vehicle latitude.The record contains no source measurement timestamp. | live |
lon | number | No | 44.8384666 | Current reported vehicle longitude.The record contains no source measurement timestamp. | live |
heading | number | Yes | 239.97084045410156 | Vehicle heading in degrees.Null was observed for vehicles near terminals or without a current bearing. | live |
nextStopId | string | Yes | 1:1490 | Namespaced identifier of the vehicle's next stop.Null was observed for some vehicles near endpoints. | live |
Stop arrival prediction
One route prediction returned for a selected stop.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
shortName | string | No | 301 | Passenger-facing route number. | reference |
color | hex-color string | No | 00B38B | Route display color. | reference |
headsign | string | No | Politkovskaya St | Destination/headsign for this arriving pattern. | reference |
patternSuffix | string | Unknown | 1:01 | Internal route-pattern/direction suffix.Observed in live JSON but absent from the wrapper's published TypeScript interface. | reference |
vehicleMode | enum string | Unknown | BUS | Transport mode for the prediction.Observed in live JSON but absent from the wrapper's published arrival interface. | reference |
realtime | boolean | No | true | Whether the returned arrival is based on real-time information. | live |
realtimeArrivalMinutes | number | No | 6 | Predicted minutes until arrival at request time.Unit: minutes; relative to request time. | live |
scheduledArrivalMinutes | number | No | 5 | Schedule-relative minutes returned beside the prediction.Negative values were observed on other routes; semantics should be validated before treating this as delay. | derived |
Route polyline
Direction-specific route geometry.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
encodedValue | string | No | qnr}FcgrpGKCY?a@… | Google encoded-polyline representation of the route path.Decode before mapping or projecting positions onto route progress. | reference |
Journey plan root
Origin, destination, and alternative itineraries for a point-to-point request.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
from | Place object | No | { lat: 41.7151, lon: 44.8271, name: 'Origin' } | Resolved journey origin. | derived |
to | Place object | No | { lat: 41.7099, lon: 44.7929, name: 'Destination' } | Resolved journey destination. | derived |
itineraries | Itinerary[] | No | 3 alternatives | Alternative walk/bus itineraries. | derived |
Place
A journey origin, destination, or leg endpoint.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
lat | number | No | 41.7151 | Latitude in WGS84 decimal degrees. | derived |
lon | number | No | 44.8271 | Longitude in WGS84 decimal degrees. | derived |
name | string | No | Origin | Resolved or supplied place/stop name. | derived |
Itinerary
One complete journey option.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
startTime | ISO-8601 datetime string | No | 2026-07-22T09:48:39.000+00:00 | Planned start time. | derived |
endTime | ISO-8601 datetime string | No | 2026-07-22T10:23:58.000+00:00 | Planned arrival time. | derived |
duration | number | No | 2119 | Total itinerary duration.Unit: seconds. | derived |
walkTime | number | No | 894 | Total walking time.Unit: seconds. | derived |
walkDistance | number | No | 1116.57 | Total walking distance.Unit: metres. | derived |
legs | Leg[] | No | 3 legs | Ordered walking and bus legs. | derived |
Journey leg
One walk or transit segment within an itinerary.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
from | Place object | No | Origin | Leg origin. | derived |
to | Place object | No | Tsaisi Street | Leg destination. | derived |
startTime | ISO-8601 datetime string | No | 2026-07-22T09:48:39.000+00:00 | Leg start time. | derived |
endTime | ISO-8601 datetime string | No | 2026-07-22T09:53:51.000+00:00 | Leg end time. | derived |
duration | number | No | 312 | Leg duration.Unit: seconds. | derived |
legPolyline | object | No | { encodedValue: '…', color: null } | Encoded geometry and optional color for the leg. | derived |
mode | enum string | No | WALK | Leg mode.Observed values: WALK and BUS. | derived |
steps | Step[] | No | 2 walking steps | Turn-by-turn walking instructions; empty for the tested bus leg. | derived |
intermediateStops | Stop[] | Yes | 20 bus stops | Intermediate bus stops; null on walking legs. | derived |
route | Route object | Yes | { shortName: '353', … } | Transit route for bus legs; null on walking legs. | reference |
realTime | boolean | No | true | Whether the leg uses real-time information. | live |
arrivalDelay | number | No | -1530 | Delay-like value returned by the planner.Unit appears to be seconds, but large negative values were observed; do not present without validation. | live |
distance | number | No | 5090.34 | Distance of the leg.Unit: metres. | derived |
Walking step
One turn-by-turn instruction inside a walking leg.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
relativeDirection | enum-like string | No | RIGHT | Relative movement instruction.Observed values included DEPART, RIGHT, and CONTINUE. | derived |
distance | number | No | 200.83 | Instruction-segment distance.Unit: metres. | derived |
streetName | string | No | road | Street or path description. | reference |
lat | number | No | 41.7164469 | Instruction-point latitude. | derived |
lon | number | No | 44.8268461 | Instruction-point longitude. | derived |
Representative evidence
Sample records
Route 301 vehicle, arrival, and reference fragments
Retrieved 2026-07-22 13:28 Asia/Tbilisi
{
"route": {
"id": "1:R29981",
"shortName": "301",
"longName": "Saint Barbare Ubani - Politkovskaya St",
"color": "00B38B",
"mode": "BUS"
},
"vehiclePosition": {
"vehicleId": "1:3873",
"lat": 41.6767921,
"lon": 44.8384666,
"heading": 239.97084045410156,
"nextStopId": "1:1490"
},
"stopArrival": {
"shortName": "301",
"color": "00B38B",
"headsign": "Politkovskaya St",
"patternSuffix": "1:01",
"vehicleMode": "BUS",
"realtime": true,
"realtimeArrivalMinutes": 6,
"scheduledArrivalMinutes": 5
}
}The route returned seven vehicles in each direction. Three of seven forward vehicles changed coordinates in an eight-second recheck.
Journey-plan fragment
Retrieved 2026-07-22 13:48 Asia/Tbilisi
{
"startTime": "2026-07-22T09:48:39.000+00:00",
"endTime": "2026-07-22T10:23:58.000+00:00",
"duration": 2119,
"walkTime": 894,
"walkDistance": 1116.57,
"busLeg": {
"mode": "BUS",
"route": {
"shortName": "353",
"longName": "კუკია - სადგურის მოედანი"
},
"realTime": true,
"arrivalDelay": -1530,
"duration": 1225,
"distance": 5090.34,
"intermediateStopCount": 20
}
}English locale did not guarantee English names. The large negative arrivalDelay illustrates why field semantics need validation before display.
Boundaries
Reliability, caveats, and privacy
What held up
- Coordinates changed across requests eight seconds apart, confirming live rather than schedule-only movement.
- Route 301 returned ordered stops, both route polylines, positions, and arrivals in the same session.
- A Transitous-listed GTFS-realtime mirror was unreachable during parallel checks; it is not currently a safer fallback.
- Bundle a small route fixture and apply short server-side caching for any demonstration.
What can go wrong
- The API is an undocumented passenger-application backend and may change without notice.
- No underlying TTC data license or public reuse terms were found during this pass.
- Position records have no source timestamp, speed, occupancy, rider identity, accessibility, or capacity fields.
- Vehicle positions are requested route by route and direction by direction; polling all 279 routes would be inappropriate.
- English locale responses can contain Georgian names.
- Some planner delay and schedule-relative values were unexpectedly negative and require semantic validation.
Privacy boundary
- The feed identifies public-service vehicles, not passengers.
- Do not attempt to infer occupancy, individual journeys, or passenger behavior from vehicle GPS.
Cross-source possibilities
Ideas using this source
Home Before the Lights
Will electricity probably return before I arrive home?
Joined with 1 other source →Everyday lifeThe Honest Park-or-Bus Decision
Which option offers the certainty I need right now?
Joined with 1 other source →Everyday lifeWait Inside
How much longer can I remain indoors and still catch the bus?
Joined with 2 other sources →Care & accessCan This Shift Get Me Home?
Does public transport still operate after this job is likely to finish?
Joined with 2 other sources →Source trail
Primary pages and documentation
https://github.com/sxnney/ttc-api- Wrapperttc-api package record ↗
https://www.npmjs.com/package/ttc-api https://apps.apple.com/kg/app/tbilisi-transport-company/id927903973https://transitous.org/sources/