List an account’s AI apps
This page needs your own installation with an Embed license.
GET/
Lists the AI apps an account’s people connected by signing in. Not its API tokens.
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
userOptional · stringOnly this person’s, by your ID.
cursorOptional · stringThe
pagination.nextCursorof the page before, also answered asnext. Left out: the first page.limitOptional · integerRows a page, 1 to 100. The default is 50.
Read a row
The app, the person, the workspaces it reaches, what it may do (access: read, run, draft or publish) and its address (surface).
paused names the first switch that stops it now: tokens, mcp, mcpSignIn, or mcpBuild for a build connection. It works again when the switch is back on, for up to 180 days after it connected. See Tokens and AI apps.
Responses
- 200OK
The connections, newest first.
pagination.nextCursorandnexthold the same cursor,nullon the last page. limit,cursororuserisn’t valid.- 404
NOT_FOUNDYou have no account with this ID.
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}ai-apps"
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}/ai-apps`,
{
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}/ai-apps",
headers={"Authorization": f"Bearer {KEY}"},
)
data = res.json()["data"]Response · 200 OK
{
"data": [
{
"id": "6e9a1c3f-8b2d-4a57-9e0c-3f7b5d1a8c42",
"client": {
"name": "Claude",
"redirectHost": "claude.ai",
"kind": "web"
},
"user": {
"id": "ada-123",
"name": "Ada Lovelace"
},
"workspaces": [
{
"id": "ws-orders",
"name": "Orders",
"default": false
}
],
"access": "run",
"surface": "tools",
"paused": null,
"createdAt": "2026-10-22T10:00:00Z",
"lastUsedAt": "2026-10-25T09:00:00Z",
"expiresAt": "2027-04-20T10:00:00Z"
}
],
"next": null,
"pagination": {
"limit": 50,
"nextCursor": null
}
}Every field
It takes no body.
Response · 200 OK
dataarray of objectsidUUIDclientobjectnamestringThe application’s name, as its registration claims it.
redirectHoststringWhere its code would go: a host, or an app’s callback.
kindstringOne of
web,loopback,app.userobjectidstringnamestringworkspacesarray of objectsidstringYour workspace id;
defaultfor the account’s default workspace.namestringdefaultbooleanaccessstringOne of
read,run,draft,publish.surfacestringOne of
build,tools.pausedstring or nullThe first switch off that this connection needs (it works again when the switch is back on), or null.
createdAttimelastUsedAttime or nullexpiresAttimenextstring or nullThe same cursor as
pagination.nextCursor.paginationobjectlimitintegernextCursorstring 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.