← All sources
LiveLive-testedOfficial public-page backend

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.

01

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.

Reuse status

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
02

Field-level detail

What is actually returned

livereferencederivedhistoricalunknown

Route

Reference record returned by the bus-route listing.

5 fields
Field / pathTypeNull?ExampleMeaningFreshness
idstringNo1:R29981Namespaced internal route identifier.The wrapper adds a separate `1:` prefix to route-specific paths, so callers strip the returned prefix first.reference
shortNamestringNo301Passenger-facing route number.reference
longNamestringNoSaint Barbare Ubani - Politkovskaya StRoute endpoints or descriptive name in the requested locale.reference
colorhex-color stringNo00B38BDisplay color associated with the route family.reference
modeenum stringNoBUSTransport mode.The tested route listing was requested with modes=BUS.reference

Stop

Stop reference record, also nested inside journey-plan legs.

6 fields
Field / pathTypeNull?ExampleMeaningFreshness
idstringNo1:3482Namespaced internal stop identifier.reference
codestringYes3482Passenger-facing or lookup stop code.reference
namestringNoDositeos Kutateli StreetLocalized stop name.Some English-locale plan responses still contained Georgian names.reference
latnumberNo41.659792Stop latitude in WGS84 decimal degrees.Unit: degrees north.reference
lonnumberNo44.901204Stop longitude in WGS84 decimal degrees.Unit: degrees east.reference
vehicleModeenum stringNoBUSMode 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.

5 fields
Field / pathTypeNull?ExampleMeaningFreshness
vehicleIdstringNo1:3873Namespaced public-service vehicle identifier.live
latnumberNo41.6767921Current reported vehicle latitude.The record contains no source measurement timestamp.live
lonnumberNo44.8384666Current reported vehicle longitude.The record contains no source measurement timestamp.live
headingnumberYes239.97084045410156Vehicle heading in degrees.Null was observed for vehicles near terminals or without a current bearing.live
nextStopIdstringYes1:1490Namespaced 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.

8 fields
Field / pathTypeNull?ExampleMeaningFreshness
shortNamestringNo301Passenger-facing route number.reference
colorhex-color stringNo00B38BRoute display color.reference
headsignstringNoPolitkovskaya StDestination/headsign for this arriving pattern.reference
patternSuffixstringUnknown1:01Internal route-pattern/direction suffix.Observed in live JSON but absent from the wrapper's published TypeScript interface.reference
vehicleModeenum stringUnknownBUSTransport mode for the prediction.Observed in live JSON but absent from the wrapper's published arrival interface.reference
realtimebooleanNotrueWhether the returned arrival is based on real-time information.live
realtimeArrivalMinutesnumberNo6Predicted minutes until arrival at request time.Unit: minutes; relative to request time.live
scheduledArrivalMinutesnumberNo5Schedule-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.

1 fields
Field / pathTypeNull?ExampleMeaningFreshness
encodedValuestringNoqnr}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.

3 fields
Field / pathTypeNull?ExampleMeaningFreshness
fromPlace objectNo{ lat: 41.7151, lon: 44.8271, name: 'Origin' }Resolved journey origin.derived
toPlace objectNo{ lat: 41.7099, lon: 44.7929, name: 'Destination' }Resolved journey destination.derived
itinerariesItinerary[]No3 alternativesAlternative walk/bus itineraries.derived

Place

A journey origin, destination, or leg endpoint.

3 fields
Field / pathTypeNull?ExampleMeaningFreshness
latnumberNo41.7151Latitude in WGS84 decimal degrees.derived
lonnumberNo44.8271Longitude in WGS84 decimal degrees.derived
namestringNoOriginResolved or supplied place/stop name.derived

Itinerary

One complete journey option.

6 fields
Field / pathTypeNull?ExampleMeaningFreshness
startTimeISO-8601 datetime stringNo2026-07-22T09:48:39.000+00:00Planned start time.derived
endTimeISO-8601 datetime stringNo2026-07-22T10:23:58.000+00:00Planned arrival time.derived
durationnumberNo2119Total itinerary duration.Unit: seconds.derived
walkTimenumberNo894Total walking time.Unit: seconds.derived
walkDistancenumberNo1116.57Total walking distance.Unit: metres.derived
legsLeg[]No3 legsOrdered walking and bus legs.derived

Journey leg

One walk or transit segment within an itinerary.

13 fields
Field / pathTypeNull?ExampleMeaningFreshness
fromPlace objectNoOriginLeg origin.derived
toPlace objectNoTsaisi StreetLeg destination.derived
startTimeISO-8601 datetime stringNo2026-07-22T09:48:39.000+00:00Leg start time.derived
endTimeISO-8601 datetime stringNo2026-07-22T09:53:51.000+00:00Leg end time.derived
durationnumberNo312Leg duration.Unit: seconds.derived
legPolylineobjectNo{ encodedValue: '…', color: null }Encoded geometry and optional color for the leg.derived
modeenum stringNoWALKLeg mode.Observed values: WALK and BUS.derived
stepsStep[]No2 walking stepsTurn-by-turn walking instructions; empty for the tested bus leg.derived
intermediateStopsStop[]Yes20 bus stopsIntermediate bus stops; null on walking legs.derived
routeRoute objectYes{ shortName: '353', … }Transit route for bus legs; null on walking legs.reference
realTimebooleanNotrueWhether the leg uses real-time information.live
arrivalDelaynumberNo-1530Delay-like value returned by the planner.Unit appears to be seconds, but large negative values were observed; do not present without validation.live
distancenumberNo5090.34Distance of the leg.Unit: metres.derived

Walking step

One turn-by-turn instruction inside a walking leg.

5 fields
Field / pathTypeNull?ExampleMeaningFreshness
relativeDirectionenum-like stringNoRIGHTRelative movement instruction.Observed values included DEPART, RIGHT, and CONTINUE.derived
distancenumberNo200.83Instruction-segment distance.Unit: metres.derived
streetNamestringNoroadStreet or path description.reference
latnumberNo41.7164469Instruction-point latitude.derived
lonnumberNo44.8268461Instruction-point longitude.derived
03

Representative evidence

Sample records

Route 301 vehicle, arrival, and reference fragments

Retrieved 2026-07-22 13:28 Asia/Tbilisi

JSON
{
  "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

JSON
{
  "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.

04

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.
05

Cross-source possibilities

Ideas using this source