Kyiv Digital data API: cards, QR tickets, fines
Kyiv Digital (Київ Цифровий) is the official Android client of Kyiv's Municipal Main Information and Computing Center — the city IT shop behind the capital's resident super-app. After a phone OTP (and optional BankID or Diia verify) residents keep a Kyiv Card travel wallet, generate ride QR tickets, start hourly parking, pay parking and traffic fines, follow DTEK outage windows, and get air-raid alerts the moment the siren state flips; the same home also lists events, petitions, CNAP appointments, communal bills and a live transport map. The listing is 1 million-plus downloads, rated 4.5 from about 110,200 reviews; the developer block is Municipal Main Information and Computing Center at Lyskivska 2/71, Kyiv 02163, Ukraine, support [email protected]. It is a municipal services wallet rather than a commercial bank app, sitting next to Diia as the national identity rail.
Travel QR tickets stamp code against expireAt. Kyiv Card rows pin balance, balanceWallet and qrsCount. Fine rows carry pendingPenalties with sum and an optional discount; the air-raid chip flags state and lastCause; outage windows list dtekScheduleList against a saved addressId. Parking zones quote priceInfo beside their places, transport stops publish name with lat and lon, and communal bill objects expose account with amountDue. The signed-in resident card is firstName plus bankidConnected, issued against an accessToken.
Fare desks recon the same balance the travel-card screen already shows; curb kiosks price a zone from priceInfo and then start the same parking session the timer already counts; lobby screens read the live siren flag next to the next DTEK window; housing-office terminals post a communal charge against a named, BankID-linked resident — openData Studio turns that municipal ledger into callable open data.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Start phone OTP
POST
/v1/kyivdigital/otposintStarts a phone OTP login for the Kyiv Digital account.
Auth: Unauthenticated. Body is phone plus a device uuid. Guest calls send User-Agent with User/guest.
- phone
- uuid
- platform
- app_ver
- status
POST /v1/kyivdigital/otp HTTP/1.1 Content-Type: application/json X-Client-Version: 3.21.4 X-Client-Platform: 0 X-Device-UUID: 8f3a1c2e-9b44-4d21-a7e0-11c0b2d4e5f6 User-Agent: KD/3.21.4 Android/14 User/guest { "phone": "+380671234567", "device": { "uuid": "8f3a1c2e-9b44-4d21-a7e0-11c0b2d4e5f6", "platform": "android", "app_ver": "3.21.4" } }{ "status": "OTP_SENT", "phone": "+380671234567" }Exchange OTP session
POST
/v1/kyivdigital/sessionosintExchanges the SMS code for accessToken plus the signed-in firstName card.
Auth: Unauthenticated after the SMS code. Response accessToken is sent as Authorization Bearer on later calls, with X-Client-Version and X-Device-UUID.
- phone
- code
- accessToken
- tokenType
- expiresIn
- id
- firstName
- lastName
- bankidConnected
POST /v1/kyivdigital/session HTTP/1.1 Content-Type: application/json X-Client-Version: 3.21.4 X-Device-UUID: 8f3a1c2e-9b44-4d21-a7e0-11c0b2d4e5f6 { "phone": "+380671234567", "code": "482911" }{ "token": { "accessToken": "eyJhbGciOiJIUzI1NiJ9...", "tokenType": "Bearer", "expiresIn": 2592000 }, "profile": { "id": 44102, "firstName": "Olena", "lastName": "Kovalenko", "bankidConnected": true } }Signed-in profile
GET
/v1/kyivdigital/meosintReturns the signed-in resident card: names, id and bankidConnected.
Auth: Bearer accessToken from POST /v1/kyivdigital/session.
- id
- firstName
- middleName
- lastName
- bankidConnected
- phone
GET /v1/kyivdigital/me HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... Accept: application/json X-Client-Version: 3.21.4{ "id": 44102, "firstName": "Olena", "middleName": "Ivanivna", "lastName": "Kovalenko", "bankidConnected": true, "phones": [{ "phone": "+380671234567" }] }Travel cards
GET
/v1/kyivdigital/cardsopendataLists linked travel cards with balance, balanceWallet and qrsCount.
Auth: Bearer accessToken.
- id
- name
- code
- balance
- balanceWallet
- qrsCount
- monthlyTicketsBalance
GET /v1/kyivdigital/cards HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... Accept: application/json{ "cards": [{ "id": 8821, "name": "Kyiv Card", "code": "3084123456789012", "balance": 4200, "balanceWallet": 1500, "qrsCount": 4, "monthlyTicketsBalance": 1 }] }Ride QR tickets
GET
/v1/kyivdigital/qrsopendataReturns ride QR tickets with code and expireAt for validator scan.
Auth: Bearer accessToken. Scoped to a travel-card id.
- id
- code
- expireAt
- usedAt
- shared
- cardId
GET /v1/kyivdigital/qrs?cardId=8821 HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... Accept: application/json{ "tickets": [{ "id": 91002, "code": "KD-QR-91002", "expireAt": 1727902800, "usedAt": null, "shared": false, "cardId": 8821 }] }Pending fines
GET
/v1/kyivdigital/finesopenfinanceLists pendingPenalties with sum, type and optional discount.
Auth: Bearer accessToken.
- pendingPenalties
- id
- name
- type
- sum
- discount
- receipt
GET /v1/kyivdigital/fines HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... Accept: application/json{ "pendingPenalties": [{ "id": "P-20411", "name": "Parking overtime", "type": "PARKING", "sum": 34000, "discount": "50%", "receipt": "RCP-20411" }] }Hourly parking zones
GET
/v1/kyivdigital/parkingopendataReturns parking zones with title, priceInfo and places.
Auth: Bearer accessToken. Guest map views still send X-Device-UUID.
- listHash
- type
- title
- priceInfo
- places
GET /v1/kyivdigital/parking HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... Accept: application/json{ "listHash": "h-9c21", "list": [{ "type": "ZONE", "title": "Khreshchatyk", "priceInfo": "40 UAH / hour", "places": [{ "id": 12, "title": "P-12" }] }] }Start a parking session
POST
/v1/kyivdigital/parking/startopendataStarts a paid parking session and returns sessionId plus priceInfo.
Auth: Bearer accessToken.
- placeId
- carId
- sessionId
- status
- title
- priceInfo
POST /v1/kyivdigital/parking/start HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... Content-Type: application/json { "placeId": 12, "carId": 55 }{ "sessionId": 7001, "status": "ACTIVE", "title": "Khreshchatyk", "priceInfo": "40 UAH / hour" }Outage schedules
GET
/v1/kyivdigital/outagesopendataReturns DTEK outage windows as dtekScheduleList for a saved addressId.
Auth: Bearer accessToken. Address-scoped.
- addressId
- dtekScheduleList
- pdfSchedule
- faqLink
GET /v1/kyivdigital/outages?addressId=331 HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... Accept: application/json{ "addressId": 331, "dtekScheduleList": [{ "day": "2026-10-03", "hours": "09:00-13:00" }], "pdfSchedule": "https://cdn.example/outage.pdf", "faqLink": "https://cdn.example/faq" }Air-raid state
GET
/v1/kyivdigital/alertopendataReturns the live air-raid flag: state, lastCause and createdAt.
Auth: May be called as a guest. Signed-in calls still send Bearer accessToken.
- state
- lastCause
- createdAt
GET /v1/kyivdigital/alert HTTP/1.1 Accept: application/json X-Client-Version: 3.21.4 User-Agent: KD/3.21.4 Android/14 User/guest{ "state": true, "lastCause": "AIR_RAID", "createdAt": 1727900100 }Transport stops
GET
/v1/kyivdigital/stopsopendataLists city transport stops with name and coordinates.
Auth: Guest or Bearer accessToken.
- id
- name
- lat
- lon
GET /v1/kyivdigital/stops HTTP/1.1 Accept: application/json X-Client-Version: 3.21.4{ "stops": [{ "id": 421, "name": "Khreshchatyk", "lat": 50.447, "lon": 30.522 }] }Utility objects
GET
/v1/kyivdigital/billsopenfinanceLists linked utility objects with account and amountDue.
Auth: Bearer accessToken.
- id
- name
- account
- amountDue
GET /v1/kyivdigital/bills HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... Accept: application/json{ "objects": [{ "id": 77, "name": "Kyivvodokanal", "account": "12345678", "amountDue": "350.00" }] }
Data categories
- identity
- travel-cards
- qr-tickets
- fines
- parking
- outages
- air-raids
- transport-stops
- utility-bills
- auth-sessions
Where teams use this data
Validator recon against the Kyiv Card book
A fare desk reads GET /v1/kyivdigital/cards (balance, balanceWallet, qrsCount) next to GET /v1/kyivdigital/qrs (code, expireAt) so a scanned ticket matches the live card before the turnstile.
Parking and fine kiosk
A curb kiosk reads GET /v1/kyivdigital/parking (priceInfo) then POST /v1/kyivdigital/parking/start, and lists GET /v1/kyivdigital/fines (pendingPenalties sum) so overtime and zone price sit on one receipt.
Outage and siren banner
A building lobby screen joins GET /v1/kyivdigital/outages (dtekScheduleList) with GET /v1/kyivdigital/alert (state, lastCause) so residents see the next DTEK window beside the live air-raid flag.
Communal bill desk
A housing-office terminal reads GET /v1/kyivdigital/bills (account, amountDue) after GET /v1/kyivdigital/me (firstName, bankidConnected) so a communal charge is posted against a named, BankID-linked resident.
Frequently asked questions
How does Kyiv Digital authenticate API calls?
POST /v1/kyivdigital/otp starts a phone OTP. POST /v1/kyivdigital/session exchanges the SMS code for accessToken. Later calls send Authorization Bearer accessToken plus X-Client-Version and X-Device-UUID.
Which endpoints expose travel cards and QR tickets?
GET /v1/kyivdigital/cards returns balance, balanceWallet and qrsCount. GET /v1/kyivdigital/qrs returns ride tickets with code and expireAt. GET /v1/kyivdigital/me returns firstName and bankidConnected.
What parking, fine and outage fields are returned?
GET /v1/kyivdigital/parking lists title and priceInfo. POST /v1/kyivdigital/parking/start opens a session. GET /v1/kyivdigital/fines returns pendingPenalties sum. GET /v1/kyivdigital/outages returns dtekScheduleList. GET /v1/kyivdigital/alert returns state and lastCause.
Does the API cover stops and communal bills?
Yes. GET /v1/kyivdigital/stops lists stop name and coordinates. GET /v1/kyivdigital/bills returns utility account and amountDue.
Apps similar to Kyiv Digital
- Enel São Paulo — Enel São Paulo is a distributor self-care client for bills and outages; Kyiv Digital adds travel cards, ride QR tickets and air-raid alerts on top of communal bills.
- Azercell — Azercell is a carrier self-care wallet; Kyiv Digital is the Kyiv municipal super-app rather than a mobile-network cabinet.
- UPS — UPS tracks parcels; Kyiv Digital instead centres on city travel cards, parking sessions and DTEK outage windows.
- Почта России — Почта России is the Russian Post tracking client; Kyiv Digital is Kyiv's resident services wallet, not a national post app.
- Налоги ФЛ — Налоги ФЛ is Russia's Federal Tax Service self-care client; Kyiv Digital is a city super-app covering fares, fines and outages rather than a tax cabinet.
- Diia — Diia is Ukraine's national digital-services app and the identity rail Kyiv Digital can link; Kyiv Digital itself is the city travel, parking and alert wallet.
- Asiacell — Asiacell is an Iraqi carrier self-care client; Kyiv Digital is municipal rather than telecom, with Kyiv Card balances and DTEK schedules.
Topics
- kyiv digital api
- kyiv card api
- kyiv parking api
- kyiv fines api
- dtek schedule api
- air alert kyiv api
- balanceWallet
- pendingPenalties
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use