DiDi Conductor private trip and wallet data API
DiDi Driver: Drive & Earn Cash is DiDi Global's partner app for licensed ride-hailing drivers — the Play listing still uses that English name, while the installed Android label is DiDi Conductor. Drivers sign in with a mobile number, go online on the home map, set a listen mode (destination filter, carpool, airport station, female-passenger switch) and grab broadcast trip cards, then run the serving flow from arrival at pickup through begin-charge, waypoints and trip-end fare. A wallet tab shows weekly income, today's daily earning and trip count plus a withdraw-method picker, and a cuenta cash-out screen quotes commissions before sending funds to a bound card. The app is published for DiDi's Latin American ride-hailing markets — Mexico, Chile, Argentina and Brazil among them — and competes for the same partners as Uber Driver, 99 Motorista, inDrive and Cabify.
Weekly income and today's dailyEarning sit on the wallet header next to dailyTripsNum, while each broadcast card carries newPriceValue against oldPriceValue plus passenger_star before a strive writes succ_oids. Serving then exposes pickup mFromLat/mFromLng, drop-off mToName, the passenger nickname and a mPassengerPin, and a cuenta quote splits availableBalance from commissionAmount on the chosen channelId.
Fleet payroll bots reconcile those fare and wallet fields against closed trips; a safety desk watches isOnline, mGrabMode and mOnlyFemalePassenger; treasury reads canWithdraw before a SPEI payout. openData Studio turns that partner surface 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.
Send login verification code
POST
/v1/didi-driver/session/otposintSends an SMS one-time code for driver UnifyLogin; returns errno plus prompt and voiceSupport.
Auth: None (starts driver login). Companion captcha and country-list steps live on the same login flow.
- cell
- code_type
- os_type
- country_id
- country_calling_code
- canonical_country_code
- api_version
- app_version
- lang
- role
- errno
- error
- traceId
- prompt
- voiceSupport
POST /v1/didi-driver/session/otp HTTP/1.1 Content-Type: application/json { "cell": "5215512345678", "code_type": 1, "os_type": "android", "country_id": 52, "country_calling_code": "+52", "canonical_country_code": "MX", "api_version": "1.0.2", "app_version": "7.10.54", "lang": "es-MX", "role": 1 }{ "errno": 0, "error": "", "traceId": "tr_9c81e2b0", "code_type": 1, "prompt": "Enviamos un código al **5678", "voiceSupport": true }Passport sign-in by SMS code
POST
/v1/didi-driver/session/verifyosintCompletes SMS-code sign-in on DiDi UnifyLogin and returns the ticket that dLogin exchanges for a driver session.
Auth: None (issues a login ticket). A companion code-check step lives on the same login flow.
- cell
- code
- codeType
- loginType
- ticket
- uid
- countryId
- callingCode
- role
- userType
- verifySessionId
- errno
- error
- traceId
POST /v1/didi-driver/session/verify HTTP/1.1 Content-Type: application/json { "cell": "5215512345678", "code": "482193", "codeType": 1, "loginType": 1, "country_id": 52, "country_calling_code": "+52", "canonical_country_code": "MX", "api_version": "1.0.2", "app_version": "7.10.54", "lang": "es-MX", "role": 1 }{ "errno": 0, "error": "", "traceId": "tr_9c81e2b0", "ticket": "tk_8f21c0a4", "uid": 1843921001, "cell": "5215512345678", "email": "", "countryId": 52, "callingCode": "+52", "role": 1, "userType": 1, "verifySessionId": "vs_44102" }Driver session login
POST
/v1/didi-driver/sessionosintExchanges a UnifyLogin ticket plus phone for the driver profile and mToken consumed by wallet, listen-mode and trip calls.
Auth: Login ticket from the SMS sign-in, sent as ticket. Issues mToken used as ticket on later partner calls.
- errno
- errmsg
- ticket
- phone
- ostype
- logintype
- location_country
- lang
- mToken
- mName
- mLicenseNumber
- mCarType
- mCityName
- mCompany
- mCoopMode
- mHeadUrl
- mBusinessId
- mReceiveLevel
- mIsRedirect
- mRedirectUrl
POST /v1/didi-driver/session HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=tk_8f21c0a4&phone=5215512345678&ostype=2&support_oth_phone=1&logintype=1&location_country=MX&lang=es-MX{ "errno": 0, "errmsg": "ok", "mDriveInfo": { "mToken": "drv_tok_9b0e12", "mName": "Carlos Hernández", "mLicenseNumber": "ABC1D23", "mCarType": "express", "mCityName": "Ciudad de México", "mCompany": "DiDi Global", "mCoopMode": "individual", "mHeadUrl": "/avatar/c1.jpg", "mBusinessId": 307, "mReceiveLevel": "express" }, "mIsRedirect": 0, "mRedirectUrl": "", "lang": "es-MX" }Home index info
POST
/v1/didi-driver/homeopendataLoads the home-map bootstrap: driver lock/status banner (reason, lock window) plus hall and listen-mode button flags.
Auth: ticket = mToken from the driver session login.
- errno
- errmsg
- mDriverStatusInfo
- title_bar
- title
- reason
- reason_detail
- status
- start_lock_time
- end_lock_time
- button_text
- button_link
- check_status
- is_hall_need_online
- showSetListenModeButtonActive
- show_selection_hall
- travelMode
- openRideBrand
POST /v1/didi-driver/home HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12&lang=es-MX{ "errno": 0, "errmsg": "ok", "mDriverStatusInfo": { "title_bar": "Cuenta restringida", "title": "Verificación pendiente", "reason": "document_expired", "reason_detail": "Licencia vencida", "status": 2, "start_lock_time": "2026-10-01 00:00:00", "end_lock_time": "2026-10-15 23:59:59", "button_text": "Subir documento", "button_link": "/driver/docs", "check_status": 0 }, "is_hall_need_online": 1, "showSetListenModeButtonActive": 1, "show_selection_hall": 1, "travelMode": 0, "openRideBrand": "DiDi" }Get online status
POST
/v1/didi-driver/availabilityopendataReads whether the partner is currently online plus the receiveLevel / vehicle_type the home toggle should show.
Auth: ticket = mToken from the driver session login.
- errno
- errmsg
- isOnline
- receiveLevel
- receiveLevelsType
- driver_require_levels
- transportType
- vehicle_type
POST /v1/didi-driver/availability HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12{ "errno": 0, "errmsg": "ok", "isOnline": 1, "receiveLevel": "express", "receiveLevelsType": 1, "driver_require_levels": "express,comfort", "transportType": 1, "vehicle_type": 2 }Set online status
POST
/v1/didi-driver/availability/toggleopendataToggles the partner online or offline; may return a face-verify challenge (need_verify, faceSessionId) before dispatch starts.
Auth: ticket = mToken from the driver session login.
- isOnline
- receiveLevel
- lat
- lng
- need_verify
- faceCode
- faceSessionId
- dialog_msg
- phone
- transportType
- vehicle_type
- refreshIndex
- switchCarUrl
- errno
- errmsg
POST /v1/didi-driver/availability/toggle HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12&isOnline=1&receiveLevel=express&lat=19.432608&lng=-99.133209{ "errno": 0, "errmsg": "ok", "data": { "need_verify": 0, "faceCode": 0, "faceSessionId": "", "dialog_msg": "", "phone": "5215512345678" }, "transportType": 1, "vehicle_type": 2, "refreshIndex": true, "switchCarUrl": "" }Get listen mode
POST
/v1/didi-driver/listen-sheetopendataReads the listen-mode sheet: grab vs assign, carpool, destination filter, airport station, female-passenger switch, car-level toggles and pair routes.
Auth: ticket = mToken from the driver session login. A companion setter writes the same listen sheet.
- mListenMode
- mGrabMode
- mAutoGrabFlag
- mListenCarpoolMode
- mShowDest
- mShowListenAirportStation
- mOnlyFemalePassenger
- mReceiveLevel
- mListenDistance
- dest_remaining_num
- mLevel
- mSwitch
- mCarDesc
- route_id
- from_region
- dst_region
- errno
- errmsg
POST /v1/didi-driver/listen-sheet HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12{ "errno": 0, "errmsg": "ok", "mListenMode": 1, "mGrabMode": 0, "mAutoGrabFlag": 0, "mListenCarpoolMode": 1, "mShowDest": 1, "mShowListenAirportStation": 1, "mOnlyFemalePassenger": 0, "mReceiveLevel": "express", "mListenDistance": "8", "dest_remaining_num": 3, "mLevelModeSwitchList": [ {"mLevel": 600, "mSwitch": 1, "mCarDesc": "DiDi Express", "mSwitchDesc": "Express"} ], "listen_pair_routes": [ {"route_id": "rt_12", "pair_route_id": "pr_12", "from_region": "Polanco", "dst_region": "Aeropuerto"} ] }Pull broadcast trip cards
POST
/v1/didi-driver/offersopendataPulls the next broadcast trip cards onto the map: pickup/drop addresses, passenger_star, newPriceValue vs oldPriceValue and a countdown.
Auth: ticket = mToken from the driver session login.
- total_num
- waiting_trip_num
- trip_limit
- has_next
- sleep_time
- list_tips
- order_id
- start_address
- dest_address
- start_dest_distance
- passenger_star
- head_img
- newPriceValue
- oldPriceValue
- newPriceText
- count_down_timestamp
- isShowAcceptButton
- errno
- errmsg
POST /v1/didi-driver/offers HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12&lat=19.432608&lng=-99.133209&pull_type=1{ "errno": 0, "errmsg": "ok", "data": { "total_num": 3, "waiting_trip_num": 1, "trip_limit": 5, "has_next": 0, "sleep_time": 8, "list_tips": "Nuevos viajes cerca", "list": [ { "order_id": "TqK8m2n1p0", "start_address": "Av. Reforma 222", "dest_address": "Aeropuerto T1", "start_dest_distance": "12.4 km", "passenger_star": "4.92", "head_img": "/psg/ana.jpg", "newPriceInfo": { "newPriceValue": "$86", "oldPriceValue": "$78", "newPriceText": "Tarifa estimada", "isFirstTime": 0 }, "count_down_timestamp": 1760005410, "show_count_down": true, "isShowAcceptButton": 1, "status": 0 } ] } }Strive / grab a trip
POST
/v1/didi-driver/offers/claimopendataAttempts to grab a broadcast card; returns strive status, succ_oids and the assigned NOrderInfo (mOrderId, pickup/drop, mStatus).
Auth: ticket = mToken from the driver session login.
- oid
- status
- strive_type
- succ_oids
- toast_text
- autograb_text
- waitPaxAccept
- acceptOrderMode
- is_serial
- queryInterval
- mOrderId
- mTravelId
- mFromName
- mToName
- mStatus
- passenger_id
- errno
- errmsg
POST /v1/didi-driver/offers/claim HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12&oid=TqK8m2n1p0&lat=19.432608&lng=-99.133209{ "errno": 0, "errmsg": "ok", "status": 1, "strive_type": 1, "succ_oids": "TqK8m2n1p0", "toast_text": "Viaje asignado", "autograb_text": "", "waitPaxAccept": 0, "acceptOrderMode": 1, "is_serial": 0, "queryInterval": 0, "mOrderDetailResponse": { "mCurOrder": { "mOrderId": "TqK8m2n1p0", "mTravelId": "trv_77a1", "mFromName": "Av. Reforma 222", "mToName": "Aeropuerto T1", "mStatus": 1, "passenger_id": 88001234 } } }In-trip order detail
POST
/v1/didi-driver/trips/{orderId}opendataLoads the live serving card: pickup/drop coordinates, passenger nickname and star_level, payment_view and the pickup PIN.
Auth: ticket = mToken from the driver session login.
- oid
- travel_id
- mOrderId
- mTravelId
- mFromName
- mFromLat
- mFromLng
- mToName
- mToLat
- mToLng
- mStatus
- mIsCarPool
- mIsOfflinePay
- is_pay
- pay_text
- passenger_count
- passenger_id
- nickname
- star_level
- avatar_url
- phone
- is_protect_phone
- mPassengerPin
POST /v1/didi-driver/trips/{orderId} HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12&oid=TqK8m2n1p0&travel_id=trv_77a1{ "errno": 0, "errmsg": "ok", "data": { "mCurOrder": { "mOrderId": "TqK8m2n1p0", "mTravelId": "trv_77a1", "mFromName": "Av. Reforma 222", "mFromLat": 19.4338, "mFromLng": -99.1605, "mToName": "Aeropuerto T1", "mToLat": 19.4361, "mToLng": -99.0719, "mStatus": 4, "mIsCarPool": 0, "mIsOfflinePay": 0, "is_pay": 0, "pay_text": "Tarjeta", "passenger_count": 1, "passenger_id": 88001234, "passenger_info": { "nickname": "Ana", "star_level": "4.9", "avatar_url": "/psg/ana.jpg", "phone": "+52******5678", "is_protect_phone": 1 }, "payment_view": { "pay_text": "Tarjeta", "pay_desc": "Pago en la app", "pay_icon": "/pay/card.png" }, "mPassengerPin": "4821" } } }Arrived at pickup
POST
/v1/didi-driver/trips/{orderId}/arrivedopendataMarks the driver as arrived at pickup with the current from_lat/from_lng; serving then waits for the passenger PIN.
Auth: ticket = mToken from the driver session login.
- oid
- from_lat
- from_lng
- errno
- errmsg
- httpStatus
POST /v1/didi-driver/trips/{orderId}/arrived HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12&oid=TqK8m2n1p0&from_lat=19.4338&from_lng=-99.1605{ "errno": 0, "errmsg": "ok", "httpStatus": 200 }Begin charge
POST
/v1/didi-driver/trips/{orderId}/meteropendataStarts the metered trip after PIN: returns per-order status plus a routeList of drop-off coordinates for navigation.
Auth: ticket = mToken from the driver session login. A carpool sibling starts the meter on shared trips.
- oid
- lat
- lng
- statusButtonText
- orders
- status
- to
- to_addr
- to_lat
- to_lng
- routeList
- mOid
- mPassengerName
- mLat
- mLng
- mCoordName
- mType
- errno
- errmsg
POST /v1/didi-driver/trips/{orderId}/meter HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12&oid=TqK8m2n1p0&lat=19.4338&lng=-99.1605{ "errno": 0, "errmsg": "ok", "statusButtonText": "En viaje", "orders": [ { "oid": "TqK8m2n1p0", "status": 4, "to": "Aeropuerto T1", "to_addr": "Cap. Carlos León, Terminal 1", "to_lat": 19.4361, "to_lng": -99.0719 } ], "routeList": [ { "mOid": "TqK8m2n1p0", "mPassengerName": "Ana", "mLat": 19.4361, "mLng": -99.0719, "mCoordName": "wgs84", "mType": 2 } ] }Finish order
POST
/v1/didi-driver/trips/{orderId}/completeopendataCloses the serving trip at the drop-off coordinates so the wallet can attach the fare; dEndCharge stops the meter first on some products.
Auth: ticket = mToken from the driver session login. A meter-stop sibling closes the fare clock first on some products.
- oid
- lat
- lng
- errno
- errmsg
- httpStatus
POST /v1/didi-driver/trips/{orderId}/complete HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12&oid=TqK8m2n1p0&lat=19.4361&lng=-99.0719{ "errno": 0, "errmsg": "ok", "httpStatus": 200 }Wallet all-balance query
POST
/v1/didi-driver/wallet/ledgeropenfinanceReads the cuenta cash ledger: totalBalance, totalEarning, cashback and interests that the withdraw screen quotes against.
Auth: ticket = mToken from the driver session login, sent on the wallet session. A companion ledger-entries call lives on the same wallet flow.
- totalBalance
- totalBalanceLabel
- totalBalanceTitle
- totalEarning
- totalEarningLabel
- cashback
- cashbackLabel
- interests
- interestLabel
- withoutHistory
- hasHit
- errno
- errmsg
POST /v1/didi-driver/wallet/ledger HTTP/1.1 Content-Type: application/json { "ticket": "drv_tok_9b0e12", "lang": "es-MX" }{ "errno": 0, "errmsg": "ok", "data": { "totalBalance": 482050, "totalBalanceLabel": "Saldo total", "totalBalanceTitle": "Cuenta", "totalEarning": 118630, "totalEarningLabel": "Ganancias", "cashback": 1200, "cashbackLabel": "Cashback", "interests": 0, "interestLabel": "Intereses", "withoutHistory": false, "hasHit": false } }Set default withdraw channel
POST
/v1/didi-driver/payouts/channelopenfinancePersists the wallet withdraw-manage pick: which channelId is the defaultChannelFlag=1 payout rail.
Auth: ticket = mToken from the driver session login.
- errno
- errmsg
- channelId
- defaultChannelFlag
POST /v1/didi-driver/payouts/channel HTTP/1.1 Content-Type: application/x-www-form-urlencoded ticket=drv_tok_9b0e12&channelId=spei&defaultChannelFlag=1{ "errno": 0, "errmsg": "ok" }Quote a manual withdrawal
POST
/v1/didi-driver/payouts/quoteopenfinanceQuotes a cuenta cash-out: oriAmount vs commissionAmount plus DriverWithdrawInfo (realBalance, availableBalance, canWithdraw).
Auth: ticket = mToken from the driver session login, sent on the wallet session. A companion create step books the payout after this quote.
- channelId
- amount
- channelName
- oriAmount
- inputAmount
- commissionAmount
- realBalance
- availableBalance
- realBalanceSplit
- availableBalanceSplit
- canWithdraw
- hasBindAccount
- showTransferIn
- errno
- errmsg
POST /v1/didi-driver/payouts/quote HTTP/1.1 Content-Type: application/json { "ticket": "drv_tok_9b0e12", "channelId": "spei", "amount": 250000 }{ "errno": 0, "errmsg": "ok", "data": { "channelName": "SPEI", "oriAmount": ["$", "2,500.00"], "inputAmount": ["$", "2,500.00"], "commissionAmount": ["$", "8.00"], "driverInfo": { "realBalance": 482050, "availableBalance": 250000, "realBalanceSplit": ["$", "4,820.50"], "availableBalanceSplit": ["$", "2,500.00"], "canWithdraw": true, "hasBindAccount": true, "showTransferIn": false } } }
Data categories
- identity
- sessions
- driver-profile
- online-status
- listen-mode
- trip-offers
- trip-serving
- fares
- wallet-income
- payouts
Where teams use this data
Partner-fleet payroll reconciliation
A fleet operator pulls totalBalance and totalEarning from the cuenta ledger plus income and dailyEarning from the native wallet header, then matches each closed trip's mOrderId and pay_text against realBalance so cash vs in-app fares land in the right cost center.
Dispatch-mode compliance dashboard
A safety desk watches isOnline, mGrabMode, mOnlyFemalePassenger and dest_remaining_num so a city that restricts airport-station listening or female-only trips can flag partners whose listen sheet drifted off policy.
Offer-card yield analytics
A marketplace analyst stores newPriceValue vs oldPriceValue, passenger_star and start_dest_distance from dPullOrder cards, then joins strive succ_oids to see which fare bands actually convert into assigned trips.
Payout-rail treasury
A treasury bot reads channelId / defaultChannelFlag from the withdraw menu and the calculate quote (availableBalance, commissionAmount, canWithdraw) before booking a SPEI or card payout, and retries only when hasBindAccount is true.
Frequently asked questions
How does DiDi Conductor authenticate a driver?
The app sends an SMS one-time code to the partner's mobile number, then exchanges it for a ticket, uid and cell. A follow-up session call trades that ticket plus phone for mToken, which later partner calls send as ticket.
What income fields does the wallet surface return?
The cuenta ledger fills totalBalance, totalEarning, cashback and interests. The native wallet card additionally carries income, dailyEarning, dailyTripsNum and currentSymbol, and the withdraw-method list exposes channelId plus defaultChannelFlag.
Which trip fields are on a live serving card?
A live trip returns mOrderId, mTravelId, mFromName/Lat/Lng, mToName/Lat/Lng, mStatus, passenger nickname and star_level, payment_view.pay_text and mPassengerPin. Begin-charge adds routeList drop-off coordinates.
Is this a public DiDi developer API?
No. These are first-party partner endpoints the Android driver app calls after login. They are documented here as a data surface, not as a supported partner SDK.
Apps similar to DiDi Driver: Drive & Earn Cash
- Uber - Driver: Drive & Deliver — Uber's driver app lets partners go online, accept ride and delivery requests, track earnings, and cash out weekly to a bank account or via Instant Pay.
- 99 Motorista e Entregador — 99 Motorista e Entregador is the Brazil partner app for 99's vehicle-for-hire and 99 Food services; DiDi purchased the remainder of 99 in 2018, and the platform operates in about 500 Brazilian cities.
- inDrive — inDrive is a ride-hailing app in which the rider proposes a fare and the driver accepts, counters or declines; it entered Latin America in Mexico in 2018 and later expanded to Chile, Brazil and other countries in the region.
- Cabify — Cabify is a Spanish ride-hailing platform that matches passengers with private drivers in Chile, Argentina, Peru, Colombia and Spain.
- Soy Rappi - Sé un repartidor — Soy Rappi is Rappi's courier app for independent Rappitenderos who deliver restaurant, grocery and other on-demand orders in Mexico, Brazil, Chile and Argentina.
- iFood para Entregadores — iFood para Entregadores is the courier partner app for iFood, the Brazilian online food-ordering and delivery platform.
- DiDi Delivery: Deliver & Earn — DiDi Delivery is DiDi Global's courier app for meal and parcel drops; DiDi Food launched in 2018 and is listed as available in Mexico, Brazil and China.
Topics
- DiDi Conductor API
- DiDi Driver data API
- driver wallet dailyEarning
- DiDi listen mode mGrabMode
- cuenta availableBalance
- DiDi partner mToken
- newPriceValue trip cards
- UnifyLogin ticket
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