List connections
This page needs your own installation with an Embed license.
GET/
Lists every connection in an account: the ones you manage and the ones the customer made. Never a secret.
Needs a partner key: Authorization: Bearer gre_…, from Platform › Partner keys. Call it from your server only.
Parameters
Path
accountIdRequired · stringYour ID for the customer’s account: 1 to 255 bytes of UTF-8, case-sensitive. URL-encode it: it may contain
/.
Query
workspaceIdOptional · stringOnly this workspace, by your ID. Left out: every workspace.
cursorOptional · stringThe
pagination.nextCursorof the page before. Left out: the first page.limitOptional · integerRows a page, 1 to 100. The default is 50.
Read a row
managedBy: partner rows have your key; the customer can use them but not change them. managedBy: customer rows have key: null. status: expired means its tokens can’t be renewed: replace them. See Your customers’ connections.
Responses
- 200OK
A page of connections, newest first.
A parameter isn’t valid, such as an empty
workspaceId.- 404
NOT_FOUNDNo such account or workspace.
Something failed on the installation’s side. Try again.
Any call can also answer: 401 UNAUTHORIZED · 403 EMBED_NOT_LICENSED · 403 IP_NOT_ALLOWED · 429 RATE_LIMITED · 503 BUSY. See Errors.
Request
GORUNNER="https://automations.example.com"
GORUNNER_EMBED_KEY="YOUR_PARTNER_KEY" # gre_…
ACCOUNT_ID="acct-bakery"
URL="$GORUNNER/api/embed/v1/accounts/$ACCOUNT_ID/"
URL="${URL}connections"
curl "$URL" \
-H "Authorization: Bearer $GORUNNER_EMBED_KEY"const GORUNNER = "https://automations.example.com";
const KEY = process.env.GORUNNER_EMBED_KEY; // gre_…
const ACCOUNT_ID = encodeURIComponent("acct-bakery");
const res = await fetch(
`${GORUNNER}/api/embed/v1/accounts/` +
`${ACCOUNT_ID}/connections`,
{
headers: { Authorization: `Bearer ${KEY}` },
},
);
const { data } = await res.json();import os, requests
from urllib.parse import quote
GORUNNER = "https://automations.example.com"
KEY = os.environ["GORUNNER_EMBED_KEY"] # gre_…
ACCOUNT_ID = quote("acct-bakery", safe="")
res = requests.get(
f"{GORUNNER}/api/embed/v1/accounts/"
f"{ACCOUNT_ID}/connections",
headers={"Authorization": f"Bearer {KEY}"},
)
data = res.json()["data"]Response · 200 OK
{
"data": [
{
"key": "sheets-main",
"id": "0f8b2c7e-4a51-4d3e-9b2a-6c1d2e3f4a5b",
"name": "Google Sheets (Bakery)",
"pieceId": "googlesheets",
"status": "ok",
"managedBy": "partner",
"workspace": {
"id": null,
"default": true
},
"createdAt": "2026-10-20T08:00:00Z",
"updatedAt": "2026-10-25T09:00:00Z"
},
{
"key": null,
"id": "6e9a1c3f-8b2d-4a57-9e0c-3f7b5d1a8c42",
"name": "Slack (Bakery)",
"pieceId": "slack",
"status": "ok",
"managedBy": "customer",
"workspace": {
"id": null,
"default": true
},
"createdAt": "2026-10-20T08:00:00Z",
"updatedAt": "2026-10-25T09:00:00Z"
}
],
"pagination": {
"limit": 50,
"nextCursor": null
}
}Every field
It takes no body.
Response · 200 OK
dataarray of objectskeystring or nullThe partner’s key; null for one the customer made.
idUUIDnamestringpieceIdstringstatusstringexpired: its tokens can no longer be refreshed; replace them.One of
ok,error,expired.managedBystringOne of
partner,customer.workspaceobjectidstring or nullThe partner’s workspace id; null for the default workspace.
defaultbooleancreatedAttimeupdatedAttimepaginationobjectlimitintegernextCursorstring or nullThe
cursorof the next page; null on the last page. A page that comes back full can carry a cursor even when nothing follows: the next page is then empty, with null here. Keep going until it is null.