Kyiv Digital icon

Kyiv Digital data API: cards, QR tickets, fines

Municipal Main Information and Computing Center · Utilities 4.5 ★

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

  • Kyiv Digital screenshot 1
  • Kyiv Digital screenshot 2
  • Kyiv Digital screenshot 3
  • Kyiv Digital screenshot 4
  • Kyiv Digital screenshot 5

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/otp osint

    Starts 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/session osint

    Exchanges 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/me osint

    Returns 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/cards opendata

    Lists 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/qrs opendata

    Returns 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/fines openfinance

    Lists 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/parking opendata

    Returns 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/start opendata

    Starts 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/outages opendata

    Returns 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/alert opendata

    Returns 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/stops opendata

    Lists 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/bills openfinance

    Lists 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

Get a quote