Mobility / National rail schedules and station reference
Official Georgian Railway schedule backend
The current official Georgian Railway schedule page uses an unauthenticated JSON backend that exposes a multilingual station directory, all rides operating on a requested date, and a complete ordered list of railway points for each ride. Calling points contain scheduled times while infrastructure/pass-through points contain null times. This is detailed first-party schedule data, not live train tracking: no GPS position, actual or predicted time, delay, platform, cancellation reason or occupancy field was found.
Provenance and access
How the data is reached
Unauthenticated JSON over HTTPS on the official gr.com.ge domain. The tested endpoints returned CORS Access-Control-Allow-Origin: *. The backend is undocumented, has no published rate limit and uses rideId—not the outer schedule record id or GUID—for ride details.
No explicit open-data license or API reuse terms were found; public technical access does not itself authorize republication
Official schedule page
https://www.gr.com.ge/en/schedule ↗- Method
- GET
- Format
- HTML
- Authentication
- None
Station directory
https://www.gr.com.ge/api/stations?page=1&limit=10 ↗- Method
- GET
- Format
- JSON
- Authentication
- None
Suggested stations
https://www.gr.com.ge/api/stations/suggested ↗- Method
- GET
- Format
- JSON
- Authentication
- None
Date-specific ride summaries
https://www.gr.com.ge/api/schedules/core?startDate=2026-07-22 ↗- Method
- GET
- Format
- JSON
- Authentication
- None
Page form also supplies startStationId and endStationId filters
- Method
- GET
- Format
- JSON
- Authentication
- None
Use list[].rideId, not list[].id or GUID
Server configuration
https://www.gr.com.ge/api/config/init ↗- Method
- GET
- Format
- JSON
- Authentication
- None
Field-level detail
What is actually returned
Station response wrapper
Pagination wrapper returned by /api/stations.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
status | string | No | success | API result status | derived |
data.data[] | array<object> | No | 10 records | Current station page | reference |
data.meta.itemsPerPage | integer | No | 10 | Effective page size | derived |
data.meta.totalItems | integer | No | 515 | Total station records including hidden and international points | derived |
data.meta.currentPage | integer | No | 1 | Current page number | derived |
data.meta.totalPages | integer | No | 52 | Total page count | derived |
data.meta.sortBy | array | No | [["station_country_id","DESC"]] | Applied backend sort | derived |
data.links.current | URL string | No | station page URL | Current pagination URLReturned URLs used HTTP even though the request used HTTPS | derived |
data.links.next | URL string | Yes | next station page URL | Next-page URL | derived |
data.links.last | URL string | No | last station page URL | Final-page URL | derived |
Station
Multilingual directory record; may be hidden or outside Georgia.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
id | integer | No | 220 | Website database identifierDistinct from station_id and station_code | reference |
station_id | numeric string | No | 3 | External or core station identifier | reference |
priority | number | Yes | null | Display or search priority | reference |
station_code | string | No | 54681 | Railway station code | reference |
station_country | string | No | აზერბაიჯანი | Country nameGeorgian in the sample | reference |
station_country_id | string | No | 6 | Country identifier serialized as a string | reference |
name | string | No | ბაქანი 526 კმ | Default station name | reference |
name_ka | string | No | ბაქანი 526 კმ | Georgian station name | reference |
name_en | string | No | Platform 526 km | English station name | reference |
name_ru | string | No | ПЛАТФОРМА 526 КМ | Russian station nameTrailing padding spaces were observed | reference |
hide | boolean | No | true | Whether the official UI hides the station | reference |
created_at | ISO datetime | No | 2024-07-15T12:52:32.613Z | Database-record creation timeNot service freshness | historical |
updated_at | ISO datetime | No | 2025-04-17T11:03:31.590Z | Last station-record update | historical |
deleted_at | ISO datetime | Yes | null | Soft-deletion time | historical |
Ride-summary response
Date-specific schedules returned by /api/schedules/core.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
list[] | array<object> | No | 34 records | Rides on the requested service date | reference |
paging.pageIndex | integer | No | 0 | Zero-based current page | derived |
paging.pageSize | integer | No | 99999 | Effective page size | derived |
paging.pageSizeItems[] | integer array | No | [10,20,30,34] | UI page-size choices | derived |
paging.pageCount | integer | No | 1 | Page count | derived |
paging.rowCount | integer | No | 34 | Ride count | derived |
agregateValues[].aggregate | null or unknown | Yes | null | Aggregate grouping valueagregateValues is misspelled by the API | derived |
agregateValues[].code | string | No | count | Aggregate metric code | derived |
agregateValues[].value | integer | No | 34 | Aggregate metric value | derived |
Ride summary
One train service operating on the requested date.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
id | integer | No | 24011 | Schedule-instance database IDNot valid for ride-details | reference |
guid | UUID string | No | 36170945-… | Schedule-instance GUIDNot valid for ride-details | reference |
rideId | integer | No | 21278 | Ride identifier required by the details endpoint | reference |
routeType | object | No | {id:2,code:"local",name:"local",cultureName:null} | Service categoryObserved codes: local, district and international | reference |
directionId | integer | No | 1 | Internal railway direction IDSemantics undocumented | reference |
rideNumber | integer | No | 802 | Public train number | reference |
trainUid | integer | No | 164 | Internal train UID | reference |
schedule | object | No | Tbilisi–Batumi code/name object | Schedule templateContains id, code, name and cultureName | reference |
isActive | boolean | No | true | Whether the schedule record is enabledNot proof that the train is currently moving | reference |
isApproved | boolean | No | true | Timetable approval flag | reference |
startDate | ISO datetime | No | 2026-07-22T04:00:00Z | Scheduled origin departure | reference |
endDate | ISO datetime | No | 2026-07-22T09:12:00Z | Scheduled destination arrival | reference |
startStation | code/name object | No | {id:98,code:"56014",name:"TBILISI(pass)",cultureName:null} | Origin station | reference |
endStation | code/name object | No | {id:309,code:"57151",name:"BATUMI(pass)",cultureName:null} | Destination station | reference |
numberOfStandinStation | integer | No | 5 | Number of scheduled calling or standing stationsField name is misspelled in the API | reference |
Shared code/name object
Shape shared by route types, schedules and core station references.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
id | integer | No | 98 | Internal entity ID | reference |
code | string | No | 56014 | Entity code; meaning depends on parent object | reference |
name | string | No | TBILISI(pass) | Core display name | reference |
cultureName | string | Yes | null | Localized name override | reference |
Ride detail point
One ordered passenger or infrastructure railway point in /ride-details/{rideId}.
| Field / path | Type | Null? | Example | Meaning | Freshness |
|---|---|---|---|---|---|
id | integer | No | 1277076 | Detail-row database ID | reference |
guid | UUID string | No | da7ea5d0-… | Detail-row GUID | reference |
index | integer | No | 72 | One-based order along the ride | reference |
stationId | integer | No | 385 | Internal station foreign key | reference |
station | code/name object | No | Kutaisi International Airport point | Railway point identity | reference |
distanceValue | number | No | 2 | Distance increment or segment valueUnit undocumented; values behave like kilometres | reference |
distanceCountryId | integer | Yes | 4 | Country associated with the distance segment | reference |
arrivalTimeHour | integer | Yes | 11 | Local scheduled arrival hourNull at non-calling points | reference |
arrivalTimeMinute | integer | Yes | 18 | Local scheduled arrival minute | reference |
arrivalDateTime | ISO datetime | Yes | 2026-07-22T07:18:00Z | Scheduled arrival instant | reference |
departureTimeHour | integer | Yes | 11 | Local scheduled departure hour | reference |
departureTimeMinute | integer | Yes | 22 | Local scheduled departure minute | reference |
departureDateTime | ISO datetime | Yes | 2026-07-22T07:22:00Z | Scheduled departure instant | reference |
dayNumber | integer | Yes | 0 | Day offset from ride start | reference |
isStandingStation | boolean | Yes | true | Whether the train calls at this pointNull for pass-through points | reference |
standingTime | number | No | 4 | Scheduled dwell time in minutesZero at non-stops and the origin | reference |
Representative evidence
Sample records
Train 802 ride summary
Retrieved 2026-07-22 13:42 Asia/Tbilisi
{"rideId":21278,"routeType":{"id":2,"code":"local","name":"local","cultureName":null},"rideNumber":802,"startDate":"2026-07-22T04:00:00Z","endDate":"2026-07-22T09:12:00Z","startStation":{"id":98,"code":"56014","name":"TBILISI(pass)","cultureName":null},"endStation":{"id":309,"code":"57151","name":"BATUMI(pass)","cultureName":null},"numberOfStandinStation":5}Calling point and pass-through point
Retrieved 2026-07-22 13:43 Asia/Tbilisi
[{"index":72,"station":{"id":385,"code":"57450","name":"qutaisis saertashoriso aeroporti","cultureName":null},"arrivalDateTime":"2026-07-22T07:18:00Z","departureDateTime":"2026-07-22T07:22:00Z","isStandingStation":true,"standingTime":4},{"index":2,"station":{"id":101,"code":"56020","name":"tbilisi-satv","cultureName":null},"arrivalDateTime":null,"departureDateTime":null,"isStandingStation":null,"standingTime":0}]Boundaries
Reliability, caveats, and privacy
What held up
- All endpoints returned current JSON from the official domain
- The tested ride-details parameter was independently verified as rideId
- Complete route-point ordering makes passenger calls distinguishable from pass-through infrastructure points
What can go wrong
- Undocumented public-page backend with no version or rate-limit guarantee
- No open-data/reuse license found
- Scheduled times are not actual or predicted times
- No GPS, delay, platform, cancellation reason, seat availability or occupancy fields
- Station directory includes hidden and foreign records and mixed-quality transliterations
- isActive is configuration state, not live movement
Privacy boundary
- Contains schedules and public infrastructure records, not traveler bookings or passenger identities
Source trail
Primary pages and documentation
https://www.gr.com.ge/en/schedule- PrimaryOfficial station API ↗
https://www.gr.com.ge/api/stations?page=1&limit=10 https://www.gr.com.ge/api/schedules/core?startDate=2026-07-22