Read where an output came from
automation.output-source.read@1
Tells you where one result of an automation came from: the setup that made it, when it was accepted and the answers it was made with. It reads and changes nothing, and answers only for results you may see. It needs a key with Read automations.
Where a result came from
Replace YOUR_FEATURE_ID, YOUR_RUN_REF and YOUR_ITEM_KEY with the values the record made from the result keeps.
# A new operationId for each new request; the same one to retry it.
curl https://api.growlocal.site/api/v1/profiles/YOUR_BUSINESS_ID/invocations \
-H "Authorization: Bearer gl_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target": {
"featureId": "YOUR_FEATURE_ID",
"export": "readOutputSource",
"contractRef": "automation.output-source.read@1"
},
"operationId": "read-source-1",
"input": {
"source": {
"featureId": "YOUR_FEATURE_ID",
"runRef": "11111111-2222-4333-8444-555555555555",
"itemKey": "YOUR_ITEM_KEY"
}
}
}'
// A new operationId for each new request; the same one to retry it.
const response = await fetch(
"https://api.growlocal.site/api/v1/profiles/YOUR_BUSINESS_ID/invocations",
{
method: "POST",
headers: {
Authorization: "Bearer gl_YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"target": {
"featureId": "YOUR_FEATURE_ID",
"export": "readOutputSource",
"contractRef": "automation.output-source.read@1"
},
"operationId": "read-source-1",
"input": {
"source": {
"featureId": "YOUR_FEATURE_ID",
"runRef": "11111111-2222-4333-8444-555555555555",
"itemKey": "YOUR_ITEM_KEY"
}
}
}),
},
);
const receipt = await response.json();
console.log(response.status, receipt);
import requests
# A new operationId for each new request; the same one to retry it.
response = requests.post(
"https://api.growlocal.site/api/v1/profiles/YOUR_BUSINESS_ID/invocations",
headers={"Authorization": "Bearer gl_YOUR_API_KEY"},
json={
"target": {
"featureId": "YOUR_FEATURE_ID",
"export": "readOutputSource",
"contractRef": "automation.output-source.read@1",
},
"operationId": "read-source-1",
"input": {
"source": {
"featureId": "YOUR_FEATURE_ID",
"runRef": "11111111-2222-4333-8444-555555555555",
"itemKey": "YOUR_ITEM_KEY",
},
},
},
timeout=30,
)
print(response.status_code, response.json())
Parameters
What goes in input:
| Name | Type | Required | Description |
|---|---|---|---|
source |
object | Yes | The result to look up, as the record made from it keeps it. |
source.featureId |
string | Yes | The feature the run belongs to. |
source.runRef |
string (uuid) | Yes | The run that made the result, from Find automation runs. |
source.itemKey |
string | Yes | The result's key within that run. |
Response
A call that worked answers 200 with an applied receipt; its output holds these fields, among others. GET /catalog/automation.output-source.read@1 answers the complete shape as JSON Schema.
| Name | Type | Description |
|---|---|---|
source |
object | The result looked up. |
recipe |
object | The setup the result was made with. Absent when availability is unavailable. |
recipe.presetRef |
string | The built-in setup's reference. |
recipe.version |
integer | Its version. |
recipe.titleAtAdmission |
string | The name it had when the run began. |
brief |
object | The answers the run was started with. Absent when availability is unavailable. |
brief.values |
object | The answers, by question. |
brief.lockedPaths |
array of string | Answers that could not be changed for this run. |
brief.aiPaths |
array of string | Answers left for the AI to fill in. |
admittedAt |
string (date-time) | When the run was accepted. |
availability |
unavailable |
unavailable when the setup and answers are no longer kept; absent otherwise. |
reason |
object | Why it is unavailable. |
reason.code |
string | A code for the reason. |
reason.message |
string | The reason in words. |
{
"status": "applied",
"operationId": "read-source-1",
"output": {
"source": {
"featureId": "juniper-cakes.automations",
"runRef": "11111111-2222-4333-8444-555555555555",
"itemKey": "post-1"
},
"recipe": {
"presetRef": "YOUR_PRESET_REF",
"version": 1,
"titleAtAdmission": "Weekly special",
"graphRef": "YOUR_GRAPH_REF",
"graphDigest": "0000000000000000000000000000000000000000000000000000000000000000"
},
"brief": {
"inputSchemaRef": "YOUR_QUESTIONS_REF",
"values": {
"topic": "Lemon cake"
},
"lockedPaths": [],
"aiPaths": [
"/topic"
]
},
"admittedAt": "2026-11-13T09:30:00Z"
}
}
Errors
It reads and changes nothing. Besides the answers every request can get (Errors), its receipt can say:
| Status | HTTP | What it means |
|---|---|---|
rejected |
400, or 403 when it's a matter of access | Not done. diagnostics says why: each has a code, a path into what you sent and a message. |
The codes in diagnostics you're most likely to see:
| Code | Status | What it means |
|---|---|---|
AUTOMATION.RUN_NOT_FOUND |
rejected |
No such run here for this key. |
AUTOMATION.SOURCE_UNAVAILABLE |
rejected |
You may not see this run's results. |
AUTOMATION.RUN_MOVED |
conflict |
The run changed while it was being read. Read it again. |
AUTOMATION.GRAPH_NOT_EXECUTABLE |
rejected |
The automation this run follows can no longer be read, so the run cannot be shown. |