Get an app
GET/
Returns one app with its actions and triggers.
Needs any API token. No permission is checked.
Parameters
Path
idRequired · stringThe app’s id, as a step’s
pieceIdholds it:http,webhook,schedule.
Query
viewOptional · stringsummary: no field schemas, just what you need to choose an action. Any other value returns the full app.
Read it
In the summary, each action lists fields, how many inputs it has, and discriminators: the fields its other fields depend on, most important first. Pass them to Get an action’s fields to narrow it.
actions describe the default version; a list that is empty is null in the full answer and [] in the summary. actionsByVersion and triggersByVersion list each version’s ids, for a step pinned to an older version.
Each action’s sideEffects says what running it does: pure, reads_external or writes_external. In the summary, needsConnection: true marks an app that takes a connection.
It sends no ETag.
Every answer has an X-GoRunner-Catalog-Source header. fleet: workers are checked in and runs work. last-known or compiled: no worker is, so you can read apps and edit workflows, but nothing runs. See Catalog status.
The connection it needs
The full answer has auth when the app takes a connection. auth.fields lists what to send as a connection’s config, by name; password fields are secrets. auth.required is true when a step can’t run without one.
An app whose auth has oauth2 signs in, such as Gmail. It holds the service’s authorizationUrl, tokenUrl and scopes. For those, start a sign-in rather than saving a secret. auth.type alone doesn’t say it: Gmail’s is custom.
Responses
- 200OK
The app, in full or as a summary.
- 403
FORBIDDENThe token may not do this.
- 404
NOT_FOUNDNo app with this id among those the workers run. An app this workspace may not use answers 404 too.
GoRunner couldn’t check which apps this workspace may use. Try again.
Any call can also answer: 401 UNAUTHORIZED · 401 TOKEN_ENDED · 403 TOKEN_SURFACE_OFF · 403 FEATURE_OFF · 403 EMBED_NOT_ALLOWED · 403 EMBED_NOT_AVAILABLE · 403 ACCOUNT_SUSPENDED · 429 RATE_LIMITED · 503 BUSY · 503 PAUSED · 503 SERVICE_UNAVAILABLE. See Errors.
Request
GORUNNER="https://api.gorunner.io"
GORUNNER_TOKEN="grt_…" # needs any API token
APP_ID="http"
curl "$GORUNNER/api/pieces/$APP_ID?view=summary" \
-H "Authorization: Bearer $GORUNNER_TOKEN"const GORUNNER = "https://api.gorunner.io";
const TOKEN = process.env.GORUNNER_TOKEN;
const APP_ID = process.env.APP_ID;
const res = await fetch(
`${GORUNNER}/api/pieces/` +
`${APP_ID}?view=summary`,
{
headers: { Authorization: `Bearer ${TOKEN}` },
},
);
const { data } = await res.json();import os, requests
GORUNNER = "https://api.gorunner.io"
TOKEN = os.environ["GORUNNER_TOKEN"]
APP_ID = os.environ["APP_ID"]
res = requests.get(
f"{GORUNNER}/api/pieces/{APP_ID}",
params={"view": "summary"},
headers={"Authorization": f"Bearer {TOKEN}"},
)
data = res.json()["data"]Response · 200 OK, shortened
{
"data": {
"id": "http",
"name": "HTTP Request",
"description": "Send HTTP requests to any URL",
"category": "HTTP",
"version": "1.0.0",
"versions": [
"1.0.0"
],
"actions": [
{
"id": "send_request",
"name": "Send HTTP request",
"description": "Send HTTP request",
"sideEffects": "writes_external",
"fields": 34,
"discriminators": [
{
"field": "body_type",
"type": "string",
"values": [
"none",
"json",
"raw",
"form_data",
"form_urlencoded"
]
},
{
"field": "auth_type",
"type": "string",
"values": [
"NONE",
"BASIC",
"BEARER_TOKEN",
"…"
]
},
"…"
]
}
],
"triggers": []
}
}Every field
It takes no body.
Response · 200 OK, the whole app
dataobjectAn app as the full catalog serves it, with every action and trigger schema inlined.
idstringThe value a step stores in
pieceId.namestringdescriptionstringlogoUrlstringIcon path. A
/icons/prefix is what classifies the app ascore.versionstringThe version a new step is pinned to (the default), not necessarily the newest in
versions.versionsarray of stringsEvery version the fleet can run, oldest first. An unpinned step resolves to the OLDEST.
iconstringIcon name for apps without a logo file.
categorystringnodeTypestringWhat kind of node this app produces on the canvas.
One of
action,trigger,branch,loop.kindstringcore= shipped and owned by this product;app= third-party connector.One of
core,app.actionsarray of objects or nullActions of the DEFAULT version only.
nullwhen the app has none.idstringThe value a step stores in
actionId.namestringdescriptionstringsideEffectsstringWhat running this does to the world. An untagged action is treated as
writes_external(fail-safe). Anything that can write must not be test-executed without the user’s consent.One of
pure,reads_external,writes_external.inputSchemaobjectAn operation’s full input or output schema, as served by the default catalog views.
typestringpropertiesobject{key}objectOne property of a full (unprojected) schema. Recursive through
propertiesanditems. Carries presentation fields (title,order,placeholder,group) that the projected views drop.Each key’s value.
typestringJSON type: string, number, boolean, object, array.
titlestringdescriptionstringThe field’s help as the step panel shows it.
defaultDefault value, of any JSON type.
enumarray of stringsClosed set of legal values.
enumLabelsobjectDisplay labels for the enum values.
{key}stringEach key’s value.
formatstringpropertiesobject{key}objectOne property of a full (unprojected) schema. Recursive through
propertiesanditems. Carries presentation fields (title,order,placeholder,group) that the projected views drop.The same fields as
data.actions.inputSchema.properties.{key}above.itemsobjectOne property of a full (unprojected) schema. Recursive through
propertiesanditems. Carries presentation fields (title,order,placeholder,group) that the projected views drop.The same fields as
data.actions.inputSchema.properties.{key}above.propertyTypestringHow the value is chosen: SHORT_TEXT, LONG_TEXT, STATIC_DROPDOWN, DROPDOWN, MULTI_SELECT, DYNAMIC, JSON, CODE, CHECKBOX, NUMBER, SECRET_TEXT and similar. DROPDOWN / MULTI_SELECT / DYNAMIC mean the legal values come from POST .../options/{propertyName} at run time, not from this schema.
placeholderstringgroupstringorderintegerrequiredbooleanminLengthintegermaxLengthintegerminnumbermaxnumberpatternstringrefreshersarray of stringsOther property names whose change invalidates this property’s resolved options.
refreshOnSearchbooleanexpressionEnabledbooleanlanguagestringFor CODE properties: the language of the editor, e.g. javascript.
displayConditionsarray of objectsANDed conditions deciding whether this property applies. The fields they name are this operation’s gate fields — the ones you can pass as query parameters to narrow the operation detail.
fieldstringThe sibling property whose value decides this one. Every gate field is itself a property of the same schema, so its declared type and enum are the legal values.
operatorstringAn unrecognized operator is treated permissively (the property is kept).
One of
eq,neq,in,notIn,contains_any,exists,notExists.valueComparison value for eq/neq, of any scalar JSON type.
valuesarrayCandidate list for in / notIn / contains_any.
boundbooleanThe value, though typed as text, points into the connected account (a spreadsheet, a calendar, a folder, a label): it means nothing to another account, so a template used outside the workspace it was saved in arrives with it blank. Absent when false.
noExpressionsbooleanTrue when
{{ }}is NOT replaced in this field: the value is used exactly as written (Code 2.0.0’scode, where values come frominputs,stepsandtriggerinstead). Never write an expression into such a field.agentNotesstringWhat an agent writing this field must know beyond
description; the step panel does not show it. The projected views append it todescription. Absent when there is none.requiredarray of stringsoutputSchemaobjectAn operation’s full input or output schema, as served by the default catalog views.
The same fields as
data.actions.inputSchemaabove.sampleDataobjectStructurally accurate example of this action’s output.
errorHandlingobjectPer-action retry defaults.
retryOnFailurebooleanmaxRetriesintegercontinueOnFailurebooleantimeoutSecondsintegerBudget this action needs when the step sets none. 0 means the engine default (30s).
triggersarray of objects or nullTriggers of the DEFAULT version only.
nullwhen the app has none.idstringThe value a definition’s trigger stores in its
actionIdfield.namestringdescriptionstringtypestringHow this trigger fires. ALWAYS LOWERCASE — unlike a step’s
type(PIECE / BRANCH / LOOP / CODE), which is uppercase.One of
manual,webhook,cron,poll,error,run_finished,callable.inputSchemaobjectAn operation’s full input or output schema, as served by the default catalog views.
The same fields as
data.actions.inputSchemaabove.outputSchemaobjectAn operation’s full input or output schema, as served by the default catalog views.
The same fields as
data.actions.inputSchemaabove.sampleDataobjectDeclared example of what
{{trigger.*}}resolves to.derivesSamplebooleanTrue when the real payload shape depends on this trigger’s configuration, so
sampleDatais generic and misleading. Call POST /api/pieces/{id}/triggers/{triggerId}/sample instead.authobjectThe credential an app needs. Present means a connection is required before the app can run.
typestringCredential family.
One of
none,api_key,bearer_token,basic_auth,oauth2,custom.requiredbooleandescriptionstringfieldsarray of objectsnamestringtitlestringtypestringOne of
string,password,boolean.requiredbooleandescriptionstringstandalonebooleanOn an app that also signs in with OAuth2: the credential a person makes in the service (a personal access token, an API key, a bot or app token) that works on its own and lasts. A form that cannot offer the OAuth sign-in asks for it alone. Absent means false.
oauth2objectThe OAuth2 endpoints an app declares. These are the trusted endpoints; a managed instance app is keyed off
authorizationUrl.authorizationUrlstringtokenUrlstringscopesarray of stringsscopeSepstringDelimiter used to join scopes. Defaults to a single space; a few providers want a comma.
authParamsobjectExtra query parameters merged into the authorize URL.
{key}stringEach key’s value.
connectionPiecestringThe app whose connections this one uses (a poll trigger and its action sibling:
gmailtrigger→gmail). A connection created for this app is created under that one, and serves both.helpUrlURLWhere to make the credential at the service.
keywordsarray of stringsWords people search for the app by that its name and description do not say ("email" for Gmail). Absent for most apps.
actionsByVersionobjectAction ids each version declares, keyed by version. Validate a step pinned to an older
pieceVersionagainst ITS entry, not againstactions.{key}array of stringsEach key’s value.
actionsAtobjectThe FULL action definitions (input schemas included) of every version other than the default, keyed by version;
actionsis the default’s. A step pinned to an olderpieceVersionis described by its entry here —GET /api/pieces/{id}/actions/{actionId}?version=answers one.{key}array of objectsEach key’s value.
triggersByVersionobjectTrigger ids each version declares, keyed by version.
{key}array of stringsEach key’s value.
Response · 200 OK, with view=summary
dataobjectGET /api/pieces/{id}?view=summary— every operation of one app with no schemas at all.idstringnamestringdescriptionstringcategorystringversionstringversionsarray of stringsneedsConnectionbooleanTrue when the app declares auth.
actionsarray of objectsidstringnamestringdescriptionstringsideEffectsstringActions only; always absent for triggers.
One of
pure,reads_external,writes_external.fieldsintegerHow many input properties this operation declares — a one-field action versus a forty-field one, before fetching either.
discriminatorsarray of objectsThe gate fields this operation’s inputs depend on, MOST FAR-REACHING FIRST. These are exactly the query parameters worth supplying to the operation-detail endpoint.
fieldstringProperty name — send it verbatim as a query parameter, e.g.
?auth_type=BASIC.typestringThe field’s declared type (string, boolean, number). Query values are text and are coerced to this type.
valuesarray of stringsThe field’s enum, when it declares one — the legal values for the query parameter.
triggersarray of objectsThe same fields as
data.actionsabove.