Download OpenAPI specification:
The Analytics API enables provides access to realtime and historical analytics data.
| Date | Version | Notes |
|---|---|---|
| Thu Nov 14 2024 | 1.8.0 | Add direct link between trip and subscription via anonymised id |
| Thu Oct 03 2024 | 1.7.0 | Add voucher code endpoint |
| Mon Jan 22 2024 | 1.9.0 | Add attached partner ids to users |
| Mon Jan 22 2024 | 1.6.0 | Add users endpoint Add sales/itemized endpoint Add get BigQuery keyset endpoint |
| Wed Nov 15 2023 | 1.5.0 | Add product duration method and minutes to "subscriptions" Add vehicle name, dock group title, dock number to endpoints with only ids Add reported and max virtual dock count to dock groups Include non-active stations in "dockgroups" Some calculated fields returned as strings instead of numbers |
| Thu Oct 19 2023 | 1.4.1 | Fix sales and subscription endpoint query parameters |
| Fri Sep 22 2023 | 1.4.0 | Add "sales" endpoint Add "subscriptions" endpoint |
| Mon Sep 11 2023 | 1.3.0 | Add "operation-locations" endpoint Add "operationLocationId" to "realtime/vehicle" endpoint Add "batteryVoltage" to "realtime/vehicle" endpoint Add "positionAccurracy" to "realtime/vehicle" endpoint Add "cellTechnology" to "realtime/vehicle" endpoint Add "cellQuality" to "realtime/vehicle" endpoint Add "cellStrength" to "realtime/vehicle" endpoint Add "cellGeneratedAt" to "realtime/vehicle" endpoint |
| Thu Aug 31 2023 | 1.2.0 | Add "damage-types" endpoint |
| Wed Aug 30 2023 | 1.1.0 | Add realtime/maintenance endpoint Add anonymised "userId" to "realtime/trips" endpoint |
| Mon Aug 28 2023 | 1.0.1 | Add "isAvailableToCustomers" to "realtime/vehicle" endpoint Add "isOperational" to "realtime/vehicle" endpoint Remove deprecated "with_administrator" from "externalState" enum |
| Tue Aug 15 2023 | 1.0.0 | Initial release |
To use this API you must first obtain API credentials from Urban Sharing. These API credentials can then be used to generate a JWT token which must be passed in the Authorization header when accessing resources in this API.
For more information, please refer to the Urban Sharing Auth API
Urban Sharing APIs refer to docks, dock groups and vehicles as our platform is designed to support multiple modes of transport. In the case of bike share systems, docks are individual bike parking spots, dock groups are stations and vehicles are bikes.
If you already have a Google service account that you want to use you can skip this step and jump straight to “Grant rights to Urban Sharing BigQuery dataset”.
If the GCP project is old, BigQuery API might not be enabled. Newer projects have it enabled by default. To enable:
The following steps use curl to make requests to the Urban Sharing APIs. You can use any method you like.
curl -X POST https://auth.api.urbansharing.com/auth/token \
-H 'Content-Type: application/json' \
-d '{ "grantType": "client_credentials", "clientId": "your_client_id", "clientSecret": "your_client_secret" }'
curl -X POST https://analytics.api.${domain}/bigquery/service-account \
-H 'Authorization: Bearer [your_jwt_token>]' \
-H 'Content-Type: application/json' \
-d '{ "email": "your_service_account_email" }'
Returns the keyset required to decrypt Personally Identifiable Information (PII). This endpoint is only available if PII access is enabled for your API credentials.
PII data is encrypted with a periodically rotating key, which is valid for up to 2 months. Keys are rotated every 2 weeks, with the last 3 keys being present in the keyset. The 'primary' key is used to encrypt and decrypt new data, while the other keys are used to decrypt previous data. A newly rotated key does not become 'primary' for 2 weeks, but will be added to the keyset. This means that as long as you periodically refresh the keyset - by calling this endpoint - you will always have the latest keys in the keyset, and when a new key becomes 'primary' and starts encrypting new data you will already be able to decrypt it with your keyset. We recommend refreshing the keyset once per week.
When a key expires - after 2 months - data encrypted by that key will no longer be able to be decrypted. This means PII data older than 2 months is effectively deleted.
Refer to BigQuery documentation for how to use the keyset. A column can be decrypted with the following SQL: select aead.decrypt_string(from_base64(@keyset), from_base64(column_name), '') as column_name from table_name;
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "keyset": "p929850wut9238507"
}Before creating a service account you must have a service account email address. See here for details on how to create a Google service account.
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
| email required | string The service account email address |
{- "email": "account-id@project-id.iam.gserviceaccount.com"
}{- "id": "bqsa_1ZzYjrlBlX9d57xDoax7ok2r",
- "dataset": "urbansharing-clients.your_system_name"
}Delete a BigQuery service account. This is irreversible. If you require access to the data again, you will need to create a new service account.
| id required | string |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "status": "OK"
}Return a single BigQuery service account that has been created for your system
| id required | string |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "id": "bqsa_1ZzYjrlBlX9d57xDoax7ok2r",
- "apiAuthId": "api_1fj653G9Rv7z6zJaoUKOqrKM",
- "email": "account-id@project-id.iam.gserviceaccount.com",
- "accountType": "service_account",
- "enabled": true,
- "createdAt": "2019-08-24T14:15:22Z"
}Return all the BigQuery service accounts that have been created for your system
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
[- {
- "id": "bqsa_1ZzYjrlBlX9d57xDoax7ok2r",
- "apiAuthId": "api_1fj653G9Rv7z6zJaoUKOqrKM",
- "email": "account-id@project-id.iam.gserviceaccount.com",
- "accountType": "service_account",
- "enabled": true,
- "createdAt": "2019-08-24T14:15:22Z"
}
]Returns a list of vehicles
| limit | number Default: 50 The maximum number of rows to return |
| offset | number Default: 0 The number of pages or rows to skip |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "info": {
- "hasNextPage": true,
- "hasPreviousPage": true,
- "totalRowCount": 0
}, - "rows": [
- {
- "id": 1,
- "assetModelId": 1,
- "name": "Vehicle 1",
- "number": "VH-001",
- "systemId": "mysystem",
- "fwVersion": "1.0.0",
- "batteryCharge": 80,
- "batteryVoltage": 42.4,
- "isBatteryChargeGood": true,
- "isBatteryChargeLow": false,
- "isBatteryChargeEmpty": false,
- "isAvailableToCustomers": false,
- "isOperational": false,
- "batteryType": "primary",
- "batteryPresent": true,
- "brokenAt": "2022-01-01T00:00:00.000Z",
- "quickReturnCount": 5,
- "rfid": "12345A",
- "qrCode": "QR-001",
- "type": "ebike",
- "isDamaged": false,
- "damageReason": "Accident",
- "unresponsive": false,
- "assetModelName": "Electric scooter",
- "state": "docked",
- "externalState": "docked",
- "dockId": 1,
- "dockNumber": "1",
- "dockActive": true,
- "dockGroupId": 1,
- "dockGroupTitle": "Dock Group 1",
- "dockGroupActive": true,
- "vehicleLocationId": 1,
- "operationLocationId": 1,
- "vehicleLocationLatitude": 37.7749,
- "vehicleLocationLongitude": -122.4194,
- "isVehicleReserved": false,
- "vehicleReservationTimeToExpire": 300,
- "hwAvailable": true,
- "hwControllerId": 1,
- "hwControllerImei": "123456789012345",
- "hwControllerState": "Connected",
- "hwControllerPowerState": "on",
- "hwControllerCharge": 80,
- "hwControllerVoltage": 12,
- "isHwBatteryChargeGood": true,
- "isHwBatteryChargeLow": false,
- "isHwBatteryChargeEmpty": false,
- "hwControllerModelId": 1,
- "hwFwVersion": "1.0.0",
- "hwTimeSinceLastResponse": 60,
- "positionSource": "controller_gps",
- "positionLatitude": 37.7749,
- "positionLongitude": -122.4194,
- "positionAltitude": 10,
- "positionAccuracy": 10,
- "positionGeneratedAt": { },
- "cellTechnology": "5G",
- "cellQuality": 98,
- "cellStrength": -64,
- "cellGeneratedAt": { },
- "closestDockGroupId": { },
- "closestDockGroupDistance": { }
}
]
}Returns a list of dock groups
| limit | number Default: 50 The maximum number of rows to return |
| offset | number Default: 0 The number of pages or rows to skip |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "info": {
- "hasNextPage": true,
- "hasPreviousPage": true,
- "totalRowCount": 0
}, - "rows": [
- {
- "id": 1,
- "type": "type",
- "name": "name",
- "systemId": "mysystem",
- "title": "title",
- "subTitle": "subTitle",
- "address": "address",
- "centerPointLatitude": 1.2345,
- "centerPointLongitude": 1.2345,
- "elevation": 1.2345,
- "geofenceLock": {
- "coordinates": [
- [
- [
- 51.3434,
- 11.3423
]
]
], - "type": "Polygon"
}, - "geofenceRequest": {
- "coordinates": [
- [
- [
- 51.3434,
- 11.3423
]
]
], - "type": "Polygon"
}, - "dockActiveCount": 1,
- "dockBrokenCount": 1,
- "dockOccupiedCount": 1,
- "dockTotalCount": 1,
- "reportedVirtualDockCount": 10,
- "maxVirtualDockCount": 15,
- "timeSinceLastResponse": 3600,
- "workingHours": "01:00:00-11:00:00,13:00:00-20:00:00",
- "state": "active"
}
]
}Returns a list of dock groups
| limit | number Default: 50 The maximum number of rows to return |
| offset | number Default: 0 The number of pages or rows to skip |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "info": {
- "hasNextPage": true,
- "hasPreviousPage": true,
- "totalRowCount": 0
}, - "rows": [
- {
- "id": 1,
- "type": "type",
- "name": "name",
- "systemId": "mysystem",
- "title": "title",
- "subTitle": "subTitle",
- "address": "address",
- "centerPointLatitude": 1.2345,
- "centerPointLongitude": 1.2345,
- "elevation": 1.2345,
- "geofenceLock": {
- "coordinates": [
- [
- [
- 51.3434,
- 11.3423
]
]
], - "type": "Polygon"
}, - "geofenceRequest": {
- "coordinates": [
- [
- [
- 51.3434,
- 11.3423
]
]
], - "type": "Polygon"
}, - "dockActiveCount": 1,
- "dockBrokenCount": 1,
- "dockOccupiedCount": 1,
- "dockTotalCount": 1,
- "reportedVirtualDockCount": 10,
- "maxVirtualDockCount": 15,
- "timeSinceLastResponse": 3600,
- "workingHours": "01:00:00-11:00:00,13:00:00-20:00:00",
- "state": "active"
}
]
}Returns all trips that are currently in progress. Use historical data for trips that have ended.
| limit | number Default: 50 The maximum number of rows to return |
| offset | number Default: 0 The number of pages or rows to skip |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "info": {
- "hasNextPage": true,
- "hasPreviousPage": true,
- "totalRowCount": 0
}, - "rows": [
- {
- "id": 1,
- "userId": "4B227777D4DD1FC61C6F884F48641D02B4D121D3FD328CB08B5531FCACDABF8A",
- "subscriptionId": "4B227777D4DD1FC61C6F884F48641D02B4D121D3FD328CB08B5531FCACDABF8A",
- "systemId": "mysystem",
- "createdAt": "2019-08-24T14:15:22Z",
- "startedAt": "2019-08-24T14:15:22Z",
- "state": "in_progress",
- "vehicleId": 1,
- "vehicleName": "Vehicle 1",
- "cancelledBy": "admin@example.com",
- "cancelledReason": "reason",
- "endedAt": "2022-01-01T01:00:00.000Z",
- "accurateTimestamps": true,
- "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
- "userRating": 4,
- "userComment": "Great trip!",
- "wasReserved": true,
- "reservedAt": "2022-01-01T00:00:00.000Z",
- "startDockId": 1,
- "startDockNumber": "1",
- "startDockGroupId": 1,
- "startDockGroupTitle": "Dock Group 1",
- "startLocationId": 1,
- "startLocationLatitude": 1.2345,
- "startLocationLongitude": 1.2345,
- "endDockId": 1,
- "endDockNumber": "1",
- "endDockGroupId": 1,
- "endDockGroupTitle": "Dock Group 1",
- "endLocationId": 1,
- "endLocationLatitude": 1.2345,
- "endLocationLongitude": 1.2345,
- "distanceM": 1000,
- "unlockMethod": "app_ios"
}
]
}Returns all damage and maintenance that is currently in progress. Use historical data for damage and maintenance that has ended.
| limit | number Default: 50 The maximum number of rows to return |
| offset | number Default: 0 The number of pages or rows to skip |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "info": {
- "hasNextPage": true,
- "hasPreviousPage": true,
- "totalRowCount": 0
}, - "rows": [
- {
- "damageId": 84760,
- "createdAt": "2019-08-24T14:15:22Z",
- "damageComment": "Faulty brakes",
- "assetDamageResolvedAt": { },
- "assetDamageForceCritical": true,
- "vehicleId": 56379,
- "vehicleName": "Vehicle 1",
- "hardwareControllerId": 3758939,
- "dockGroupId": 787890,
- "dockGroupTitle": "Dock Group 1",
- "dockId": 247977,
- "dockNumber": "1",
- "maintenanceReportId": 347607,
- "maintenanceCompletedAt": { },
- "maintenanceComment": "Replaced the handlebars",
- "systemId": "system-1",
- "repairedByAdminEmail": "admin@example.com",
- "reportedByAdminEmail": "admin@example.com",
- "assetDamageTypeId": 88222,
- "damageTypeName": "Handlebars",
- "damageTypeCritical": true,
- "reportedByUserId": "4B227777D4DD1FC61C6F884F48641D02B4D121D3FD328CB08B5531FCACDABF8A",
- "assetModelName": "Bike",
- "assetModelId": 111468,
- "vehicleCategory": "bike",
- "assetType": "bike",
- "repairNames": [
- "Replaced the handlebars",
- "Repaired the brakes"
]
}
]
}Returns damage types.
| limit | number Default: 50 The maximum number of rows to return |
| offset | number Default: 0 The number of pages or rows to skip |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "info": {
- "hasNextPage": true,
- "hasPreviousPage": true,
- "totalRowCount": 0
}, - "rows": [
- {
- "systemId": "your_system",
- "assetModelId": 1375,
- "assetModelName": "Pedal Bike",
- "damageTypes": [
- "Gears",
- "Puncture Front",
- "Puncture Rear",
- "Too many quick returns"
]
}
]
}Returns operation locations
| limit | number Default: 50 The maximum number of rows to return |
| offset | number Default: 0 The number of pages or rows to skip |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "id": 1,
- "systemId": "mysystem",
- "name": "workshop01",
- "type": "storage",
- "createdAt": "2019-08-24T14:15:22Z"
}Returns itemised sales by year and either month or week. Each sale is broken into one row for each line item, in addition to one for each charge attempt.
| year required | number [ 2000 .. 3000 ] Example: year=2012 Select data for a specific year |
| month required | number [ 1 .. 12 ] Example: month=7 Select data for a specific month |
| week | number [ 1 .. 53 ] Example: week=14 Select data for a specific week |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "rows": [
- {
- "orderId": 65434,
- "invoiceId": 980977,
- "tripId": 56789,
- "status": "paid",
- "userId": "12999C46FAC7D7F63DE1D79705E9A301675319551942BD70C04F6DEB0A1B5102",
- "productId": 343455,
- "type": "subscription",
- "channel": "app",
- "isRenewal": true,
- "isAutomaticRenewal": true,
- "isManualRenewal": false,
- "discountCampaignId": 472789,
- "paidAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "systemId": "my-system",
- "grossAmount": 100,
- "netAmount": 80,
- "vatRate": 20,
- "vatAmount": 20,
- "productName": "Product Name",
- "currency": "EUR",
- "transactionId": "pi_12345",
- "transactionTime": "2022-01-01T00:00:00Z",
- "transactionType": "CHECKOUT",
- "transactionAmount": 100,
- "transactionCurrency": "EUR",
- "transactionStatus": "COMPLETED",
- "transactionFailureReason": "INSUFFICIENT_FUNDS"
}
]
}Returns sales by year, month and optional day
| year required | number [ 2000 .. 3000 ] Example: year=2012 Select data for a specific year |
| month required | number [ 1 .. 12 ] Example: month=7 Select data for a specific month |
| day | number [ 1 .. 31 ] Example: day=14 Select data for a specific day - optional |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "rows": [
- {
- "salesId": 12345,
- "tripId": 56789,
- "userId": 637333,
- "productId": 343455,
- "type": "subscription",
- "channel": "app",
- "isRenewal": true,
- "isAutomaticRenewal": true,
- "isManualRenewal": false,
- "discountCampaignId": 472789,
- "paidAt": "2019-08-24T14:15:22Z",
- "createdAt": "2019-08-24T14:15:22Z",
- "systemId": "my-system",
- "finalPriceGross": 100,
- "finalPriceNet": 80,
- "refundAmount": 0,
- "vatRate": 20,
- "vatAmount": 20,
- "productName": "Product Name"
}
]
}Returns subscriptions by year, month and optional day
| year required | number [ 2000 .. 3000 ] Example: year=2012 Select data for a specific year |
| month required | number [ 1 .. 12 ] Example: month=7 Select data for a specific month |
| day | number [ 1 .. 31 ] Example: day=14 Select data for a specific day - optional |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "rows": [
- {
- "id": 12345,
- "subscriptionId": "4B227777D4DD1FC61C6F884F48641D02B4D121D3FD328CB08B5531FCACDABF8A",
- "systemId": "my-system",
- "createdAt": "2019-08-24T14:15:22Z",
- "userId": "4B227777D4DD1FC61C6F884F48641D02B4D121D3FD328CB08B5531FCACDABF8A",
- "productId": 144673,
- "enabled": true,
- "validFrom": "2019-08-24T14:15:22Z",
- "validTo": "2019-08-24T14:15:22Z",
- "isDisabled": false,
- "disabledAt": "2019-08-24T14:15:22Z",
- "salesId": 4563453,
- "salesChannel": "app",
- "salesLocale": "en",
- "isValueCode": true,
- "state": "active",
- "renewalOptInType": "in",
- "isRenewalEnabled": true,
- "requiresPaymentCard": true,
- "freeMinutesPerDay": 10,
- "freeFloatingDockingFeeAmount": 5,
- "productCreatedAt": "2019-08-24T14:15:22Z",
- "productName": "Product Name",
- "productEnabled": true,
- "productPrice": 100,
- "productValidFrom": "2019-08-24T14:15:22Z",
- "productValidTo": "2019-08-24T14:15:22Z",
- "productPurchasable": true,
- "productDurationMethod": "absolute",
- "productDurationMins": 1440
}
]
}Returns active users by year, month and day
| limit | number Default: 50 The maximum number of rows to return |
| offset | number Default: 0 The number of pages or rows to skip |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "rows": [
- {
- "id": 12345,
- "userId": "4F875EFB2FC619C5C9EA52BB62A7AB6F7735390A2B2BC5677CDDEAF627A27578",
- "createdAt": "2020-01-01T00:00:00.000Z",
- "hasSuperpowers": false,
- "agreedToTermsOfUse": true,
- "agreedToTermsOfUseAt": "2020-01-01T00:00:00.000Z",
- "agreedToReceiveEmail": true,
- "agreedToReceiveExternalPromotions": false,
- "agreedToRegistrationAgreementWithdrawal": false,
- "agreedToRegistrationAgreementWithdrawalAt": "2020-01-01T00:00:00.000Z",
- "agreedToSubscriptionAgreementWithdrawal": false,
- "agreedToSubscriptionAgreementWithdrawalAt": "2020-01-01T00:00:00.000Z",
- "rfid": "1234567890",
- "agreedToSendDataToThirdParties": true,
- "agreedToSendDataToThirdPartiesAt": "2020-01-01T00:00:00.000Z",
- "enabledPushNotifications": true,
- "externalId": "243563248",
- "externalPartnerId": "partner001",
- "intercomId": "035532004",
- "walletEnabled": true,
- "walletBalance": 100,
- "penaltyCount": 2,
- "isSuspendedByPenalty": false,
- "penaltyCountPrevious": 20,
- "subscriptionId": 34533,
- "subscriptionState": "active",
- "subscriptionName": "Annual 2037",
- "attachedPartnerIds": "milan_atm,obos",
- "email": "user@example.com",
- "phoneNumber": "+1234567890",
- "name": "John Doe",
- "gender": "male",
- "birthYear": 1980,
- "age": 40,
- "postalCode": "12345",
- "preferredLocale": "en",
- "lastSeenLocale": "en"
}
]
}Returns voucher codes
| limit | number Default: 50 The maximum number of rows to return |
| offset | number Default: 0 The number of pages or rows to skip |
| uowid | string A globally unique unit of work ID generated by the client which allows Urban Sharing to track requests through our systems. If no header is provided it will be generated automatically at the time of arrival. The header and ID will be returned in the response. |
{- "rows": [
- {
- "systemId": "string",
- "createdAt": "2019-08-24T14:15:22Z",
- "code": "string",
- "receiverEmailDomain": "string",
- "issuedByAdminEmail": "string",
- "issuedByCompanyId": "string",
- "issuedByCompanyUserId": "string",
- "issuedByCompanyName": "string",
- "issuedByUserId": "string",
- "validUntil": "2019-08-24T14:15:22Z",
- "redeemedAt": "2019-08-24T14:15:22Z",
- "isRedeemed": true,
- "redeemedByUserId": "string",
- "revokedAt": "2019-08-24T14:15:22Z",
- "isRevoked": true,
- "productId": "string",
- "productName": "string",
- "campaignTag": "string"
}
]
}