Working on a connect-only connection
Reddit, X and Microsoft Advertising connect as accounts and raw requests. This note is how an agent reads through platform_request.get, drafts a change with a sentence, quotes a raw answer's money, and says what Tempio never verified or narrowed.
Last reviewed 2026-09-25.
A connection whose capabilities.coverage is connect_only holds a sign-in and
the ad accounts it picked, and nothing below them. Reddit, X and Microsoft
Advertising connect this way. Tempio syncs the account (its name, id, currency,
time zone and status) on the plan's schedule and reads no campaigns, ad groups,
ads or daily numbers from the platform. Its operations list is empty, so every
modelled draft on it is refused before it is written, and it contributes no rows
to a metrics read, a campaign list, a plan or an account brief.
Every tool result that touches such a connection carries
connect_only_connection (write_gate_closed, info) in place of
operation_unsupported. Read it as the reason a question about numbers on that
platform has no answer in Tempio's reports, and say so once. Never report a
connect-only platform's spend as zero; Tempio holds no figure for it.
Reading
Anything past the account is one raw read away. Call tempio_manage with
entity: "platform_request" and action: "get", or the explicit
platform_api_request tool, with the connectionId, the method and the
platform's own path. Tempio adds the base; a path that resolves to another host
is refused. Whether a request is a read is decided by the endpoint, per
platform: on Reddit and X any GET, and on Microsoft Advertising a POST or
GET whose last path segment starts with Get, Query or Search. Anything
else is a change, and get refuses it.
A read executes at once. It needs raw requests turned on for the workspace by an
owner, view on the connection, and the connection active rather than paused.
Each connection may send thirty raw requests a minute; past that the read is
refused as rate_limited with a wait, and the right move is to wait, not to
retry at once. An answer above 1 MiB comes back as its size alone with
escape_hatch_response_truncated: ask for fewer fields or a smaller page.
What a raw answer's money means
Every raw read carries escape_hatch_unmodelled. The body is the platform's own
answer, after Tempio removed anything shaped like a credential
(escape_hatch_redacted says when it did). Tempio has not normalised it, so:
- An amount is in the platform's units. It may be micros, a decimal string or whole currency, and the currency may sit on another object entirely. It is not integer minor units, and it must not be converted by guesswork.
- A ratio is the platform's own, computed by its own rule. It is not Tempio's read-time ratio and may not be null where Tempio's would be.
- None of it is in Tempio's reports. Never add a raw figure to a Tempio total, rank it beside a modelled platform's rows, or quote it without naming the platform it came from.
Drafting a change
A change goes through action: "mutate" (or platform_api_mutate) with a
description, and the description is mandatory: one sentence saying what the
request changes and why, because a person reads it at the gate and a method with
a path is not a description. Drafting needs raw changes allowed as well as raw
requests on, and draft on the connection. Nothing is sent. The result is one
change_request at account level with approvedBy: "pending" and a review
link; hand the link to the person.
No rule can clear a raw change, because platform_api_request is in
POLICY_NEVER_OPERATIONS, and the chat agent cannot approve one. A person with
approve access on the connection does, under any approval chain or separation of
duties the workspace set. On approval Tempio re-checks the switches and the kill
switch, sends the request once, and never retries a change that reached the
platform. With the kill switch closed, the approved row goes back to the gate
with nothing sent.
What is never verified
A modelled change is read back after it applies. A raw change cannot be: there
is no modelled row to compare. The applied row carries escape_hatch_unverified
(write_gate_closed, degraded) and the platform's response, capped at 64 KiB.
Report it as sent and answered, quote the platform's words, and do not claim the
change took effect. A raw read after it is how to check.
What a raw request can reach
A raw request carries the grant's token, so it reaches whatever that login can reach on the platform, not only the account the connection names. Where one consent picked two accounts, a raw read on one connection can name the other's account in its path. Restricted connections decide who may use a connection; they do not narrow what its grant reaches. Tempio does not pin a path to the connection's account. Do not describe a raw read as limited to one account, and do not use one connection's path to reach an account the person asked about under another.
Sources
- connectOnlyAdapter: coverage connect_only, no operations, every modelled reader refused as unsupported —
repo://apps/app/lib/ads/adapters/connect-only.ts(read 2026-09-25) - executePlatformRead and executePlatformMutation: the switches, the kill switch, redaction and the audit row —
repo://apps/app/lib/ads/escape-hatch/service.ts(read 2026-09-25) - connect_only_connection, escape_hatch_unmodelled, escape_hatch_unverified and the other escape_hatch codes —
repo://apps/app/lib/ads/warnings.ts(read 2026-09-25) - POLICY_NEVER_OPERATIONS, which keeps every rule off platform_api_request —
repo://apps/app/lib/ads/policy/auto-approve.ts(read 2026-09-25) - Raw platform requests: limits, redaction, the raw budget and what a raw request can reach —
repo://apps/docs/content/docs/connections/escape-hatch.mdx(read 2026-09-25)