- these are the calls used by the dexcom uploader app
- these are in no particular order!
User-Agent: Dexcom%20Share/3.0.2.11 CFNetwork/672.0.2 Darwin/14.0.0
GET
/ShareWebServices/Services/General/SystemUtcTime
Body:
none
Response:
{
"DateTime":"\/Date(1426767421178)\/",
"OffsetMinutes":0
}
POST
/ShareWebServices/Services/General/LoginPublisherAccountByName
Body:
{
"accountName":"yourlogin",
"applicationId":"d8665ade-9673-4e27-9ff6-92db4ce13d13",
"password":"yourpassword"
}
Response:
"e3e3e6a5-coolsessionid-bro”
POST
/ShareWebServices/Services/General/AuthenticatePublisherAccount
Body:
{
"accountName":"yourlogin",
"applicationId":"d8665ade-9673-4e27-9ff6-92db4ce13d13",
"password":"yourpassword"
}
Response:
"e3e3e6a5-coolsessionid-bro”
POST
/ShareWebServices/Services/Publisher/CheckMonitoredReceiverAssignmentStatus?sessionId={YourSessionId}&serialNumber={YourSerialNumber}/
Body:
none
Response:
`AssignedToYou` or `NotAssigned` (plaintext)
POST
/ShareWebServices/Services/Publisher/ReplacePublisherAccountMonitoredReceiver?sessionId={YourSessionId}&serialNumber={YourSerialNumber}
Body:
none
Response:
No Idea, Someone please tell me, if you assign one to yourself that was
already yours you get a 500 error
POST
/ShareWebServices/Services/Publisher/IsRemoteMonitoringSessionActive?sessionId={YourSessionId}
Body:
none
Response:
`true` or `false` (plaintext)
POST
/ShareWebServices/Services/Publisher/StartRemoteMonitoringSession?sessionId={yoursessionid}&serialNumber={YourdexcomSerialNumber}
Body:
none
Response:
just a status, `200`
POST
/ShareWebServices/Services/Publisher/StopRemoteMonitoringSession?sessionId={YourSessionId}
Body:
none
Response:
just a status, `200`
POST
/ShareWebServices/Services/Publisher/UpdatePublisherAccountRuntimeInfo
Body:
{
"sessionId":"YourSessionId",
"runtimeInfo":
{
"DeviceManufacturer":"Apple",
"DeviceModel":"iPhone5,2",
"DeviceOsVersion":"7.0.2",
"AppVersion":"3.0.2.11",
"AppName":"DexcomShare",
"AppNumber":"SW10569",
"DeviceOsName":"iPhone OS"
}
}
Response:
just a status, `200`
POST
/ShareWebServices/Services/Publisher/PostReceiverEgvRecords?sessionId={yourSessionId}
Body:
{
"SN":"YourSerialNumber",
"Egvs":[
{
"Trend":4,
"ST":"\/Date(1426783106000)\/",
"DT":"\/Date(1426754317000)\/",
"Value":97
}
],
"TA":-14365
}
Response:
just a status, `200`
ST
system time, DT
display time, TA
is a time offset, multiply by 1000 and subtract it from the time (so subtracting a negative in this example, which is really adding)
POST
/ShareWebServices/Services/Publisher/ReadPublisherLatestGlucoseValues?sessionId={YourSessionId}&minutes=1440&maxCount=1
Body:
none
Response:
[
{
"DT":"\/Date(1426780716000-0700)\/",
"ST":"\/Date(1426784306000)\/",
"Trend":4,
"Value":99,
"WT":"\/Date(1426769941000)\/"
}
]
POST
/ShareWebServices/Services/Publisher/DoesContactExistByName?sessionId={YourSessionId}&contactName={NameOfNewFollower}
Body:
none
Response:
`true` or `false` (plaintext)
POST
/ShareWebServices/Services/Publisher/CreateContact?sessionId={YourSessionId}&contactName={FollowerName}&emailAddress={FollowerEmail}
Body:
none
Response:
a contact id (needed for the invite!), `123312-af1341123-coolid`
POST
/ShareWebServices/Services/Publisher/CreateSubscriptionInvitation?sessionId={YourSessionId}&contactId={ContactId}
Body:
{
"AlertSettings":{
"HighAlert":{
"MinValue":200,
"AlarmDelay":"PT1H",
"AlertType":1,
"IsEnabled":false,
"RealarmDelay":"PT2H",
"Sound":"High.wav",
"MaxValue":401
},
"LowAlert":{
"MinValue":39,
"AlarmDelay":"PT30M",
"AlertType":2,
"IsEnabled":false,
"RealarmDelay":"PT2H",
"Sound":"Low.wav",
"MaxValue":70
},
"FixedLowAlert":{
"MinValue":39,
"AlarmDelay":"PT0M",
"AlertType":3,
"IsEnabled":true,
"RealarmDelay":"PT30M",
"Sound":"UrgentLow.wav",
"MaxValue":55
},
"NoDataAlert":{
"MinValue":39,
"AlarmDelay":"PT1H",
"AlertType":4,
"IsEnabled":false,
"RealarmDelay":"PT0M",
"Sound":"NoData.wav",
"MaxValue":401
}
},
"Permissions":1,
"DisplayName":"{YourAccountDisplayName}"
}
Note that permissions 1 means they can view your graph data
Response:
a subscriber id for the person you invited! (Usefull for updating their
subscription permissions and such) `793312-af1341123-coolid`
POST
/ShareWebServices/Services/Publisher/ListPublisherAccountSubscriptions?sessionId={YourSessionId}
Body:
none
Response:
[
{
"ContactId":"FollowersContactId",
"ContactName":"FollowersName",
"DateTimeCreated":{
"DateTime":"\/Date(1437101121008)\/",
"OffsetMinutes":0
},
"DateTimeModified":{
"DateTime":"\/Date(1437101121008)\/",
"OffsetMinutes":0
},
"DisplayName":"YourDisplayName",
"InviteExpires":{
"DateTime":"\/Date(1437705921008)\/",
"OffsetMinutes":0
},
"IsEnabled":false,
"IsMonitoringSessionActive":true,
"Permissions":1,
"State":2,
"SubscriberId":"00000000-0000-0000-0000-000000000000",
"SubscriptionId":"theirSubscriptionIdIsuppose?"
}
]
note: maybe we can use this subscription id to send our own custom invites to followers
POST
/ShareWebServices/Services/Publisher/DeleteContact?sessionId={YourSessionId}&contactId={followersContactId}
Body:
none
Response:
just a status, `200`
- getting the image
- getting the subscription display name
- getting the subscription email address
- reading the contact list
- sending changes to the contacts Permissions
- removing a contact
- follower aknowledging alarms
- follower reading invitation info
- follower accepting invitation
- follower updating runtimeInfo
- folower listing all their subscriptions
- read subscription alerts
curl -v \
-H "Accept: application/json" -H "Content-Type: application/json" \
-H "User-Agent: Dexcom Share/3.0.2.11 CFNetwork/711.2.23 Darwin/14.0.0" \
-X POST https://share1.dexcom.com/ShareWebServices/Services/General/LoginPublisherAccountByName \
-d '{"accountName":"YOURLOGIN","applicationId":"d8665ade-9673-4e27-9ff6-92db4ce13d13","password":"YOURPASSWORD"}'
which should recieve a response like
"8c1234deb-323c-4e9d-8362-39cfa23499ed"
which you use to get values like
curl -v \
-H "Content-Length: 0" -H "Accept: application/json" \
-H "User-Agent: Dexcom Share/3.0.2.11 CFNetwork/672.0.2 Darwin/14.0.0" \
-X POST "https://share1.dexcom.com/ShareWebServices/Services/Publisher/ReadPublisherLatestGlucoseValues?sessionId=8c1234deb-323c-4e9d-8362-39cfa23499ed&minutes=1440&maxCount=1"
I'm worried the API exposed in this gist might be in the process of being deprecated. I've intercepted the Follow app traffic on iOS by using the app called "Proxyman". The data looks entirely different now; here's a sample (all IDs redacted and some data truncated):
POST to /ShareWebServices/Services/Subscriber/ReadEvents
Request data:
Which is Base64 for:
Every response now has three fields:
Reponse:
I can extract the data by decoding the base64 and un-gzipping the bytes, which thankfully returns JSON like this:
It seems not all endpoints are returning zip data (some are set to isZip: false and the JSON is readable in the response).
I can do more investigation when I get more time, but currently my pydexcom integration is working fine.