Founding keys are opena year free at 6,000 req/hour, for the first 1,000 developersClaim yours

Microsoft Teams

Point @microsoft/microsoft-graph-client (or curl) at https://graph.sandboxapis.dev via the client's baseUrl option — clients target graph.microsoft.com, so graph.sandboxapis.dev is the drop-in prefix (teams.sandboxapis.dev aliases it). Auth is any Bearer token (real Graph wants an Entra JWT; any value passes here, but the header must be present — its absence answers Graph's real 401). This is the Microsoft Teams rendering of the org's team-messaging surface: the SAME channels, threads, and byte-identical message text the Slack host serves, in Graph's dialect — /v1.0/me/joinedTeams → /teams/{id}/channels → channel messages → replies, with OData paging (@odata.nextLink/$skiptoken; channel messages default to 20 per page). Everything in Graph outside the teamwork slice answers a coverage-honest Graph-shaped error.

REST · 13 endpointsMCP-ready

Coverage badge

Full13/13 · 100%

The share of read rows with a final answer — served and verified, a deviation, retired upstream, or a reviewed empty/refusal. Computed in the coverage manifest, copied here.

Live host
graph.sandboxapis.dev
Pinned hosts
5 — generation 6, 8, 9, 10, 11
Serving since
2026-08-25
Lifecycle
Live

Served & verified

13 / 100%

Answering with real universe data, each response checked against Microsoft Teams's published spec by the conformance suite on this build.

The full read API

13

Every read surface Microsoft Teams publishes, deferred long tail included, minus the rows excluded by policy. Writes are out of scope: this universe is read-only.

Not served yet

0

Nothing — every read surface Microsoft Teams publishes is answered.

01 / The swap

Point your client at a different base URL.

No SDK of ours, no shim, no recorded fixtures. The same client library you already use, one environment variable different.

shell
curl -H 'Authorization: Bearer any-token' "https://graph.sandboxapis.dev/v1.0/me/joinedTeams"

Verified drop-in clients

  • @microsoft/microsoft-graph-client3.0.7

The versions the conformance suite drives against this host on every build — pinned in coverage/client-pins.yaml, and watched weekly for upstream releases, because a client library moving without us is how a shipped integration breaks silently.

02 / Coverage by family

Every read surface, grouped the way Microsoft Teams groups it.

All 13 rows the coverage manifest carries for Microsoft Teams, deferred long tail included and nothing capped. Open a family, or filter by path to find the exact endpoint your client calls.

Status — what a conformance test found

served & verified
answers with real universe data, and this build checked that response against the vendor's spec.
deviation
served and faithful to the real provider, but failing the vendored spec — usually a bug in the spec.
retired
the vendor removed the endpoint; snapshots pinned before that date still serve it.
planned / deferred
not served yet — an explicit coverage error naming the gap, never invented data.
excluded
out of the claim by policy (writes, and surfaces we refuse); not in any denominator on this page.

Mode — what kind of answer a row gets

derive
the response is computed from artifact rows that already exist
generate
canon does not carry this yet; the generator will produce it, then derive
empty
the true answer for this universe is an empty collection — reason + reviewed date required
refuse
mirror the provider's OWN refusal (e.g. its 403 for a non-admin token) — reason + reviewed date required
read-only
a write named in the manifest because clients probe it; the read-only 403 IS its final response, and it never joins the badge denominator

A row with no mode shown has not been judged yet. Modes are the manifest's own words, from coverage/MODES.yaml; every empty and refuse carries a written reason and a review date before it counts as final.

Badge — where Full starts

Full
every published read row has a final answer
Deep
60% up to 100%
Partial
25% up to 60%
Preview
under 25%

REST + GraphQL + git rows that are not `excluded`. Write operations are NOT rows (DECISIONS 2026-09-01 decision 9): they are counted in meta.write_operations and never enter this ratio.

13 read surfaces in 5 families

teams4 of 4 served & verified
GET
/me/joinedTeams
served & verified
Core
GET
/teams
served & verified
Core
GET
/teams/{team-id}
served & verified
Core
GET
/users/{user-id}/joinedTeams
served & verified
Core
messages3 of 3 served & verified
GET
/teams/{team-id}/channels/{channel-id}/messages
served & verified
Core
GET
/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}
served & verified
Core
GET
/teams/{team-id}/channels/{channel-id}/messages/{chatMessage-id}/replies
served & verified
Core
users3 of 3 served & verified
GET
/me
served & verified
Core
GET
/users
served & verified
Core
GET
/users/{user-id}
served & verified
Core
channels2 of 2 served & verified
GET
/teams/{team-id}/channels
served & verified
Core
GET
/teams/{team-id}/channels/{channel-id}
served & verified
Core
members1 of 1 served & verified
GET
/teams/{team-id}/members
served & verified
Core

03 / What's simulated

One data set, rendered in Microsoft Teams's dialect.

Every Microsoft Teams call resolves against the same simulated data set every other provider serves. Counted from the teams-v1-g11 artifact (universe generation 11):

What another provider has to agree with, and the test that makes it

Each line below is one assertion in the conformance suite named beside it — run on every build, over one artifact, through the real renderers. Nothing is claimed here that no expect checks.

05 / Pinned snapshots

Frozen universes, on their own hostnames.

Each pin regenerates byte-identically on every request, so a test written against one never drifts. Generations are DIFFERENT universes, not versions of one — never swap a suffix expecting the same data.

PinHostUniverse generationMicrosoft Teams API versionRepository files
teams-v1teams-v1.snap.sandboxapis.devgeneration 6v1.0served
teams-v1-g10teams-v1-g10.snap.sandboxapis.devgeneration 10v1.0served
teams-v1-g11teams-v1-g11.snap.sandboxapis.devgeneration 11v1.0served
teams-v1-g8teams-v1-g8.snap.sandboxapis.devgeneration 8v1.0served
teams-v1-g9teams-v1-g9.snap.sandboxapis.devgeneration 9v1.0served

Need an endpoint that is not served yet?

Every row Microsoft Teams's manifest carries is on this page, so “not here” is an answer rather than a gap in the rendering. Tell us which path and which client, and it moves up the queue — the order is set by what people ask for.

Request coverage