WoBike icon indicating copy to clipboard operation
WoBike copied to clipboard

Does anyone know what the URL's are for Check?

Open b-a0 opened this issue 3 years ago • 10 comments

Available in NL.

Their website: https://ridecheck.app/ Their app: https://play.google.com/store/apps/details?id=app.ridecheck.android

b-a0 avatar Mar 04 '21 19:03 b-a0

I'll get their endpoints later

W1MMER avatar Mar 04 '21 19:03 W1MMER

Hey, so I downloaded the app and started querying for endpoints. Unfortunantly, I'm not going to go any further as the app is asking me for my payment details which I'm not entering. So this means that I couldn't get the map endpoints.

But I did get these endpoints:

curl 'https://api.ridecheck.app/vendors' \
-H 'Connection: keep-alive' \
-H 'Authorization: Bearer eyJraWQiOiIyOFwvRnRQWHVrUTQwWkNQRXNSNGdJSWtSd2hsR0tWRmorWkFxeElWZFF0bz0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI5YWMwMTdlMi1lZTc3LTQ2ZWMtOTRlNi0yZGQxODgzOGIxYjEiLCJldmVudF9pZCI6IjAxOGY3YjlkLThiMzUtNGY1Ni1hMTQ0LTRmY2FiOTk3Mjk0ZCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE2MTQ5Mjg2NjAsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbVwvZXUtY2VudHJhbC0xX3Z2RWc1emhCZCIsImV4cCI6MTYxNDkzMjI2MCwiaWF0IjoxNjE0OTI4NjYwLCJqdGkiOiI4YmI5ZDMwNy0xMDZhLTQyMGQtODIzMi01YzcxNGFjNmQ4OTkiLCJjbGllbnRfaWQiOiI0N3Bnb2pqbzNxaDZtZW5rZGt1c2FwN2NvcyIsInVzZXJuYW1lIjoiOWFjMDE3ZTItZWU3Ny00NmVjLTk0ZTYtMmRkMTg4MzhiMWIxIn0.Q3IVrcDjqqWsXCv8wkFDr9UItzGFbblSjAik7c70CrU9sQ7ATGz_T8808rd2VW3UYnSyvusvDGe2bjx7fRg2jSKas_jXMkl_6fZtwG185Ms2NlVTjLG9047_cf5FXf5plUYYxyIdImf2tegymMPNJEAPl30-ekgS5Zv9WS4tsWQIzpsnKfoxEEcrT4JCEdQJuAuVnKxlDFynTafVMWh1s5U-Tr70n6NHnEtuV5OgXeLnGAdu-TWqHfysiMxTGLhGUra5kOuTBazm9AH55mcgnMYm8pMk53QShtg65YOZWbvpMhjR3kXg5PU0aJPpfA16rZb5ATCJBkHKiDR7xYdblg' \
-H 'Accept-Language: en-us' \
-H 'Accept: */*' \
-H 'Host: api.ridecheck.app' \
-H 'Fingerprint: 93F3380C-3CCC-433C-9D80-5DD06752C81F' \
-H 'User-Agent: Check/1.7.2 iPhone8,1 iOS/14.4 CFNetwork/1220.1 Darwin/20.3.0' \
--proxy http://localhost:9090
curl 'https://api.ridecheck.app/cities' \
-H 'Authorization: Bearer eyJraWQiOiIyOFwvRnRQWHVrUTQwWkNQRXNSNGdJSWtSd2hsR0tWRmorWkFxeElWZFF0bz0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI5YWMwMTdlMi1lZTc3LTQ2ZWMtOTRlNi0yZGQxODgzOGIxYjEiLCJldmVudF9pZCI6IjAxOGY3YjlkLThiMzUtNGY1Ni1hMTQ0LTRmY2FiOTk3Mjk0ZCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE2MTQ5Mjg2NjAsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbVwvZXUtY2VudHJhbC0xX3Z2RWc1emhCZCIsImV4cCI6MTYxNDkzMjI2MCwiaWF0IjoxNjE0OTI4NjYwLCJqdGkiOiI4YmI5ZDMwNy0xMDZhLTQyMGQtODIzMi01YzcxNGFjNmQ4OTkiLCJjbGllbnRfaWQiOiI0N3Bnb2pqbzNxaDZtZW5rZGt1c2FwN2NvcyIsInVzZXJuYW1lIjoiOWFjMDE3ZTItZWU3Ny00NmVjLTk0ZTYtMmRkMTg4MzhiMWIxIn0.Q3IVrcDjqqWsXCv8wkFDr9UItzGFbblSjAik7c70CrU9sQ7ATGz_T8808rd2VW3UYnSyvusvDGe2bjx7fRg2jSKas_jXMkl_6fZtwG185Ms2NlVTjLG9047_cf5FXf5plUYYxyIdImf2tegymMPNJEAPl30-ekgS5Zv9WS4tsWQIzpsnKfoxEEcrT4JCEdQJuAuVnKxlDFynTafVMWh1s5U-Tr70n6NHnEtuV5OgXeLnGAdu-TWqHfysiMxTGLhGUra5kOuTBazm9AH55mcgnMYm8pMk53QShtg65YOZWbvpMhjR3kXg5PU0aJPpfA16rZb5ATCJBkHKiDR7xYdblg' \
-H 'Accept: */*' \
-H 'Fingerprint: 93F3380C-3CCC-433C-9D80-5DD06752C81F' \
-H 'Connection: keep-alive' \
-H 'User-Agent: Check/1.7.2 iPhone8,1 iOS/14.4 CFNetwork/1220.1 Darwin/20.3.0' \
-H 'Host: api.ridecheck.app' \
-H 'Accept-Language: en-us' \
--proxy http://localhost:9090
curl 'https://api.ridecheck.app/devices' \
-X POST \
-H 'Content-Length: 175' \
-H 'User-Agent: Check/1.7.2 iPhone8,1 iOS/14.4 CFNetwork/1220.1 Darwin/20.3.0' \
-H 'Content-Type: application/json' \
-H 'Host: api.ridecheck.app' \
-H 'Accept: */*' \
-H 'Fingerprint: 93F3380C-3CCC-433C-9D80-5DD06752C81F' \
-H 'Accept-Language: en-us' \
-H 'Connection: keep-alive' \
-H 'Authorization: Bearer eyJraWQiOiIyOFwvRnRQWHVrUTQwWkNQRXNSNGdJSWtSd2hsR0tWRmorWkFxeElWZFF0bz0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI5YWMwMTdlMi1lZTc3LTQ2ZWMtOTRlNi0yZGQxODgzOGIxYjEiLCJldmVudF9pZCI6IjAxOGY3YjlkLThiMzUtNGY1Ni1hMTQ0LTRmY2FiOTk3Mjk0ZCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE2MTQ5Mjg2NjAsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5ldS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbVwvZXUtY2VudHJhbC0xX3Z2RWc1emhCZCIsImV4cCI6MTYxNDkzMjI2MCwiaWF0IjoxNjE0OTI4NjYwLCJqdGkiOiI4YmI5ZDMwNy0xMDZhLTQyMGQtODIzMi01YzcxNGFjNmQ4OTkiLCJjbGllbnRfaWQiOiI0N3Bnb2pqbzNxaDZtZW5rZGt1c2FwN2NvcyIsInVzZXJuYW1lIjoiOWFjMDE3ZTItZWU3Ny00NmVjLTk0ZTYtMmRkMTg4MzhiMWIxIn0.Q3IVrcDjqqWsXCv8wkFDr9UItzGFbblSjAik7c70CrU9sQ7ATGz_T8808rd2VW3UYnSyvusvDGe2bjx7fRg2jSKas_jXMkl_6fZtwG185Ms2NlVTjLG9047_cf5FXf5plUYYxyIdImf2tegymMPNJEAPl30-ekgS5Zv9WS4tsWQIzpsnKfoxEEcrT4JCEdQJuAuVnKxlDFynTafVMWh1s5U-Tr70n6NHnEtuV5OgXeLnGAdu-TWqHfysiMxTGLhGUra5kOuTBazm9AH55mcgnMYm8pMk53QShtg65YOZWbvpMhjR3kXg5PU0aJPpfA16rZb5ATCJBkHKiDR7xYdblg' \
--cookie 'AWSELB=E395B94114F94632C55AAE3487E159CA0752529CB3ACEA9849B043AB685DFE5285CBA73A2302823D175DD8A3CC43455847FFCF86CF7D4F000A1DADA48C2D869DED68E3FC52; AWSELBCORS=E395B94114F94632C55AAE3487E159CA0752529CB3ACEA9849B043AB685DFE5285CBA73A2302823D175DD8A3CC43455847FFCF86CF7D4F000A1DADA48C2D869DED68E3FC52' \
--proxy http://localhost:9090 \
-d '{"token":"fIWTS2c1DkUwu39j6gmlTW:APA91bHYg_EMMA4CGVj8mgGIFdz9VnAo-W_JO2exBXGYNuBzg89SarDO-0BEU_xNUPV0Ct-S_OO-6z0FNZf5y13MoBZPI5teIr1Gja5Oq8Hso55h6DSAsW4WigzpnGhS0Ty8XrXztnni"}'

W1MMER avatar Mar 05 '21 07:03 W1MMER

Would you like me to close this?

W1MMER avatar Mar 05 '21 08:03 W1MMER

Are you on Android or iOS?

W1MMER avatar Mar 05 '21 08:03 W1MMER

Sorry, mixed some accounts up. I'm on Android. It's OK to close this issue for now. If I manage to setup my own sniffer and will find additional endpoints I will update this issue.

b-a0 avatar Mar 05 '21 09:03 b-a0

decompiling the apk with jadx, I get:

==> apk/check/sources/app/ridecheck/android/data/features/location/datasource/LocationApi.java <==
public interface LocationApi {
    @POST("directions/walking")
    Object getDirectionsAsync(@Body DirectionsEntity directionsEntity, Continuation<? super Response<DirectionsEntity>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/city/datasource/CityApi.java <==
public interface CityApi {
    @GET("charging-locations/{id}")
    Object getChargingPointAsync(@Path("id") String str, Continuation<? super Response<ChargingPointEntity>> continuation);

    @GET("charging-locations")
    Object getChargingPointsAsync(@Query("bounds") String str, Continuation<? super Response<List<ChargingPointEntity>>> continuation);

    @GET("cities")
    Object getCitiesAsync(Continuation<? super Response<List<CityEntity>>> continuation);

    @GET("cities/{city_id}/opening-hours")
    Object getCityOpeningHoursAsync(@Path("city_id") String str, Continuation<? super Response<List<OpeningHoursRangeEntity>>> continuation);

    @POST("destination-lookup")
    Object getDestinationLocationAsync(@Body DestinationLocationEntity destinationLocationEntity, Continuation<? super Response<DestinationLocationEntity>> continuation);

    @GET("cities/{city_id}/active-service-area")
    Object getServiceAreaAsync(@Path("city_id") String str, @Query("modality_type") String str2, Continuation<? super Response<ServiceAreaEntity>> continuation);

    @GET("service-areas")
    Object getServiceAreaTypesAsync(@Query("city_id") String str, Continuation<? super Response<List<ServiceAreaTypeEntity>>> continuation);

    @GET("vehicles/{vehicle_id}/active-service-area")
    Object getVehicleServiceAreaAsync(@Path("vehicle_id") String str, Continuation<? super Response<ServiceAreaEntity>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/payment/PaymentApi.java <==
public interface PaymentApi {
    @POST("chargebacks/{chargeback_id}/pay")
    Object createChargebackPaymentLinkAsync(@Path("chargeback_id") String str, @Body HashMap<String, String> hashMap, Continuation<? super Response<c>> continuation);

    @POST("invoices/{invoice_id}/pay")
    Object createInvoicePaymentLinkAsync(@Path("invoice_id") String str, @Body HashMap<String, String> hashMap, Continuation<? super Response<c>> continuation);

    @POST("billing/payment-profiles")
    Object createPaymentProfileAsync(@Body UserPaymentProfileRequestEntity userPaymentProfileRequestEntity, Continuation<? super Response<UserPaymentProfileEntity>> continuation);

    @POST("single-payments/{single_payment_id}/pay")
    Object createSinglePaymentPaymentLinkAsync(@Path("single_payment_id") String str, @Body HashMap<String, String> hashMap, Continuation<? super Response<c>> continuation);

    @DELETE("/billing/payment-profiles/{profile_id}")
    Object deletePaymentProfileAsync(@Path("profile_id") String str, Continuation<? super Response<UserPaymentProfileEntity>> continuation);

    @GET("chargebacks/{chargeback_id}")
    Object getChargebackAsync(@Path("chargeback_id") String str, Continuation<? super Response<l6.a>> continuation);

    @GET("chargebacks/{chargeback_id}/validate")
    Object getChargebackValidationAsync(@Path("chargeback_id") String str, Continuation<? super Response<d>> continuation);

    @GET("invoices/{invoice_id}")
    Object getInvoiceAsync(@Path("invoice_id") String str, Continuation<? super Response<InvoiceEntity>> continuation);

    @GET("invoices/{invoice_id}/pdf")
    Object getInvoiceUrlAsync(@Path("invoice_id") String str, Continuation<? super Response<InvoicePdfEntity>> continuation);

    @GET("invoices")
    Object getInvoicesAsync(@Query("status") String str, Continuation<? super Response<BasicResultEntity<List<InvoiceEntity>>>> continuation);

    @GET("billing/payment-profiles/{profile_id}")
    Object getPaymentProfileAsync(@Path("profile_id") String str, Continuation<? super Response<UserPaymentProfileEntity>> continuation);

    @GET("billing/payment-profiles")
    Object getPaymentProfilesAsync(@Query("status") String str, @Query("is_verified") Boolean bool, Continuation<? super Response<BasicResultEntity<List<UserPaymentProfileEntity>>>> continuation);

    @GET("single-payments/{single_payment_id}")
    Object getSinglePaymentAsync(@Path("single_payment_id") String str, Continuation<? super Response<b>> continuation);

    @GET("single-payments/{single_payment_id}/pdf")
    Object getSinglePaymentPdfAsync(@Path("single_payment_id") String str, Continuation<? super Response<InvoicePdfEntity>> continuation);

    @GET("single-payments/{single_payment_id}/validate")
    Object getSinglePaymentValidationAsync(@Path("single_payment_id") String str, Continuation<? super Response<d>> continuation);

    @PUT("billing/payment-profiles/{profile_id}")
    Object updatePaymentProfileAsync(@Path("profile_id") String str, @Body UserPaymentProfileEntity userPaymentProfileEntity, Continuation<? super Response<UserPaymentProfileEntity>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/vehicle/datasource/VehicleApi.java <==
public interface VehicleApi {
    @POST("cleanliness-reviews")
    Object addCleanlinessReviewAsync(@Body VehicleReviewEntity vehicleReviewEntity, Continuation<? super Response<VehicleReviewEntity>> continuation);

    @POST("parking-reviews")
    Object addParkingReviewAsync(@Body VehicleReviewEntity vehicleReviewEntity, Continuation<? super Response<VehicleReviewEntity>> continuation);

    @POST("vehicles/{vehicle_id}/damages")
    Object createDamageAsync(@Path("vehicle_id") String str, @Body DamageEntity damageEntity, Continuation<? super Response<DamageEntity>> continuation);

    @POST("vehicles/{vehicle_id}/damages/{damage_id}/upload")
    Object createDamageUploadAsync(@Path("vehicle_id") String str, @Path("damage_id") String str2, @Body RequestBody requestBody, Continuation<? super Response<DamageEntity>> continuation);

    @POST("reports")
    @Multipart
    Object createReportAsync(@Part("body") HashMap<String, String> hashMap, @Part MultipartBody.Part part, Continuation<? super Response<Unit>> continuation);

    @GET("cleanliness-reviews")
    Object getCleanlinessReviewAsync(@Query("trip_id") String str, Continuation<? super Response<BasicResultEntity<List<VehicleReviewEntity>>>> continuation);

    @GET("vehicles/{vehicle_id}/damages/{damage_id}")
    Object getDamageAsync(@Path("vehicle_id") String str, @Path("damage_id") String str2, Continuation<? super Response<DamageEntity>> continuation);

    @GET("vehicles/{vehicle_id}/damages")
    Object getDamagesAsync(@Path("vehicle_id") String str, Continuation<? super Response<List<DamageEntity>>> continuation);

    @GET("vehicles/{id}/pricing")
    Object getPricingAsync(@Path("id") String str, Continuation<? super Response<VehiclePricingEntity>> continuation);

    @GET("vehicles/{id}")
    Object getVehicleAsync(@Path("id") String str, Continuation<? super Response<VehicleEntity>> continuation);

    @GET("report-types")
    Object getVehicleReportTypesAsync(@Query("provider_type") String str, @Query("position") String str2, Continuation<? super Response<List<ReportTypeEntity>>> continuation);

    @POST("vehicles/scan")
    Object getVehiclesAsync(@Body VehicleScanEntity vehicleScanEntity, Continuation<? super Response<VehicleEntity>> continuation);

    @GET("vehicles")
    Object getVehiclesAsync(@Query("city_id") String str, @Query("bounds") String str2, @Query("modality_types") String str3, Continuation<? super Response<List<VehicleEntity>>> continuation);

    @GET("providers")
    Object getVendorsAsync(Continuation<? super Response<List<VendorEntity>>> continuation);

    @POST("vehicles/{id}/execute-command")
    Object setCommandAsync(@Path("id") String str, @Body CommandEntity commandEntity, Continuation<? super Response<Unit>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/trip/datasource/TripApi.java <==
public interface TripApi {
    @POST("feedback")
    Object createAfterTripQuestionAsync(@Body HashMap<String, String> hashMap, Continuation<? super Response<TripQuestionEntity>> continuation);

    @POST("trips/{trip_id}/upload")
    Object createAfterTripUploadAsync(@Path("trip_id") String str, @Body RequestBody requestBody, Continuation<? super Response<Unit>> continuation);

    @POST(PlaceTypes.PARK)
    Object createParkAsync(@Body ParkRequestEntity parkRequestEntity, Continuation<? super Response<BasicResultEntity<ParkEntity>>> continuation);

    @POST("reservations")
    Object createReservationAsync(@Body ReservationEntity reservationEntity, Continuation<? super Response<ReservationEntity>> continuation);

    @POST("trips")
    Object createTripAsync(@Body TripEntity tripEntity, Continuation<? super Response<TripEntity>> continuation);

    @GET("trips/active")
    Object getActiveTrip(Continuation<? super Response<TripEntity>> continuation);

    @GET("trips/{trip_id}/helmet-refresh")
    Object getHelmetSyncAsync(@Path("trip_id") String str, Continuation<? super Response<TripHelmetEntity>> continuation);

    @GET("package-types")
    Object getPackageTypesAsync(@Query("modality_type") String str, Continuation<? super Response<List<PackageTypeEntity>>> continuation);

    @GET("trips")
    Object getPaginatedTripsAsync(@Query("active") Boolean bool, @Query("page") int i10, @Query("limit") int i11, Continuation<? super Response<BasicResultEntity<List<TripEntity>>>> continuation);

    @GET("parking-reviews")
    Object getParkingReviewsAsync(@Query("page") int i10, @Query("limit") int i11, Continuation<? super Response<BasicResultEntity<List<ParkingReviewEntity>>>> continuation);

    @GET("trips/{trip_id}/receipt")
    Object getReceiptAsync(@Path("trip_id") String str, Continuation<? super Response<ReceiptEntity>> continuation);

    @GET("trips/{trip_id}/charges")
    Object getReceiptLinesAsync(@Path("trip_id") String str, Continuation<? super Response<List<ReceiptLineEntity>>> continuation);

    @GET("reservations")
    Object getReservationsAsync(Continuation<? super Response<List<ReservationEntity>>> continuation);

    @GET("trips/{trip_id}")
    Object getTripAsync(@Path("trip_id") String str, Continuation<? super Response<TripEntity>> continuation);

    @PATCH("/feedback/{answer_id}")
    Object updateAfterTripQuestionAsync(@Path("answer_id") String str, @Body HashMap<String, Object> hashMap, Continuation<? super Response<TripQuestionEntity>> continuation);

    @PUT(PlaceTypes.PARK)
    Object updateParkAsync(@Body ParkRequestEntity parkRequestEntity, Continuation<? super Response<BasicResultEntity<ParkEntity>>> continuation);

    @PUT("reservations/{reservation_id}")
    Object updateReservationAsync(@Path("reservation_id") String str, @Body ReservationRequestEntity reservationRequestEntity, Continuation<? super Response<ReservationEntity>> continuation);

    @PUT("trips/{trip_id}")
    Object updateTripAsync(@Path("trip_id") String str, @Body TripRequestEntity tripRequestEntity, Continuation<? super Response<TripEntity>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/promo/datasource/PromoApi.java <==
public interface PromoApi {
    @POST("campaign-discounts")
    Object addPromocodeAsync(@Body HashMap<String, String> hashMap, Continuation<? super Response<CampaignDiscountEntity>> continuation);

    @POST("referrals/redeem")
    Object addReferralAsync(@Body HashMap<String, String> hashMap, Continuation<? super Response<BasicResultEntity<UserCreditEntity>>> continuation);

    @GET("campaign-discounts")
    Object getUserPromoAsync(@Query("valid") Boolean bool, @Query("vehicle_id") String str, @Query("source") String str2, @Query("page") int i10, @Query("limit") int i11, @Query("order_by") String str3, Continuation<? super Response<BasicResultEntity<List<CampaignDiscountEntity>>>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/user/datasource/UserApi.java <==
public interface UserApi {
    @POST("documents")
    Object createDocumentVerificationAsync(@Body HashMap<String, String> hashMap, Continuation<? super Response<ApplicantEntity>> continuation);

    @POST("prepayments")
    Object createPrePaymentAsync(@Body PrepaymentEntity prepaymentEntity, Continuation<? super Response<PrepaymentEntity>> continuation);

    @POST("prepayments/{id}/pay")
    Object createPrePaymentLinkAsync(@Path("id") String str, @Body HashMap<String, String> hashMap, Continuation<? super Response<PrepaymentEntity>> continuation);

    @GET("address-lookup")
    Object getAddressCompletionAsync(@Query("postcode") String str, @Query("number") String str2, Continuation<? super Response<UserAddressEntity>> continuation);

    @GET("blocks")
    Object getBlocksAsync(Continuation<? super Response<List<BlockEntity>>> continuation);

    @GET("me/coin-expiry")
    Object getCoinExpiryAsync(Continuation<? super Response<CoinExpiryEntity>> continuation);

    @GET("documents")
    Object getDocumentsAsync(Continuation<? super Response<List<UserDocumentEntity>>> continuation);

    @GET("coins-earned")
    Object getEarnedCoinsAsync(@Query("trip_id") String str, @Query("active") Boolean bool, Continuation<? super Response<BasicResultEntity<List<CoinEntity>>>> continuation);

    @GET("users")
    Object getEmailValidityAsync(@Query("email") String str, Continuation<? super Response<EmailValidityEntity>> continuation);

    @GET("prepayments/{id}")
    Object getPrePaymentAsync(@Path("id") String str, Continuation<? super Response<PrepaymentEntity>> continuation);

    @GET("prepayments/{id}/validate")
    Object getPrePaymentValidationAsync(@Path("id") String str, Continuation<? super Response<PrepaymentEntity>> continuation);

    @GET("pricings?active=true")
    Object getPricingAsync(Continuation<? super Response<UserPricingEntity>> continuation);

    @GET("me/risk")
    Object getRiskProfileAsync(Continuation<? super Response<UserRiskProfileEntity>> continuation);

    @POST("documents/token")
    Object getSdkTokenAsync(@Body OnfidoTokenRequestEntity onfidoTokenRequestEntity, Continuation<? super Response<OnfidoTokenEntity>> continuation);

    @GET(PlaceTypes.ADDRESS)
    Object getUserAddressAsync(Continuation<? super Response<UserAddressEntity>> continuation);

    @GET("me")
    Object getUserAsync(Continuation<? super Response<UserEntity>> continuation);

    @POST("devices")
    Object registerPushTokenAsync(@Body HashMap<String, String> hashMap, Continuation<? super Response<UserDeviceEntity>> continuation);

    @POST("phone-verification")
    Object requestPhoneVerificationAsync(@Body PhoneVerificationEntity phoneVerificationEntity, Continuation<? super Response<PhoneVerificationEntity>> continuation);

    @POST("phone-verification/{verification_id}/verify")
    Object setPhoneVerificationAsync(@Path("verification_id") String str, @Body PhoneVerificationEntity phoneVerificationEntity, Continuation<? super Response<PhoneVerificationEntity>> continuation);

    @POST(PlaceTypes.ADDRESS)
    Object setUserAddressAsync(@Body UserAddressEntity userAddressEntity, Continuation<? super Response<UserAddressEntity>> continuation);

    @POST("me")
    Object setUserAsync(@Body RegisterUserDataEntity registerUserDataEntity, Continuation<? super Response<UserEntity>> continuation);

    @PUT("me/signup-location")
    Object updateSignupLocationAsync(@Body SignupLocationEntity signupLocationEntity, Continuation<? super Response<UserEntity>> continuation);

    @PUT("me")
    Object updateUserAsync(@Body RegisterUserDataEntity registerUserDataEntity, Continuation<? super Response<UserEntity>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/rating/RatingApi.java <==
public interface RatingApi {
    @POST("ratings")
    Object createRatingAsync(@Body RatingEntity ratingEntity, Continuation<? super Response<RatingEntity>> continuation);
}

nlitsme avatar Dec 05 '23 11:12 nlitsme

decompiling the apk with jadx, I get:

==> apk/check/sources/app/ridecheck/android/data/features/location/datasource/LocationApi.java <==
public interface LocationApi {
    @POST("directions/walking")
    Object getDirectionsAsync(@Body DirectionsEntity directionsEntity, Continuation<? super Response<DirectionsEntity>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/city/datasource/CityApi.java <==
public interface CityApi {
    @GET("charging-locations/{id}")
    Object getChargingPointAsync(@Path("id") String str, Continuation<? super Response<ChargingPointEntity>> continuation);

    @GET("charging-locations")
    Object getChargingPointsAsync(@Query("bounds") String str, Continuation<? super Response<List<ChargingPointEntity>>> continuation);

    @GET("cities")
    Object getCitiesAsync(Continuation<? super Response<List<CityEntity>>> continuation);

    @GET("cities/{city_id}/opening-hours")
    Object getCityOpeningHoursAsync(@Path("city_id") String str, Continuation<? super Response<List<OpeningHoursRangeEntity>>> continuation);

    @POST("destination-lookup")
    Object getDestinationLocationAsync(@Body DestinationLocationEntity destinationLocationEntity, Continuation<? super Response<DestinationLocationEntity>> continuation);

    @GET("cities/{city_id}/active-service-area")
    Object getServiceAreaAsync(@Path("city_id") String str, @Query("modality_type") String str2, Continuation<? super Response<ServiceAreaEntity>> continuation);

    @GET("service-areas")
    Object getServiceAreaTypesAsync(@Query("city_id") String str, Continuation<? super Response<List<ServiceAreaTypeEntity>>> continuation);

    @GET("vehicles/{vehicle_id}/active-service-area")
    Object getVehicleServiceAreaAsync(@Path("vehicle_id") String str, Continuation<? super Response<ServiceAreaEntity>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/payment/PaymentApi.java <==
public interface PaymentApi {
    @POST("chargebacks/{chargeback_id}/pay")
    Object createChargebackPaymentLinkAsync(@Path("chargeback_id") String str, @Body HashMap<String, String> hashMap, Continuation<? super Response<c>> continuation);

    @POST("invoices/{invoice_id}/pay")
    Object createInvoicePaymentLinkAsync(@Path("invoice_id") String str, @Body HashMap<String, String> hashMap, Continuation<? super Response<c>> continuation);

    @POST("billing/payment-profiles")
    Object createPaymentProfileAsync(@Body UserPaymentProfileRequestEntity userPaymentProfileRequestEntity, Continuation<? super Response<UserPaymentProfileEntity>> continuation);

    @POST("single-payments/{single_payment_id}/pay")
    Object createSinglePaymentPaymentLinkAsync(@Path("single_payment_id") String str, @Body HashMap<String, String> hashMap, Continuation<? super Response<c>> continuation);

    @DELETE("/billing/payment-profiles/{profile_id}")
    Object deletePaymentProfileAsync(@Path("profile_id") String str, Continuation<? super Response<UserPaymentProfileEntity>> continuation);

    @GET("chargebacks/{chargeback_id}")
    Object getChargebackAsync(@Path("chargeback_id") String str, Continuation<? super Response<l6.a>> continuation);

    @GET("chargebacks/{chargeback_id}/validate")
    Object getChargebackValidationAsync(@Path("chargeback_id") String str, Continuation<? super Response<d>> continuation);

    @GET("invoices/{invoice_id}")
    Object getInvoiceAsync(@Path("invoice_id") String str, Continuation<? super Response<InvoiceEntity>> continuation);

    @GET("invoices/{invoice_id}/pdf")
    Object getInvoiceUrlAsync(@Path("invoice_id") String str, Continuation<? super Response<InvoicePdfEntity>> continuation);

    @GET("invoices")
    Object getInvoicesAsync(@Query("status") String str, Continuation<? super Response<BasicResultEntity<List<InvoiceEntity>>>> continuation);

    @GET("billing/payment-profiles/{profile_id}")
    Object getPaymentProfileAsync(@Path("profile_id") String str, Continuation<? super Response<UserPaymentProfileEntity>> continuation);

    @GET("billing/payment-profiles")
    Object getPaymentProfilesAsync(@Query("status") String str, @Query("is_verified") Boolean bool, Continuation<? super Response<BasicResultEntity<List<UserPaymentProfileEntity>>>> continuation);

    @GET("single-payments/{single_payment_id}")
    Object getSinglePaymentAsync(@Path("single_payment_id") String str, Continuation<? super Response<b>> continuation);

    @GET("single-payments/{single_payment_id}/pdf")
    Object getSinglePaymentPdfAsync(@Path("single_payment_id") String str, Continuation<? super Response<InvoicePdfEntity>> continuation);

    @GET("single-payments/{single_payment_id}/validate")
    Object getSinglePaymentValidationAsync(@Path("single_payment_id") String str, Continuation<? super Response<d>> continuation);

    @PUT("billing/payment-profiles/{profile_id}")
    Object updatePaymentProfileAsync(@Path("profile_id") String str, @Body UserPaymentProfileEntity userPaymentProfileEntity, Continuation<? super Response<UserPaymentProfileEntity>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/vehicle/datasource/VehicleApi.java <==
public interface VehicleApi {
    @POST("cleanliness-reviews")
    Object addCleanlinessReviewAsync(@Body VehicleReviewEntity vehicleReviewEntity, Continuation<? super Response<VehicleReviewEntity>> continuation);

    @POST("parking-reviews")
    Object addParkingReviewAsync(@Body VehicleReviewEntity vehicleReviewEntity, Continuation<? super Response<VehicleReviewEntity>> continuation);

    @POST("vehicles/{vehicle_id}/damages")
    Object createDamageAsync(@Path("vehicle_id") String str, @Body DamageEntity damageEntity, Continuation<? super Response<DamageEntity>> continuation);

    @POST("vehicles/{vehicle_id}/damages/{damage_id}/upload")
    Object createDamageUploadAsync(@Path("vehicle_id") String str, @Path("damage_id") String str2, @Body RequestBody requestBody, Continuation<? super Response<DamageEntity>> continuation);

    @POST("reports")
    @Multipart
    Object createReportAsync(@Part("body") HashMap<String, String> hashMap, @Part MultipartBody.Part part, Continuation<? super Response<Unit>> continuation);

    @GET("cleanliness-reviews")
    Object getCleanlinessReviewAsync(@Query("trip_id") String str, Continuation<? super Response<BasicResultEntity<List<VehicleReviewEntity>>>> continuation);

    @GET("vehicles/{vehicle_id}/damages/{damage_id}")
    Object getDamageAsync(@Path("vehicle_id") String str, @Path("damage_id") String str2, Continuation<? super Response<DamageEntity>> continuation);

    @GET("vehicles/{vehicle_id}/damages")
    Object getDamagesAsync(@Path("vehicle_id") String str, Continuation<? super Response<List<DamageEntity>>> continuation);

    @GET("vehicles/{id}/pricing")
    Object getPricingAsync(@Path("id") String str, Continuation<? super Response<VehiclePricingEntity>> continuation);

    @GET("vehicles/{id}")
    Object getVehicleAsync(@Path("id") String str, Continuation<? super Response<VehicleEntity>> continuation);

    @GET("report-types")
    Object getVehicleReportTypesAsync(@Query("provider_type") String str, @Query("position") String str2, Continuation<? super Response<List<ReportTypeEntity>>> continuation);

    @POST("vehicles/scan")
    Object getVehiclesAsync(@Body VehicleScanEntity vehicleScanEntity, Continuation<? super Response<VehicleEntity>> continuation);

    @GET("vehicles")
    Object getVehiclesAsync(@Query("city_id") String str, @Query("bounds") String str2, @Query("modality_types") String str3, Continuation<? super Response<List<VehicleEntity>>> continuation);

    @GET("providers")
    Object getVendorsAsync(Continuation<? super Response<List<VendorEntity>>> continuation);

    @POST("vehicles/{id}/execute-command")
    Object setCommandAsync(@Path("id") String str, @Body CommandEntity commandEntity, Continuation<? super Response<Unit>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/trip/datasource/TripApi.java <==
public interface TripApi {
    @POST("feedback")
    Object createAfterTripQuestionAsync(@Body HashMap<String, String> hashMap, Continuation<? super Response<TripQuestionEntity>> continuation);

    @POST("trips/{trip_id}/upload")
    Object createAfterTripUploadAsync(@Path("trip_id") String str, @Body RequestBody requestBody, Continuation<? super Response<Unit>> continuation);

    @POST(PlaceTypes.PARK)
    Object createParkAsync(@Body ParkRequestEntity parkRequestEntity, Continuation<? super Response<BasicResultEntity<ParkEntity>>> continuation);

    @POST("reservations")
    Object createReservationAsync(@Body ReservationEntity reservationEntity, Continuation<? super Response<ReservationEntity>> continuation);

    @POST("trips")
    Object createTripAsync(@Body TripEntity tripEntity, Continuation<? super Response<TripEntity>> continuation);

    @GET("trips/active")
    Object getActiveTrip(Continuation<? super Response<TripEntity>> continuation);

    @GET("trips/{trip_id}/helmet-refresh")
    Object getHelmetSyncAsync(@Path("trip_id") String str, Continuation<? super Response<TripHelmetEntity>> continuation);

    @GET("package-types")
    Object getPackageTypesAsync(@Query("modality_type") String str, Continuation<? super Response<List<PackageTypeEntity>>> continuation);

    @GET("trips")
    Object getPaginatedTripsAsync(@Query("active") Boolean bool, @Query("page") int i10, @Query("limit") int i11, Continuation<? super Response<BasicResultEntity<List<TripEntity>>>> continuation);

    @GET("parking-reviews")
    Object getParkingReviewsAsync(@Query("page") int i10, @Query("limit") int i11, Continuation<? super Response<BasicResultEntity<List<ParkingReviewEntity>>>> continuation);

    @GET("trips/{trip_id}/receipt")
    Object getReceiptAsync(@Path("trip_id") String str, Continuation<? super Response<ReceiptEntity>> continuation);

    @GET("trips/{trip_id}/charges")
    Object getReceiptLinesAsync(@Path("trip_id") String str, Continuation<? super Response<List<ReceiptLineEntity>>> continuation);

    @GET("reservations")
    Object getReservationsAsync(Continuation<? super Response<List<ReservationEntity>>> continuation);

    @GET("trips/{trip_id}")
    Object getTripAsync(@Path("trip_id") String str, Continuation<? super Response<TripEntity>> continuation);

    @PATCH("/feedback/{answer_id}")
    Object updateAfterTripQuestionAsync(@Path("answer_id") String str, @Body HashMap<String, Object> hashMap, Continuation<? super Response<TripQuestionEntity>> continuation);

    @PUT(PlaceTypes.PARK)
    Object updateParkAsync(@Body ParkRequestEntity parkRequestEntity, Continuation<? super Response<BasicResultEntity<ParkEntity>>> continuation);

    @PUT("reservations/{reservation_id}")
    Object updateReservationAsync(@Path("reservation_id") String str, @Body ReservationRequestEntity reservationRequestEntity, Continuation<? super Response<ReservationEntity>> continuation);

    @PUT("trips/{trip_id}")
    Object updateTripAsync(@Path("trip_id") String str, @Body TripRequestEntity tripRequestEntity, Continuation<? super Response<TripEntity>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/promo/datasource/PromoApi.java <==
public interface PromoApi {
    @POST("campaign-discounts")
    Object addPromocodeAsync(@Body HashMap<String, String> hashMap, Continuation<? super Response<CampaignDiscountEntity>> continuation);

    @POST("referrals/redeem")
    Object addReferralAsync(@Body HashMap<String, String> hashMap, Continuation<? super Response<BasicResultEntity<UserCreditEntity>>> continuation);

    @GET("campaign-discounts")
    Object getUserPromoAsync(@Query("valid") Boolean bool, @Query("vehicle_id") String str, @Query("source") String str2, @Query("page") int i10, @Query("limit") int i11, @Query("order_by") String str3, Continuation<? super Response<BasicResultEntity<List<CampaignDiscountEntity>>>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/user/datasource/UserApi.java <==
public interface UserApi {
    @POST("documents")
    Object createDocumentVerificationAsync(@Body HashMap<String, String> hashMap, Continuation<? super Response<ApplicantEntity>> continuation);

    @POST("prepayments")
    Object createPrePaymentAsync(@Body PrepaymentEntity prepaymentEntity, Continuation<? super Response<PrepaymentEntity>> continuation);

    @POST("prepayments/{id}/pay")
    Object createPrePaymentLinkAsync(@Path("id") String str, @Body HashMap<String, String> hashMap, Continuation<? super Response<PrepaymentEntity>> continuation);

    @GET("address-lookup")
    Object getAddressCompletionAsync(@Query("postcode") String str, @Query("number") String str2, Continuation<? super Response<UserAddressEntity>> continuation);

    @GET("blocks")
    Object getBlocksAsync(Continuation<? super Response<List<BlockEntity>>> continuation);

    @GET("me/coin-expiry")
    Object getCoinExpiryAsync(Continuation<? super Response<CoinExpiryEntity>> continuation);

    @GET("documents")
    Object getDocumentsAsync(Continuation<? super Response<List<UserDocumentEntity>>> continuation);

    @GET("coins-earned")
    Object getEarnedCoinsAsync(@Query("trip_id") String str, @Query("active") Boolean bool, Continuation<? super Response<BasicResultEntity<List<CoinEntity>>>> continuation);

    @GET("users")
    Object getEmailValidityAsync(@Query("email") String str, Continuation<? super Response<EmailValidityEntity>> continuation);

    @GET("prepayments/{id}")
    Object getPrePaymentAsync(@Path("id") String str, Continuation<? super Response<PrepaymentEntity>> continuation);

    @GET("prepayments/{id}/validate")
    Object getPrePaymentValidationAsync(@Path("id") String str, Continuation<? super Response<PrepaymentEntity>> continuation);

    @GET("pricings?active=true")
    Object getPricingAsync(Continuation<? super Response<UserPricingEntity>> continuation);

    @GET("me/risk")
    Object getRiskProfileAsync(Continuation<? super Response<UserRiskProfileEntity>> continuation);

    @POST("documents/token")
    Object getSdkTokenAsync(@Body OnfidoTokenRequestEntity onfidoTokenRequestEntity, Continuation<? super Response<OnfidoTokenEntity>> continuation);

    @GET(PlaceTypes.ADDRESS)
    Object getUserAddressAsync(Continuation<? super Response<UserAddressEntity>> continuation);

    @GET("me")
    Object getUserAsync(Continuation<? super Response<UserEntity>> continuation);

    @POST("devices")
    Object registerPushTokenAsync(@Body HashMap<String, String> hashMap, Continuation<? super Response<UserDeviceEntity>> continuation);

    @POST("phone-verification")
    Object requestPhoneVerificationAsync(@Body PhoneVerificationEntity phoneVerificationEntity, Continuation<? super Response<PhoneVerificationEntity>> continuation);

    @POST("phone-verification/{verification_id}/verify")
    Object setPhoneVerificationAsync(@Path("verification_id") String str, @Body PhoneVerificationEntity phoneVerificationEntity, Continuation<? super Response<PhoneVerificationEntity>> continuation);

    @POST(PlaceTypes.ADDRESS)
    Object setUserAddressAsync(@Body UserAddressEntity userAddressEntity, Continuation<? super Response<UserAddressEntity>> continuation);

    @POST("me")
    Object setUserAsync(@Body RegisterUserDataEntity registerUserDataEntity, Continuation<? super Response<UserEntity>> continuation);

    @PUT("me/signup-location")
    Object updateSignupLocationAsync(@Body SignupLocationEntity signupLocationEntity, Continuation<? super Response<UserEntity>> continuation);

    @PUT("me")
    Object updateUserAsync(@Body RegisterUserDataEntity registerUserDataEntity, Continuation<? super Response<UserEntity>> continuation);
}

==> apk/check/sources/app/ridecheck/android/data/features/rating/RatingApi.java <==
public interface RatingApi {
    @POST("ratings")
    Object createRatingAsync(@Body RatingEntity ratingEntity, Continuation<? super Response<RatingEntity>> continuation);
}

As far as i can remember, they use jwt which requires you to sniff the communication anyways...

BastelPichi avatar Dec 05 '23 12:12 BastelPichi

There's is also this "dashboard" which shows several service providers on the map. Perhaps their endpoint can be used to obtain info on Check?

b-a0 avatar Dec 05 '23 12:12 b-a0

or this one

nlitsme avatar Dec 05 '23 12:12 nlitsme

Sniffing isnt too hard - e.g. with browserstack. However yes, multiprovider apps are sometimes an good option.

BastelPichi avatar Dec 05 '23 13:12 BastelPichi