100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Microsoft 365

Microsoft Graph API for Teams

Learn how to read and write Teams data — teams, channels, messages, and members — through the unified Microsoft Graph REST API.

IntegrationIntermediate10 min readJul 10, 2026
Analogies

What Is Microsoft Graph API for Teams?

Microsoft Graph is the single REST API surface for all of Microsoft 365, and the Teams workload exposes it through resources such as /teams, /users/{id}/joinedTeams, and /chats. Instead of learning a separate Teams-only SDK, a developer issues standard HTTPS calls against https://graph.microsoft.com/v1.0/teams/{team-id} to list channels, read members, or post messages, with responses returned as JSON that mirrors the underlying Teams data model.

🏏

Cricket analogy: Just as the ICC uses one unified scoring and ranking system across Test, ODI, and T20 formats rather than three separate databases, Microsoft Graph gives one API surface across Teams, Outlook, and SharePoint instead of a workload-specific SDK for each.

Authentication and Permission Scopes

Every Graph call against Teams requires an OAuth 2.0 access token from Microsoft Entra ID, and the app must be granted the right permission scope for the operation — for example Team.ReadBasic.All to list teams, ChannelMessage.Send to post, or Chat.ReadWrite for 1:1 chats. Permissions come in two flavors: delegated, where the app acts as the signed-in user and is limited by that user's own access, and application, where the app acts with its own identity and typically needs a Global Administrator to grant tenant-wide admin consent.

🏏

Cricket analogy: Delegated permissions are like a substitute fielder who can only do what the captain who sent them out authorizes for that innings, while application permissions are like an umpire whose authority applies to the whole match regardless of which team is batting.

http
GET https://graph.microsoft.com/v1.0/teams/{team-id}/channels
Authorization: Bearer {access-token}

// Response (200 OK)
{
  "value": [
    {
      "id": "19:abc123...@thread.tacv2",
      "displayName": "General",
      "membershipType": "standard"
    },
    {
      "id": "19:def456...@thread.tacv2",
      "displayName": "Release Planning",
      "membershipType": "private"
    }
  ]
}

// Posting a channel message
POST https://graph.microsoft.com/v1.0/teams/{team-id}/channels/{channel-id}/messages
Content-Type: application/json

{
  "body": {
    "content": "Build <b>#4521</b> passed all checks."
  }
}

Working with Teams, Channels, and Membership

The core resource hierarchy is team → channel → message, with a team also exposing /members for roster management. Channels come in three membership types: standard channels visible to the whole team, private channels with their own member list stored separately, and shared channels that can include people from outside the parent team or even outside the tenant. Creating a channel is a POST to /teams/{team-id}/channels with a membershipType field, and adding a member is a POST to the channel's /members endpoint with the user's AAD object ID.

🏏

Cricket analogy: A standard channel is like the main dressing room open to the whole squad, a private channel is like the selectors' closed-door meeting room, and a shared channel is like a neutral-venue press box where journalists from outside the team also sit in.

Graph exposes both /v1.0 and /beta endpoints. Production integrations should stay on /v1.0 wherever possible — /beta resources like some meeting and channel features can change shape or disappear without the usual deprecation notice.

Sending Messages and Handling Throttling

Messages are posted as chatMessage resources with HTML-formatted body content, and can include @mentions by embedding an <at> tag that references a mentions array with the user's ID and display name. Because Teams applies per-app, per-tenant rate limits, a high-volume integration will eventually receive a 429 Too Many Requests response carrying a Retry-After header; well-behaved clients back off for that many seconds and retry rather than hammering the endpoint, and batch requests via the $batch endpoint to reduce round trips.

🏏

Cricket analogy: Getting a 429 is like the third umpire calling for a mandatory drinks break — you don't argue, you wait out the Retry-After window and resume play exactly when signaled.

Never hard-code a fixed retry delay. Always read the Retry-After header from the 429 response and honor it exactly — ignoring it and retrying immediately can get your app's service principal throttled more aggressively or temporarily blocked by Teams.

  • Microsoft Graph is one unified REST API covering Teams, Outlook, SharePoint, and more under https://graph.microsoft.com.
  • Delegated permissions act as the signed-in user; application permissions act as the app itself and usually need admin consent.
  • The core resource path is /teams/{id}/channels/{id}/messages, mirroring the team → channel → message hierarchy.
  • Channels are standard (whole team), private (separate member list), or shared (can include external participants).
  • Use /v1.0 for production; /beta endpoints can change shape without standard deprecation notice.
  • Handle 429 Too Many Requests by honoring the Retry-After header rather than retrying immediately.
  • Batch related calls through the $batch endpoint to reduce round trips and stay under rate limits.

Practice what you learned

Was this page helpful?

Topics covered

#Microsoft365#MicrosoftTeamsDevelopmentStudyNotes#MicrosoftTechnologies#MicrosoftGraphAPIForTeams#Microsoft#Graph#API#Teams#DataStructures#APIs#StudyNotes#SkillVeris