Google Antigravity API sandbox
Point a client for the Gemini Interactions API at https://antigravity.sandboxapis.dev, a base-URL swap. Paths are /v1beta/… exactly as on generativelanguage.googleapis.com. The JavaScript SDK (@google/genai) takes `httpOptions: { baseUrl }`; the Python SDK (google-genai) takes `http_options={"base_url": ...}`; both also read the GOOGLE_GEMINI_BASE_URL environment variable. Auth: any x-goog-api-key value, any ?key= value, any 'Authorization: Bearer' token, or none at all. WHAT IS RENDERED: the Antigravity managed agent's runs in this data set, read-only: the scheduled triggers, each trigger's executions, the interaction every execution started (status, usage, environment and its steps: the shell commands the agent ran and a short fact-only summary, never a thought step), the agent environments with a file listing at the commit the run worked on, and the credentials (ids, type, status and times only; no secret field exists). HOW TO FIND AN INTERACTION ID: there is no list of interactions (the real API answers "Method not found."), so walk GET /v1beta/triggers, then GET /v1beta/triggers/{id}/executions, and take trigger_executions[].interaction_id to GET /v1beta/interactions/{id}; Trigger.previous_interaction_id names a trigger's newest one. WHAT IS NOT: inference of any kind (POST /v1beta/interactions, models/...:generateContent and every other Gemini model path answer a refusal or a coverage 404), streaming (?stream=true), webhooks, voices, and every write (a 403 saying this universe is read-only). Live host only: no pinned snapshot exists for this provider yet. Check https://sandboxapis.dev/providers/antigravity for the row-by-row picture.
Coverage badge
Deep13/15 · 87%
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.
antigravity.sandboxapis.devServed & verified
12 / 80%
Answering with real universe data, each response checked against Google Antigravity's published spec by the conformance suite on this build. 4 of them are marked a deviation — served faithfully, but failing the vendored spec.
The full read API
15
Every read surface Google Antigravity publishes, deferred long tail included, minus the rows excluded by policy. Writes are out of scope: this universe is read-only.
Not served yet
3
Each returns an explicit, provider-shaped coverage error naming the gap — never invented data.
01 / The swap
No SDK of ours, no shim, no recorded fixtures. The same client library you already use, one environment variable different.
curl "https://antigravity.sandboxapis.dev/v1beta/triggers"Verified drop-in clients
@google/genai2.30.0The 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
All 15 rows the coverage manifest carries for Google Antigravity, 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
Mode — what kind of answer a row gets
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.
Held — buildable, deliberately not built yet
held is a label, not a mode and not a status. A held row is one somebody looked at, judged buildable, and left with the blocker named — so it is not covered, counts against the ratio above exactly like any other unbuilt row, and still answers the coverage 404. It buys nothing; it only tells you why.
Badge — where Deep starts
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.
15 read surfaces in 9 families
this data set saved no custom agent: every Antigravity run uses the managed agent id (antigravity-preview-09-2026), and the Interactions API's own answer for a project with none is CAPTURED as {"agents":[]} at 200 (2026-10-22), the one list on this API that keeps its empty array. True on every generation, so it is served even on an artifact without the agent-run canon
refuse — ENTAILED by the empty beside it: no custom agent exists, so no id resolves, and the real API's own answer is the agents service's compact 404, CAPTURED for an unknown id on 2026-10-22: {"error":{"message":"Requested entity was not found.","code":"not_found"}}, not array-wrapped. `x-sandboxapis-refusal` is the whole wire difference
generateheld · data-licensing — after this data set's custom voices, of which there are none, ListVoices returns Google's own prebuilt voice catalogue (50 entries on the first page, captured 2026-10-22), so every entry would be vendor content this project holds no grant to redistribute (the ToS ruling of 2026-10-22: shapes only), and `{}` would be false because the real list is never empty. Answers the coverage 404 (decisions/2026-10-27-2139-antigravity-voices.md)
generate — GetVoice resolves only a custom stored voice (the operation says prebuilt catalogue voices cannot be retrieved through it), and canon carries no stored voice, so the row derives the day a later canon wave stores one. Until then the true answer would be the API's own not-found, and that is not captured for the voices service: this API speaks two 404 dialects, the compact service form on agents and environments and the google.rpc form on triggers, and which one voices uses is unknown, so the row is not armed as a refusal and answers the coverage 404 (decisions/2026-10-27-2139-antigravity-voices.md)
SERVED 2026-10-27 (hello-23 agentWebhooks; decisions/2026-10-27-2306-hello-23-serving-rest.md): the one registration the team made when it started running agents unattended, a webhook_subscription row of kind agent_reference created with the first trigger. subscribed_events are exactly the outcomes the agent runs hold (interaction.completed and interaction.failed at seed 42), never a batch or video event; state enabled; signing_secrets omitted (orchestrator ruling F9: canon generated no secret). Delivery stays a standing non-goal. An artifact before hello-23 answers the generation gap
SERVED 2026-10-27 (hello-23 agentWebhooks; decisions/2026-10-27-2306-hello-23-serving-rest.md): the registration the list serves, by id; an unknown id is the google.rpc 404 the trigger and credential reads answer (the webhook id format and its 404 dialect are capture-pending, coverage/provider-pins.yaml). An artifact before hello-23 answers the generation gap
03 / What's simulated
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.
Every interaction that names a pull request in its labels names one the GitHub host serves with the same number, head SHA and author, and an issue key Jira resolves as the issue that pull request closed.
No Antigravity run appears among Devin's sessions or Cursor's cloud agents, and no pull request is claimed by two agent vendors.
A trigger's `time_zone` is the IANA zone Slack's user profile gives the trigger's owner, and an environment's file listing is the GitHub tree at the commit the run worked on.
04 / Known deviations
These answer with real data and match what Google Antigravity actually returns, but fail the spec we vendor from Google Antigravity — nearly always a bug in that published description. They are listed rather than counted so you can see whether one of them is the endpoint your client calls, and they are never counted as verified.
GET /{api_version}/triggerstriggersGET /{api_version}/triggers/{id}triggersGET /{api_version}/environments/{environment}/files/{path}environment-filesGET /{api_version}/interactions/{interactionsId}interactions05 / Pinned snapshots
No snapshot is pinned for Google Antigravity yet — the live host is the only way to reach it, and its data moves. Pin a provider you test against before you depend on exact values.
Need an endpoint that is not served yet?
Every row Google Antigravity'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.