---
title: "Supported provider operations"
description: "Bounded synthetic operation contracts generated from the CLI source."
canonical: "https://agenttwin.si/docs/provider-operations/"
---

# Supported provider operations

Bounded synthetic operation contracts generated from the CLI source.


These are implemented operation subsets, not full provider replicas or independently verified production parity. Unsupported operations make coverage incomplete. Authentication below describes synthetic twin credentials, not AgentTwin account login.

## composio

Contract version: 1.0.0. Run-scoped transport token; SDK tests use synthetic API keys.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/api/v3[.1]/connected_accounts` | list filtered seeded accounts |
| DELETE | `/api/v3[.1]/connected_accounts/<id>` | mark seeded connection deleted and disabled |
| GET | `/api/v3[.1]/tools/<GMAIL_SEND_EMAIL\|GMAIL_SEND_MESSAGE>` | read bounded immutable SDK metadata |
| POST | `/api/v3[.1]/tools/execute/<GMAIL_SEND_EMAIL\|GMAIL_SEND_MESSAGE>` | append a synthetic message for an active user-owned Gmail connection |

- Only two Gmail send slugs, connected-account list/delete and their SDK metadata; not arbitrary tools.execute support
- Synthetic messages are held in this service, not shared with a separately configured Gmail twin
- No real OAuth, refresh, ACLs, account creation, revocation, attachments, HTML or proxy calls
- Synthetic offset cursor and fixture order; not provider pagination/order guarantees
- No Idempotency-Key guarantee; duplicate sends are possible
- Only latest schema shape, verified against @composio/core 0.18.0; pinned toolkit versions require implementation
- Unknown operations/parameters return 501 and make coverage incomplete

## google-oauth

Contract version: 1.0.0. Run-scoped transport token plus explicitly seeded synthetic confidential-client credentials.

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/token` | validate a seeded active refresh grant and append synthetic token issuance |

- Offline confidential-client refresh subset only; fixtures must use synthetic- credential prefixes
- No authorization-code exchange, consent, DPoP, refresh rotation, expiry clock or real provider validation
- No idempotency guarantee; retries can issue multiple access tokens
- Seed-only /clients and /grants; /tokens is an issuance ledger, not a public Google API endpoint
- Issued tokens are not coupled to Gmail scope or expiry enforcement; resource twins authenticate their run-scoped transport token
- Unknown grants, fields, methods and endpoints return 501 and make coverage incomplete

## json-collection

Contract version: 1.0.0. Bearer run-scoped test token.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `<collection path>` | read |
| POST | `<collection path>` | append |

- Custom API contract, not a vendor replica
- No update/delete, pagination, OAuth, webhooks or schema validation
- Idempotency compares the exact parsed JSON serialization

## openai

Contract version: 1.0.0. Bearer run-scoped test token; official OpenAI SDK configured with the twin base URL.

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/v1/chat/completions` | return the next scripted response (text and/or tool calls) and record the call in /requests |
| GET | `/v1/requests` | list recorded model calls |

- Scripted responses from the world file, not a language model; nothing is generated
- Responses are selected in order, or by a match substring of the last user message
- No streaming, embeddings, assistants, images or audio
- Token usage is reported as zero

## anthropic

Contract version: 1.0.0. x-api-key run-scoped test token; official Anthropic SDK configured with the twin base URL.

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/v1/messages` | return the next scripted response (text and/or tool_use blocks) and record the call in /requests |
| GET | `/v1/requests` | list recorded model calls |

- Scripted responses from the world file, not a language model; nothing is generated
- Responses are selected in order, or by a match substring of the last user message
- No streaming, batches or token counting
- Token usage is reported as zero

## stripe

Contract version: 1.0.0. Bearer run-scoped test token; official Stripe SDK configured with test endpoint.

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/v1/customers` | append customer |
| GET | `/v1/customers[/<id>]` | retrieve or list customers |
| POST | `/v1/payment_intents` | create test payment intent |
| GET | `/v1/payment_intents/<id>` | retrieve intent |
| POST | `/v1/payment_intents/<id>/confirm` | test success or decline; success creates a charge |
| POST | `/v1/refunds` | refund all or part of a charge; updates amount_refunded and records charge.refunded |
| GET | `/v1/refunds[/<id>]` | retrieve or list refunds |
| GET | `/v1/charges[/<id>]` | retrieve or list charges |
| GET | `/v1/events[/<id>]` | retrieve or list recorded charge.refunded events |

- Bounded subset, not full Stripe parity; minimal object fields only; no real money
- Only pm_card_visa and pm_card_chargeDeclined test methods
- Events are recorded and listable but webhooks are not pushed to your application
- No subscriptions, payment-method APIs, refund cancellation, updates or deletes
- Customers list supports limit/starting_after; payment intent listing unsupported
- POST idempotency supported; reset clears records and keys; unsupported operations/parameters return 501 and make coverage incomplete

## slack

Contract version: 1.0.0. Bearer run-scoped test token; no Slack OAuth.

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/api/chat.postMessage` | append /messages |
| GET / POST | `/api/conversations.history` | read /messages |
| GET / POST | `/api/conversations.list` | read /channels |

- JSON and form bodies only
- No OAuth, scopes, pagination, threads, edits, deletes, attachments or webhooks
- Errors channel_not_found/no_text use HTTP 200 with ok:false
- Unmodeled parameters and operations return HTTP 501 and make coverage incomplete

## github

Contract version: 1.0.0. Bearer run-scoped test token; GitHub-style Authorization header.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/repos` | list repositories |
| GET | `/repos/<repo>` | retrieve repository by name or full_name |
| GET | `/repos/<repo>/issues` | list issues |
| POST | `/repos/<repo>/issues` | create issue |
| GET | `/repos/<repo>/issues/<number>` | retrieve issue |
| PATCH | `/repos/<repo>/issues/<number>` | update title/body or close |
| POST | `/repos/<repo>/issues/<number>/comments` | create comment |
| GET | `/repos/<repo>/issues/<number>/comments` | list comments |
| GET | `/repos/<repo>/pulls` | list pull requests |
| GET | `/repos/<repo>/pulls/<number>` | retrieve pull request |
| PUT | `/repos/<repo>/pulls/<number>/merge` | merge pull request |
| POST | `/repos/<repo>/check-runs` | create check run |

- Bounded REST v3-shaped subset; minimal object fields only
- Ids, numbers and timestamps are deterministic synthetic values
- No auth beyond the run token, no reactions, labels mutation, reviews, branches, contents, releases or webhooks
- Unknown query parameters and operations return 501 and make coverage incomplete

## linear

Contract version: 1.0.0. Bearer run-scoped test token; GraphQL endpoint shape.

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/graphql query viewer` | read first seeded user as viewer |
| POST | `/graphql query issues` | list issues |
| POST | `/graphql query issue(id:)` | retrieve issue |
| POST | `/graphql query projects` | list projects |
| POST | `/graphql query project(id:)` | retrieve project |
| POST | `/graphql mutation issueCreate` | create issue |
| POST | `/graphql mutation issueUpdate` | update issue |
| POST | `/graphql mutation commentCreate` | create issue comment |

- GraphQL-shaped approximation of Linear’s API, not the real schema: a bounded root-field whitelist over the same POST /graphql surface
- Structured inputs must be sent as GraphQL variables; inline object arguments are rejected
- Responses use full bounded node shapes regardless of selection set; no pagination, filters, teams, workflows, attachments or subscriptions
- Known failures (missing entity, validation) use HTTP 200 GraphQL errors; unsupported root fields return 501 and make coverage incomplete

## notion

Contract version: 1.0.0. Bearer run-scoped test token; requires Notion-Version header.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/v1/pages/<id>` | retrieve page |
| POST | `/v1/pages` | create page in a seeded database |
| PATCH | `/v1/pages/<id>` | update properties or archive |
| GET | `/v1/databases/<id>` | retrieve database |
| POST | `/v1/databases/<id>/query` | query pages in database |
| PATCH | `/v1/blocks/<id>/children` | append child blocks |

- Bounded envelope subset: pages must use a seeded database parent
- Ids are deterministic synthetic UUIDs; no url, users, comments, searches or nested rich text parsing
- Databases and blocks are returned as created; schema changes and page_size cursoring are not modeled
- Unsupported filters and operations return 501 and make coverage incomplete

## hubspot

Contract version: 1.0.0. Bearer run-scoped test token; HubSpot-style Bearer private token.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/crm/v3/objects/<contacts\|companies\|deals\|tickets>` | list objects |
| POST | `/crm/v3/objects/<contacts\|companies\|deals\|tickets>` | create object |
| GET | `/crm/v3/objects/<object>/<id>` | retrieve object |
| PATCH | `/crm/v3/objects/<object>/<id>` | update properties |
| POST | `/crm/v3/objects/<object>/search` | search objects |

- Bounded CRM v3 subset: scalar properties only, no associations, batches, pipelines, owners or dedupe
- Ids and timestamps are deterministic synthetic values
- properties/sorts query parameters and filter operators beyond EQ are unsupported
- Unknown objects, parameters and operations return 501 and make coverage incomplete

## shopify

Contract version: 1.0.0. Bearer run-scoped test token; also accepts X-Shopify-Access-Token.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/admin/api/2024-01/products.json` | list products |
| POST | `/admin/api/2024-01/products.json` | create product |
| GET / PUT | `/admin/api/2024-01/products/<id>.json` | retrieve or update product |
| GET | `/admin/api/2024-01/orders.json` | list orders |
| POST | `/admin/api/2024-01/orders.json` | create order with line_items |
| GET / PUT | `/admin/api/2024-01/orders/<id>.json` | retrieve or update order |
| GET | `/admin/api/2024-01/customers.json` | list customers |
| POST | `/admin/api/2024-01/customers.json` | create customer |
| GET / PUT | `/admin/api/2024-01/customers/<id>.json` | retrieve or update customer |

- REST Admin API pinned to version 2024-01; .json endpoints only
- No metafields, variants mutation, fulfillment, transactions, webhooks, GraphQL or counts endpoints
- Ids and timestamps are deterministic synthetic values
- Unknown parameters and operations return 501 and make coverage incomplete

## datadog

Contract version: 1.0.0. Bearer run-scoped test token; also accepts DD-API-KEY and DD-APPLICATION-KEY headers.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/api/v1/monitors` | list monitors |
| POST | `/api/v1/monitors` | create monitor |
| GET | `/api/v1/monitor/<id>` | retrieve monitor |
| POST | `/api/v1/monitor/<id>/mute` | mute monitor |
| POST | `/api/v1/events` | post event |
| GET | `/api/v1/events` | list events in window |
| GET | `/api/v1/query` | query seeded metric series |

- Bounded v1 subset: no dashboards, logs, SLOs, downtimes, unmute or v2 endpoints
- Overall state is always OK; monitor unmute and event deletion are unsupported
- Metric queries return seeded /metrics points clipped to the window; unknown metrics return empty series
- Unknown parameters and operations return 501 and make coverage incomplete

## gmail

Contract version: 1.0.0. Bearer run-scoped test token; Google-style OAuth2 Bearer header.

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/gmail/v1/users/me/messages/send` | append a sent message |
| GET | `/gmail/v1/users/me/messages` | list message ids with a snippet q filter |
| GET | `/gmail/v1/users/me/messages/<id>` | retrieve message |
| GET | `/gmail/v1/users/me/labels` | list seeded labels |

- Bounded Gmail v1 subset: send, list, get and labels only
- Sent messages carry a bounded Message envelope; MIME bodies are not parsed and attachments are not modeled
- No drafts, threads, history, modify, trash or watch endpoints
- Unknown fields and operations return 501 and make coverage incomplete

## google-calendar

Contract version: 1.1.0. Bearer run-scoped test token; Google-style OAuth2 Bearer header.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/calendar/v3/users/me/calendarList` | list seeded calendars |
| GET | `/calendar/v3/calendars/primary/events` | filter and paginate nonrecurring timed primary-calendar events |
| POST | `/calendar/v3/calendars/primary/events` | create event |
| GET | `/calendar/v3/calendars/primary/events/<id>` | retrieve event |
| PATCH | `/calendar/v3/calendars/primary/events/<id>` | update event fields |
| DELETE | `/calendar/v3/calendars/primary/events/<id>` | delete event (responds 200 with an empty object; production returns 204) |

- Bounded Calendar v3 subset: events on the primary seeded calendar only; requests to any other calendar id return 404
- Recurring-event expansion, all-day timezone filtering, reminders, conference data and sendUpdates are not modeled; these queries return 501
- Pagination tokens are synthetic and expire when query or event state changes; calendar queries follow documented end &gt; timeMin and start &lt; timeMax semantics
- Unknown fields and operations return 501 and make coverage incomplete

## gitlab

Contract version: 1.0.0. Bearer run-scoped test token; GitLab-style Bearer/OAuth token.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/api/v4/projects` | list projects |
| POST | `/api/v4/projects` | create project |
| GET | `/api/v4/projects/<id>` | retrieve project |
| GET | `/api/v4/issues` | list issues |
| POST | `/api/v4/issues` | create issue in a seeded project |
| GET | `/api/v4/issues/<id>` | retrieve issue |
| GET | `/api/v4/merge_requests` | list merge requests |
| POST | `/api/v4/merge_requests` | create merge request in a seeded project |
| GET | `/api/v4/merge_requests/<iid>` | retrieve merge request |
| GET | `/api/v4/merge_requests/<iid>/notes` | list merge request notes |
| POST | `/api/v4/merge_requests/<iid>/notes` | create merge request note |

- Bounded v4 subset: groups, branches, pipelines, environments, tags workflows and uploads are not modeled
- Ids, iids and timestamps are deterministic synthetic values
- List endpoints take no query parameters; unsupported filters return 501
- Unknown operations return 501 and make coverage incomplete

## jira

Contract version: 1.0.0. Bearer run-scoped test token; Atlassian PAT Bearer header.

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/rest/api/3/issue` | create issue |
| GET | `/rest/api/3/issue/<keyOrId>` | retrieve issue |
| POST | `/rest/api/3/search` | search issues with bounded JQL (project = KEY only) |
| POST | `/rest/api/3/issue/<key>/comment` | create issue comment (ADF doc or plain string) |
| POST | `/rest/api/3/issue/<key>/transitions` | apply a bounded transition (11 To Do, 21 In Progress, 31 Done) |
| GET | `/rest/api/3/project` | list seeded projects |
| GET | `/rest/api/3/project/<key>` | retrieve project |

- Bounded /rest/api/3 subset
- JQL supports only the project = KEY clause; unsupported clauses return 501
- Transitions are the fixed ids 11/21/31 and respond 200 with an empty object
- Comment bodies accept ADF doc objects or plain strings; no rich-text validation
- No attachments, watchers, boards, bulk operations or user endpoints
- Unknown fields and operations return 501 and make coverage incomplete

## discord

Contract version: 1.0.0. Bearer run-scoped test token; also accepts the Discord-idiomatic Authorization: Bot header.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/api/channels/<id>` | retrieve seeded channel |
| GET | `/api/channels/<id>/messages` | list channel messages (newest first) |
| POST | `/api/channels/<id>/messages` | create channel message |
| GET | `/api/guilds/<id>` | retrieve seeded guild |
| GET | `/api/guilds/<id>/members` | list guild members |

- Bounded subset: channels and guilds exist only as seeded reference state
- Message edit/delete, reactions, roles, threads and guild creation are unsupported
- Member results are seeded records; no gateway presence or intents

## twilio

Contract version: 1.0.0. Bearer run-scoped test token; production Twilio HTTP Basic auth is not required by this twin.

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/2010-04-01/Accounts/<sid>/Messages.json` | create outbound message (status queued) |
| GET | `/2010-04-01/Accounts/<sid>/Messages.json` | list messages |
| POST | `/2010-04-01/Accounts/<sid>/Calls.json` | create outbound call (status queued) |
| GET | `/2010-04-01/Accounts/<sid>/Calls.json` | list calls |

- JSON bodies accepted in place of Twilio’s form encoding; the .json suffix is optional
- Messages and Calls only; statuses stay queued and never progress in-flight
- No call updates, lookups, queues, recordings, SMS status callbacks or rate limits
- Deterministic synthetic sids; any account sid is accepted
- Unknown parameters and operations return 501 and make coverage incomplete

## zendesk

Contract version: 1.0.0. Bearer run-scoped test token; production Zendesk Basic auth is not required by this twin.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/api/v2/tickets.json` | list tickets |
| POST | `/api/v2/tickets.json` | create ticket |
| GET | `/api/v2/tickets/<id>.json` | retrieve ticket |
| PUT | `/api/v2/tickets/<id>.json` | update ticket fields |
| GET | `/api/v2/users.json` | list seeded users |
| GET | `/api/v2/organizations.json` | list seeded organizations |

- Bounded Support API v2 subset: ticket create/list/get/update plus users and organizations lists
- No macros, views, triggers, audits, attachments, bulk updates or deletes
- Users and organizations are seed-only records; their updates are unsupported
- Unknown fields and operations return 501 and make coverage incomplete

## salesforce

Contract version: 1.0.0. Bearer run-scoped test token (OAuth access token shape).

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/services/data/vXX.X/sobjects/<Account\|Contact\|Lead\|Opportunity\|Case>` | create record (18-char id with object prefix) |
| GET | `/services/data/vXX.X/sobjects/<object>/<id>` | retrieve record with attributes |
| PATCH | `/services/data/vXX.X/sobjects/<object>/<id>` | update fields (204) |
| DELETE | `/services/data/vXX.X/sobjects/<object>/<id>` | delete record (204) |
| GET | `/services/data/vXX.X/query?q=SOQL` | single-object SOQL with = / != filters joined by AND and LIMIT |

- Five standard objects; no custom objects, relationships, ORDER BY, OR, LIKE, aggregates or Composite/Bulk API
- No validation rules, triggers, flows or sharing; only standard required fields are enforced

## servicenow

Contract version: 1.0.0. Bearer run-scoped test token.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/api/now/table/<incident\|change_request\|problem\|sc_request\|sys_user>` | list with sysparm_query (= and != joined by ^), sysparm_limit/offset/fields; X-Total-Count header |
| POST | `/api/now/table/<table>` | create record with sys_id and number (INC0010001…) |
| GET | `/api/now/table/<table>/<sys_id>` | retrieve |
| PATCH / PUT | `/api/now/table/<table>/<sys_id>` | update; values stored as strings |
| DELETE | `/api/now/table/<table>/<sys_id>` | delete (204) |

- Five tables; no ^OR, LIKE, ORDERBY, dot-walking, display values, business rules, ACLs or workflows

## workday

Contract version: 1.0.0. Bearer run-scoped test token.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/ccx/api/v1/<tenant>/workers` | list/search workers |
| GET | `/ccx/api/v1/<tenant>/workers/<id>` | retrieve worker |
| POST | `/ccx/api/absenceManagement/v1/<tenant>/workers/<id>/requestTimeOff` | submit time off; rejects dates already requested |
| GET | `/ccx/api/absenceManagement/v1/<tenant>/workers/<id>/timeOffDetails` | list a worker's requests |

- Workers and time off only; business processes never advance past Submitted
- No SOAP Web Services, RaaS reports, compensation, hiring or approvals

## sap

Contract version: 1.0.0. Bearer run-scoped test token; writes require the x-csrf-token fetched by a prior GET (x-csrf-token: Fetch).

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner[('<id>')]` | list ($filter eq/and, $top, $skip) or read |
| POST | `/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner` | create business partner |
| GET | `/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder[('<id>')]` | list or read sales orders |
| POST | `/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder` | create sales order with deep-inserted to_Item; sold-to party must exist |
| PATCH / MERGE | `<entity>('<id>')` | update header fields (204) |

- OData v2 JSON only; no $expand, $batch, $orderby, pricing, ATP checks or delivery/billing documents

## microsoft-teams

Contract version: 1.0.0. Bearer run-scoped test token (Graph access token shape).

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/v1.0/teams/<team>/channels` | list channels |
| POST | `/v1.0/teams/<team>/channels/<channel>/messages` | post channel message |
| GET | `/v1.0/teams/<team>/channels/<channel>/messages` | list top-level messages |
| POST / GET | `/v1.0/teams/<team>/channels/<channel>/messages/<id>/replies` | reply / list replies |
| POST / GET | `/v1.0/chats/<chat>/messages` | send / list chat messages |

- No adaptive card rendering, mentions resolution, reactions, edits, deletes, meetings or change notifications

## outlook

Contract version: 1.0.0. Bearer run-scoped test token (Graph access token shape).

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/v1.0/me/sendMail (or /users/<id>/sendMail)` | send mail (202); stored in sentitems |
| GET | `/v1.0/me/messages, /me/mailFolders/<inbox\|sentitems>/messages` | list with $filter eq, $top, $select |
| GET / PATCH | `/v1.0/me/messages/<id>` | read / update isRead, categories, importance, flag |
| POST | `/v1.0/me/messages/<id>/reply` | reply (202) |

- No attachments, drafts, forward, rules, calendar or delta queries; inbound mail exists only as seeded records

## entra-id

Contract version: 1.0.0. Bearer run-scoped test token (Graph access token shape).

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET / POST | `/v1.0/users` | list ($filter eq, $top, $select) / create user; duplicate UPN rejected |
| GET / PATCH / DELETE | `/v1.0/users/<id\|upn>` | read / update (204) / delete (204) |
| GET | `/v1.0/groups[/<id>]` | list / read groups |
| GET | `/v1.0/groups/<id>/members` | list members |
| POST | `/v1.0/groups/<id>/members/$ref` | add member (204); duplicates rejected |
| DELETE | `/v1.0/groups/<id>/members/<user>/$ref` | remove member (204) |

- Passwords are accepted but never stored; no sign-in, licences, roles, app registrations or conditional access

## okta

Contract version: 1.0.0. SSWS run-scoped test token (Okta API token header).

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET / POST | `/api/v1/users` | list (q, filter eq, limit) / create (?activate=false stages); duplicate login rejected |
| GET / POST / DELETE | `/api/v1/users/<id\|login>` | read / partial profile update / delete (first DELETE deactivates, second removes) |
| POST | `/api/v1/users/<id>/lifecycle/<activate\|deactivate\|suspend\|unsuspend>` | status transitions; invalid ones rejected |
| GET | `/api/v1/groups[/<id>]` | list / read groups |
| GET / PUT / DELETE | `/api/v1/groups/<id>/users[/<user>]` | list / add / remove members |

- No authentication flows, factors, apps, policies, event hooks or rate-limit headers; pagination links omitted

## confluence

Contract version: 1.0.0. Bearer run-scoped test token.

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET / POST | `/wiki/api/v2/pages` | list (space-id, title, status, limit) / create; duplicate title in a space rejected |
| GET / PUT / DELETE | `/wiki/api/v2/pages/<id>` | read (body-format=storage) / update requiring version+1 / trash |
| GET | `/wiki/api/v2/spaces` | list spaces |
| POST | `/wiki/api/v2/footer-comments` | comment on a page |

- Storage representation only; no attachments, labels, permissions, page tree moves, CQL search or v1 content API

## sharepoint

Contract version: 1.0.0. Bearer run-scoped test token (Graph access token shape).

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/v1.0/sites/<site>/lists` | list lists |
| GET / POST | `/v1.0/sites/<site>/lists/<list>/items` | list (expand=fields, $top) / create item |
| GET / DELETE | `/v1.0/sites/<site>/lists/<list>/items/<id>` | read / delete |
| PATCH | `/v1.0/sites/<site>/lists/<list>/items/<id>/fields` | update fields |
| GET / POST | `/v1.0/sites/<site>/drive/root/children` | list / create folder; name conflicts honour conflictBehavior |

- No file content upload or download, versions, permissions, column validation or search

## snowflake

Contract version: 1.0.0. Bearer run-scoped test token (key-pair JWT shape).

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/api/v2/statements` | execute one single-table SELECT (WHERE =/!= AND, ORDER BY, LIMIT), INSERT … VALUES, UPDATE … SET … WHERE or DELETE; ? bindings supported; values returned as strings |
| GET | `/api/v2/statements/<handle>` | fetch a previous result |

- Twins the HTTP SQL API v2; the native drivers (snowflake-sdk, snowflake-connector-python) speak a different wire protocol and must be pointed at the SQL API or a json-collection stand-in
- Each table is a declared collection named in upper case; no joins, functions, aggregates, transactions, DDL, async execution or result partitions

## netsuite

Contract version: 1.0.0. Bearer run-scoped test token (OAuth 2.0 shape).

| Method | Endpoint | Effect |
| --- | --- | --- |
| GET | `/services/rest/record/v1/<customer\|vendor\|salesOrder\|invoice\|vendorBill>` | list ids and links only (q: field IS "v", limit, offset) |
| POST | `/services/rest/record/v1/<type>` | create; 204 with Location header and no body |
| GET / PATCH / DELETE | `/services/rest/record/v1/<type>/<id>` | read / update (204) / delete (204) |

- Five record types; no SuiteQL, sublists beyond item lines, subsidiaries, workflows or SuiteScript; X-NetSuite-Idempotency-Key is honoured like Idempotency-Key

## pagerduty

Contract version: 1.0.0. Token token=&lt;run-scoped test token&gt; for REST; Events API v2 uses the seeded service integration_key as routing_key.

| Method | Endpoint | Effect |
| --- | --- | --- |
| POST | `/v2/enqueue` | Events API v2 trigger/acknowledge/resolve; an open dedup_key groups instead of paging again (202) |
| GET / POST | `/incidents` | list (statuses[], service_ids[], incident_key) / create; requires From header; open incident_key rejected |
| GET / PUT | `/incidents/<id>` | read / acknowledge or resolve |
| GET / POST | `/incidents/<id>/notes` | list / add notes |
| GET | `/services` | list seeded services |

- No escalation policies, schedules, on-call, notifications, alert grouping windows or webhooks
