Microsoft Teams Data API
Microsoft Teams on Android talks to a cluster of first-party HTTPS surfaces. Directory and profile screens hang off /v1/profile/me and /v1/directory/people:search; the chat transcript pages /v1/messaging/threads/{threadId}/messages after minting a chat session token at /v1/auth/sessionToken; presence dots come from /v1/presence:batchLookup; the Meetings tab reads /v1/calendar/me/view.
Microsoft Teams (package com.microsoft.teams, versionName 1416/1.0.0.2026163804) is Microsoft's Android client for work chat, channels, presence, calendar and meetings. Its signed-in data API is a cluster of first-party HTTPS surfaces: a people and profile directory (mri, displayName, userPrincipalName, jobTitle, tenantId, identity flags), a chat service that pages thread messages (content, contenttype, messagetype, composetime, imdisplayname, clientmessageid, consumptionHorizon), unified presence (availability, activity, lastSeenAt, workLocation), a calendar view (Id, Subject, Start, End, iCalUId, OnlineMeetingUrl) and license SKUs (skuId, skuPartNumber). Chat calls carry a chat-scoped session token plus a device registration token; directory and calendar calls use an OAuth2 Bearer token.
Screenshots
API surface
Read the signed-in user's me profile
GET
/v1/profile/me?expand=identityFlagsosintReturns the signed-in user's identity record (mri, UPN, job title, tenant, email/phone visibility) that the Me tab and every other signed-in call hang off.
Auth: OAuth2 Bearer access token for the signed-in work account (directory/profile scope). The optional expand query returns the account's identity flags alongside the profile.
- mri
- objectId
- displayName
- givenName
- surname
- userPrincipalName
- jobTitle
- department
- companyName
- tenantId
- tenantName
- userType
- isSkypeTeamsUser
- skypeTeamsInfo
- emailsInfo
- address
- searchable
- visibility
- phonesInfo
- number
- country
- nationalNumber
- riskScore
- searchableByProfile
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/profile/me?expand=identityFlags HTTP/1.1 Authorization: Bearer <access-token> Accept: application/json{ "mri": "8:orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "objectId": "3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "displayName": "Alex Rivera", "givenName": "Alex", "surname": "Rivera", "email": "[email protected]", "mail": "[email protected]", "userPrincipalName": "[email protected]", "jobTitle": "Product Manager", "department": "Platform", "companyName": "Example Corp", "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "tenantName": "Example Corp", "userType": "Member", "isSkypeTeamsUser": true, "skypeTeamsInfo": {"isSkypeTeamsUser": true}, "emailsInfo": [{"address": "[email protected]", "searchable": true, "visibility": "Everyone"}], "phonesInfo": [{"number": "+14255550123", "country": "US", "nationalNumber": "4255550123", "searchable": false, "visibility": "Contacts"}], "riskScore": "0", "searchableByProfile": true }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the app's sign-in bootstrap and the Me tab profile load.Captures the identity record that the directory, chat and presence flows hang off.
Search the org directory for people
POST
/v1/directory/people:search?expand=identityFlagsosintRuns the in-app people picker / search-results directory lookup and returns matching user records (mri, UPN, jobTitle, tenantId, identity flags).
Auth: OAuth2 Bearer access token for the signed-in work account (directory scope).
- value
- mri
- objectId
- displayName
- userPrincipalName
- jobTitle
- department
- tenantId
- type
- userType
- isSkypeTeamsUser
- imageUri
- skypeTeamsInfo
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/directory/people:search?expand=identityFlags HTTP/1.1 Authorization: Bearer <access-token> Content-Type: application/json "alex rivera"{ "value": [ { "mri": "8:orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "objectId": "3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "displayName": "Alex Rivera", "email": "[email protected]", "userPrincipalName": "[email protected]", "jobTitle": "Product Manager", "department": "Platform", "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "type": "Member", "userType": "Member", "isSkypeTeamsUser": true, "imageUri": "https://example.invalid/avatar/alex", "skypeTeamsInfo": {"isSkypeTeamsUser": true} } ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the app's people picker and search-results directory lookup.Returns the same user records the chat and channel rosters hydrate from.
Batch-fetch user profiles by member id
POST
/v1/directory/people:batchGetosintHydrates a roster of chat/channel members from a list of member ids into full user records, including information-barrier barred flags.
Auth: OAuth2 Bearer access token for the signed-in work account (directory scope).
- mri
- objectId
- displayName
- userPrincipalName
- jobTitle
- tenantId
- isIbBarred
- isBlocked
- userType
- skypeTeamsInfo
- isSkypeTeamsUser
- value
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/directory/people:batchGet HTTP/1.1 Authorization: Bearer <access-token> Content-Type: application/json [ "8:orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "8:orgid:9c88e201-4b77-41aa-b012-55aa11cc99ee" ]{ "value": [ { "mri": "8:orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "objectId": "3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "displayName": "Alex Rivera", "email": "[email protected]", "userPrincipalName": "[email protected]", "jobTitle": "Product Manager", "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "isIbBarred": false, "isBlocked": false, "userType": "Member", "skypeTeamsInfo": {"isSkypeTeamsUser": true} } ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the roster hydration that runs when a chat or channel member list opens.Resolves compact member identifiers into full directory records in one round trip.
Batch-lookup presence for users
POST
/v1/presence:batchLookuposintReturns presence, status note, hybrid work location and any forced availability for a batch of member ids, powering the green/yellow/red dots on chat and people lists.
Auth: OAuth2 Bearer access token for the presence service. Body is a list of {mri, eTag} pairs so unchanged entries can be skipped.
- mri
- eTag
- userMri
- availability
- activity
- capabilities
- lastSeenAt
- note
- mRawStatusMessage
- mStatusExpiry
- mStatusPublishTime
- workLocation
- location
- subLocation
- locationExpiry
- locationForced
- forcedAvailability
- mAvailability
- mActivity
- mExpiry
- mPublishTime
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/presence:batchLookup HTTP/1.1 Authorization: Bearer <access-token> Content-Type: application/json [ {"mri": "8:orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "eTag": "W/\"datetime'2026-09-27T10:00:00Z'\""}, {"mri": "8:orgid:9c88e201-4b77-41aa-b012-55aa11cc99ee", "eTag": ""} ][ { "userMri": "8:orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "availability": "Available", "activity": "Available", "capabilities": "Audio|Video|ScreenShare", "eTag": "W/\"datetime'2026-09-27T10:04:12Z'\"", "lastSeenAt": "2026-09-27T10:04:12Z", "note": { "mRawStatusMessage": "In a customer call", "mStatusExpiry": "2026-09-27T18:00:00Z", "mStatusPublishTime": "2026-09-27T09:00:00Z" }, "workLocation": { "location": "Office", "subLocation": "Building 34", "locationExpiry": "2026-09-27T23:59:59Z", "locationForced": false }, "forcedAvailability": { "mAvailability": "Busy", "mActivity": "InACall", "mExpiry": "2026-09-27T11:00:00Z", "mPublishTime": "2026-09-27T10:00:00Z" } } ]Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the presence dots rendered on chat rows and people cards.Batches lookups so a roster view resolves every member's availability in one call.
Publish a forced availability status
PUT
/v1/presence/me/overrideopendataPublishes the signed-in user's forced presence (Available/Busy/DoNotDisturb and activity) from the mobile device until the requested expiry time.
Auth: OAuth2 Bearer access token for the presence service.
- id
- deviceType
- availability
- activity
- desiredExpirationTime
Illustrative example reconstructed from the app's interface — not a live capture.
PUT /v1/presence/me/override HTTP/1.1 Authorization: Bearer <access-token> Content-Type: application/json { "id": "Mobile", "deviceType": "Mobile", "availability": "Busy", "activity": "InACall", "desiredExpirationTime": "2026-09-27T11:00:00Z" }{ "id": "Mobile", "deviceType": "Mobile", "availability": "Busy", "activity": "InACall", "desiredExpirationTime": "2026-09-27T11:00:00Z" }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the status picker (Available/Busy/DoNotDisturb) on the Me tab.The override carries a device tag and an explicit expiry so it can lapse automatically.
Page messages in a chat or channel thread
GET
/v1/messaging/threads/{threadId}/messagesopendataPages the message history of a 1:1 chat, group chat or channel thread for the conversation view, including compose time, sender id and consumption horizon.
Auth: Chat-scoped session token sent as a token header (minted by the session-token endpoint), plus the device registration token issued when the chat endpoint registers.
- threadId
- view
- startTime
- pageSize
- messages
- id
- clientmessageid
- conversationid
- from
- imdisplayname
- messagetype
- contenttype
- content
- composetime
- originalarrivaltime
- properties
- consumptionHorizon
- forwardLink
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/messaging/threads/19:[email protected]/messages?view=msnp24Equivalent&startTime=0&pageSize=50 HTTP/1.1 Authorization: sessionToken <session-token> RegistrationToken: registrationToken=<registration-token> Accept: application/json{ "messages": [ { "id": "1758962400123", "clientmessageid": "18446744073709550001", "conversationid": "19:[email protected]", "from": "8:orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "imdisplayname": "Alex Rivera", "messagetype": "RichText/Html", "contenttype": "text", "content": "<p>Standup notes are in the wiki.</p>", "composetime": "2026-09-27T10:00:00.123Z", "originalarrivaltime": "2026-09-27T10:00:00.200Z", "properties": { "consumptionHorizon": "1758962400123;1758962400123;1758962400000" } } ], "_metadata": { "forwardLink": "/v1/messaging/threads/19:[email protected]/messages?syncState=abc" } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the conversation view that pages a 1:1, group or channel thread.Carries the consumption horizon the client uses to track read state across devices.
Send a message to a chat or channel thread
POST
/v1/messaging/threads/{threadId}/messagesopendataPosts a new chat or channel message from the compose box and returns the server-assigned id, arrival time and echoed body.
Auth: Chat-scoped session token sent as a token header, plus the device registration token for the registered chat endpoint.
- content
- contenttype
- messagetype
- clientmessageid
- imdisplayname
- OriginalArrivalTime
- id
- conversationid
- from
- composetime
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/messaging/threads/19:[email protected]/messages HTTP/1.1 Authorization: sessionToken <session-token> RegistrationToken: registrationToken=<registration-token> Content-Type: application/json { "content": "<p>Shipping the build at 16:00.</p>", "contenttype": "text", "messagetype": "RichText/Html", "clientmessageid": "18446744073709550002", "imdisplayname": "Alex Rivera" }{ "OriginalArrivalTime": "2026-09-27T10:05:01.004Z", "id": "1758962701004", "clientmessageid": "18446744073709550002", "conversationid": "19:[email protected]", "from": "8:orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "imdisplayname": "Alex Rivera", "messagetype": "RichText/Html", "contenttype": "text", "content": "<p>Shipping the build at 16:00.</p>", "composetime": "2026-09-27T10:05:00.980Z" }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the compose box posting into the open conversation.The client supplies its own clientmessageid so the echo can be reconciled with the local draft.
List the signed-in user's calendar view
GET
/v1/calendar/me/viewopendataReturns the day's calendar events for the Meetings tab, including subject, window, RSVP, organizer and the online-meeting join URL.
Auth: OAuth2 Bearer access token (calendar scope). The window is passed as startDateTime and endDateTime.
- startDateTime
- endDateTime
- Id
- Start
- End
- iCalUId
- Subject
- Type
- SeriesMasterId
- Locations
- IsAllDay
- IsOnlineMeeting
- IsCancelled
- OnlineMeeting
- OnlineMeetingUrl
- ResponseStatus
- Organizer
- OriginalStartTimeZone
- Recurrence
- DateTime
- TimeZone
- JoinUrl
- DisplayName
- EmailAddress
- Name
- Address
- Response
- Time
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/calendar/me/view?startDateTime=2026-09-27T00:00:00Z&endDateTime=2026-09-28T00:00:00Z&$select=Id,Start,End,iCalUId,Subject,Type,SeriesMasterId,Locations,IsAllDay,IsOnlineMeeting,IsCancelled,OnlineMeeting,OnlineMeetingUrl,ResponseStatus,Organizer,OriginalStartTimeZone,Recurrence HTTP/1.1 Authorization: Bearer <access-token> Accept: application/json{ "value": [ { "Id": "AAMkAGI2AAAt2j2NAAA=", "iCalUId": "040000008200E00074C5B7101A82E00800000000A0A0A0A0", "Subject": "Platform standup", "Type": "SingleInstance", "SeriesMasterId": null, "Start": {"DateTime": "2026-09-27T15:00:00.0000000", "TimeZone": "UTC"}, "End": {"DateTime": "2026-09-27T15:30:00.0000000", "TimeZone": "UTC"}, "Locations": [{"DisplayName": "Teams meeting"}], "IsAllDay": false, "IsOnlineMeeting": true, "IsCancelled": false, "OnlineMeetingUrl": "https://meetings.example.invalid/join/19%3ameeting_abc123", "OnlineMeeting": {"JoinUrl": "https://meetings.example.invalid/join/19%3ameeting_abc123"}, "ResponseStatus": {"Response": "Accepted", "Time": "2026-09-26T18:01:00Z"}, "Organizer": {"EmailAddress": {"Name": "Alex Rivera", "Address": "[email protected]"}}, "OriginalStartTimeZone": "Pacific Standard Time", "Recurrence": null } ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the Meetings tab that renders the day's events.Each event carries the online-meeting join link the app deep-links into.
List the signed-in user's teams and channels
GET
/v1/workspaces/me/summaryopendataReturns the optimized left-rail list of teams and channels for the signed-in user, including favorite flags, unread/mention counts and the last-message preview.
Auth: OAuth2 Bearer access token (workspace aggregation scope).
- conversations
- conversationId
- parentConversationId
- displayName
- conversationType
- channelType
- tenantId
- isFavorite
- isUnread
- mentionCount
- consumptionHorizon
- lastMessageId
- lastMessageArrivalTime
- previewMessage
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/workspaces/me/summary HTTP/1.1 Authorization: Bearer <access-token> Accept: application/json{ "conversations": [ { "conversationId": "19:[email protected]", "parentConversationId": null, "displayName": "Platform", "conversationType": "Team", "channelType": null, "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "isFavorite": true, "isUnread": true, "mentionCount": 2, "consumptionHorizon": "1758962400123;1758962400123;1758962400000", "lastMessageId": 1758962400123, "lastMessageArrivalTime": 1758962400123, "previewMessage": "Standup notes are in the wiki." }, { "conversationId": "19:[email protected]", "parentConversationId": "19:[email protected]", "displayName": "General", "conversationType": "Channel", "channelType": "Standard", "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47", "isFavorite": true, "isUnread": true, "mentionCount": 0, "consumptionHorizon": "1758962400123;1758962400123;1758962400000", "lastMessageId": 1758962400123, "lastMessageArrivalTime": 1758962400123, "previewMessage": "Standup notes are in the wiki." } ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the left rail that lists teams and channels with unread and mention badges.Single aggregated payload so the rail renders without per-team fan-out.
Read the account's license SKUs
GET
/v1/account/me/licensesopendataReturns the signed-in user's assigned subscription SKUs and service plans (including the meetings/chat plan) used to gate licensed features.
Auth: OAuth2 Bearer access token with the organization user-read scope.
- id
- skuId
- skuPartNumber
- servicePlans
- servicePlanId
- provisioningStatus
- value
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/account/me/licenses HTTP/1.1 Authorization: Bearer <access-token> Accept: application/json{ "value": [ { "id": "c7890e12-aaaa-4bbb-8ccc-0123456789ab", "skuId": "6fd2c87f-b296-42f0-b197-1e91e994b900", "skuPartNumber": "ENTERPRISEPACK", "servicePlans": [ { "servicePlanId": "57ff2da0-89d1-429b-9cd3-4d0f0c7d0a1e", "provisioningStatus": "Success" } ] } ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the feature gating that checks the signed-in account's subscription SKUs.Per-plan provisioning status decides which premium features light up in the client.
Exchange the account token for a chat session token
GET
/v1/auth/sessionTokenopendataExchanges the account-level OAuth2 token for the chat-scoped session token, member id and regional routing info that every chat-service call (messages, long-poll, presence docs) requires.
Auth: OAuth2 Bearer access token for the app's auth service. The returned tokens.skypeToken is then sent as the Authorization token header on chat-service calls.
- tokens
- skypeToken
- expiresIn
- tokenType
- mri
- skypeId
- region
- partition
- regionOverride
- userInfo
- cid
- primaryMemberName
- skypeName
- licenseDetails
- isFreemium
- isTrial
- isCopilot
- isAdvComms
- isTeamsSmb
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/auth/sessionToken HTTP/1.1 Authorization: Bearer <access-token> Accept: application/json{ "tokens": { "skypeToken": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "expiresIn": 86400, "tokenType": "skype" }, "mri": "8:orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "skypeId": "orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "region": "amer", "partition": "amer", "regionOverride": null, "userInfo": { "cid": 0, "primaryMemberName": "[email protected]", "skypeName": "orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33" }, "licenseDetails": { "isFreemium": false, "isTrial": false, "isCopilot": false, "isAdvComms": false, "isTeamsSmb": false } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the sign-in handshake that runs before the first chat call.One exchange returns the chat token, the member identifier and the regional routing partition.
Batch-resolve profile pictures
GET
/v1/directory/people/avatarsosintBatch-resolves avatar imageUri values for the chat list and people cards from member id + displayName, including an avatarHint when the user has no photo.
Auth: OAuth2 Bearer access token for the signed-in work account (directory scope). usersInfo is a compact encoding of member-id + displayName pairs.
- usersInfo
- mri
- displayName
- imageUri
- avatarHint
- etag
- value
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/directory/people/avatars?usersInfo=%5B%7B%22mri%22%3A%228%3Aorgid%3A3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33%22%2C%22displayName%22%3A%22Alex%20Rivera%22%7D%5D HTTP/1.1 Authorization: Bearer <access-token> Accept: application/json{ "value": [ { "mri": "8:orgid:3f2a1c90-9b11-4d2e-a7c4-0f8e6b1d2a33", "displayName": "Alex Rivera", "imageUri": "https://example.invalid/avatar/alex", "avatarHint": "ProfilePicture", "etag": "W/\"datetime'2026-08-01T12:00:00Z'\"" } ] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the chat list and people cards that batch-resolve avatar images.Falls back to an initials/avatar hint when the member has no photo on file.
Data categories
- profiles
- directory
- presence
- messages
- calendar
- licenses
- avatars
Where teams use this data
Org-directory reconciliation
Nightly jobs pull the me-profile and people-search endpoints (mri, userPrincipalName, jobTitle, tenantId) and upsert them into an HRIS or ITSM so leavers and role changes show up in Teams-aware tooling the next morning.
Live presence overlay on a helpdesk
A service desk posts MRI batches to the presence batch-lookup endpoint and paints availability, activity, lastSeenAt and workLocation next to each ticket owner so agents know who is in a call before they @-mention.
Meeting-join from an ops console
On-call dashboards read the calendar-view endpoint for Id, Subject, Start, End, IsOnlineMeeting and OnlineMeetingUrl, then deep-link responders into the current Teams meeting without opening the calendar tab.
Chat-thread compliance export
After minting a chat-scoped session token, a records pipeline pages the thread-messages endpoint (content, composetime, from, imdisplayname, clientmessageid) into an archive for eDiscovery.
Frequently asked questions
Which identity fields does the Teams me profile return?
The me-profile call returns mri, objectId, displayName, givenName, surname, email, userPrincipalName, jobTitle, department, companyName, tenantId, tenantName, emailsInfo, phonesInfo and identity flags.
How does Teams authenticate chat versus directory calls?
Directory, calendar and license calls send an OAuth2 Bearer token. Chat calls first exchange that account token for a chat-scoped session token, then send the session token as a token header plus a device registration token when paging or posting thread messages.
What presence attributes can you read for a colleague?
The presence batch-lookup call returns availability, activity, capabilities, lastSeenAt, a status note, hybrid workLocation (location, subLocation) and any forced availability window.
Where do Teams meeting join URLs come from?
The Meetings tab loads the calendar-view endpoint. Each event carries Id, iCalUId, Subject, Start, End, IsOnlineMeeting, OnlineMeetingUrl and Organizer.
Topics
- microsoft teams api
- teams chat messages
- teams presence api
- teams people search
- teams calendar view
- teams session token
- mri userPrincipalName
- teams licenseDetails
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.