Retained immutable local-fixture guide, refreshed against current production catalog metadata. No examples were rerun by this author; no production action was invoked.
Get campaign
Outcome
Reads one non-deleted campaign in the bound organization and workspace. An absent or differently scoped campaign returns HTTP 404 campaign_not_found.
After authentication and the canonical workspace grant succeed, a first workspace request may initialize the app-local identity mirror and recipient setting before the application permission check. These reads do not modify campaign-domain records or execute notifications.
Before you start
- Verify the intended environment, authenticated identity and organization before discovery.
- Discover the published campaigns:read application permission and inspect the credential-scoped action contract.
- Discover and bind the granted canonical Campaigns workspace separately from the action input.
- Fixture identifiers and simulated responses confer no live access. Replace identifiers through granted resource discovery.
Discover the target
topolo whoami --json
topolo workspaces list topolo-campaigns --json
topolo actions get app_topolo_campaigns.campaigns.get --json
- Read app_topolo_campaigns.campaigns.list in this same authorized context and select campaigns[].id. Do not derive ids from display names.
- Inspect app_topolo_campaigns.campaigns.list in the same credential and resource context before reading it.
- Inspect app_topolo_campaigns.campaigns.dashboard.get in the same credential and resource context before reading it.
Request
GET /api/campaigns/{id}
Input fields
| Field | Required | Meaning and constraints |
|---|---|---|
id | Yes | Campaign identifier returned by campaigns.list in the same authorized organization and workspace. Type: string. minLength: 1 |
Worked examples
populated resource · HTTP 200
Input · payload.json:
{
"id": "campaign_docs_fixture"
}
CLI:
topolo actions validate app_topolo_campaigns.campaigns.get --data @payload.json --json
topolo actions plan app_topolo_campaigns.campaigns.get --resource-type workspace --resource-id "$CAMPAIGNS_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_campaigns.campaigns.get --resource-type workspace --resource-id "$CAMPAIGNS_WORKSPACE_ID" --data @payload.json --json
MCP tool and arguments:
{
"tool": "topolo_read_action",
"arguments": {
"actionId": "app_topolo_campaigns.campaigns.get",
"input": {
"id": "campaign_docs_fixture"
},
"resourceType": "workspace",
"resourceId": "<identifier returned by granted resource discovery>"
}
}
Captured local response · HTTP 200:
{
"campaign": {
"id": "campaign_docs_fixture",
"type": "event",
"name": "Fixture campaign",
"status": "active",
"offerId": null,
"commission": {
"kind": "pct",
"value": 10
},
"attribution": {},
"createdAt": "2026-10-07T00:00:00.000Z",
"updatedAt": "2026-10-07T00:00:00.000Z"
}
}
populated resource: HTTP 200.
empty workspace · HTTP 404
Input · payload.json:
{
"id": "campaign_docs_fixture"
}
CLI:
topolo actions validate app_topolo_campaigns.campaigns.get --data @payload.json --json
topolo actions plan app_topolo_campaigns.campaigns.get --resource-type workspace --resource-id "$CAMPAIGNS_WORKSPACE_ID" --data @payload.json --json
MCP tool and arguments:
{
"tool": "topolo_prepare_action",
"arguments": {
"actionId": "app_topolo_campaigns.campaigns.get",
"input": {
"id": "campaign_docs_fixture"
},
"resourceType": "workspace",
"resourceId": "<identifier returned by granted resource discovery>"
}
}
Captured local response · HTTP 404:
{
"error": "campaign_not_found"
}
empty workspace: HTTP 404; SDK code http_error.
campaign absent · HTTP 404
Input · payload.json:
{
"id": "campaign_unknown_fixture"
}
CLI:
topolo actions validate app_topolo_campaigns.campaigns.get --data @payload.json --json
topolo actions plan app_topolo_campaigns.campaigns.get --resource-type workspace --resource-id "$CAMPAIGNS_WORKSPACE_ID" --data @payload.json --json
MCP tool and arguments:
{
"tool": "topolo_prepare_action",
"arguments": {
"actionId": "app_topolo_campaigns.campaigns.get",
"input": {
"id": "campaign_unknown_fixture"
},
"resourceType": "workspace",
"resourceId": "<identifier returned by granted resource discovery>"
}
}
Captured local response · HTTP 404:
{
"error": "campaign_not_found"
}
campaign absent: HTTP 404; SDK code http_error.
workspace grant denied · HTTP 403
Input · payload.json:
{
"id": "campaign_docs_fixture"
}
CLI:
topolo actions validate app_topolo_campaigns.campaigns.get --data @payload.json --json
topolo actions plan app_topolo_campaigns.campaigns.get --resource-type workspace --resource-id "$CAMPAIGNS_WORKSPACE_ID" --data @payload.json --json
MCP tool and arguments:
{
"tool": "topolo_prepare_action",
"arguments": {
"actionId": "app_topolo_campaigns.campaigns.get",
"input": {
"id": "campaign_docs_fixture"
},
"resourceType": "workspace",
"resourceId": "<identifier returned by granted resource discovery>"
}
}
Captured local response · HTTP 403:
{
"error": "workspace_forbidden"
}
workspace grant denied: HTTP 403; SDK code permission_denied.
permission denied · HTTP 403
Input · payload.json:
{
"id": "campaign_docs_fixture"
}
CLI:
topolo actions validate app_topolo_campaigns.campaigns.get --data @payload.json --json
topolo actions plan app_topolo_campaigns.campaigns.get --resource-type workspace --resource-id "$CAMPAIGNS_WORKSPACE_ID" --data @payload.json --json
MCP tool and arguments:
{
"tool": "topolo_prepare_action",
"arguments": {
"actionId": "app_topolo_campaigns.campaigns.get",
"input": {
"id": "campaign_docs_fixture"
},
"resourceType": "workspace",
"resourceId": "<identifier returned by granted resource discovery>"
}
}
Captured local response · HTTP 403:
{
"error": "forbidden"
}
permission denied: HTTP 403; SDK code permission_denied.
authentication missing · HTTP 401
Input · payload.json:
{
"id": "campaign_docs_fixture"
}
CLI:
topolo actions validate app_topolo_campaigns.campaigns.get --data @payload.json --json
topolo actions plan app_topolo_campaigns.campaigns.get --resource-type workspace --resource-id "$CAMPAIGNS_WORKSPACE_ID" --data @payload.json --json
MCP tool and arguments:
{
"tool": "topolo_prepare_action",
"arguments": {
"actionId": "app_topolo_campaigns.campaigns.get",
"input": {
"id": "campaign_docs_fixture"
},
"resourceType": "workspace",
"resourceId": "<identifier returned by granted resource discovery>"
}
}
Captured local response · HTTP 401:
{
"error": "Authentication required"
}
authentication missing: HTTP 401; SDK code auth_error.
Verify the result
- Compare campaign.id to the id discovered through campaigns.list. Inspect status, offerId, commission and attribution before preparing any campaign mutation.
Errors and recovery
http_error(HTTP 404): For HTTP 404 campaign_not_found, repeat campaigns.list and campaigns.get in the same authorized workspace. Do not guess another identifier. Preserve the actual response and request id.permission_denied(HTTP 403): Preserve the refusal. Verify the exact application permission and canonical workspace grant, or the organization boundary for export. Do not widen context or retry with a different resource to evade a denial.auth_error(HTTP 401): Authenticate again in the intended environment and pinned organization, then repeat identity and resource discovery.
Authentication, input validation or resource middleware can refuse a request before these handlers. Preserve the actual refusal and request id.
Recovery boundary
These reads do not change campaign-domain records and require no domain rollback. A permission or privacy refusal is authoritative; preserve its context and request id.
Related actions
- List campaigns — Campaigns: Lists non-deleted campaigns in the bound organization and workspace, newest updates first. An empty array is valid.
- Get campaign dashboard — Campaigns: Reads stored batch, code, placement and redemption counts plus counts for each journey event type. Resource identity is the request id; the dashboard response contains counts. Stored events do not establish a live provider outcome.
Evidence
Actual Campaigns handleRequest, permission checks, store queries and replayed SQLite migrations. Credential verification and canonical workspace grants are simulated at the Auth package boundary; egress is sealed. No deployed/provider outcome, live redemption, outbound communication or live access is demonstrated.
Current field meanings and contract
| Field | Required | Meaning and validation |
|---|---|---|
id | Yes | Campaign identifier from campaigns[].id; scoped to the selected organization/workspace. It is not a batch/code/placement id. string; minLength=1 |
Exact schemas and provenance
Input schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
}
Output schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"campaign": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string"
},
"name": {
"type": "string"
},
"status": {
"type": "string"
},
"offerId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"commission": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"$ref": "#/$defs/__schema0"
}
},
{
"type": "null"
}
]
},
"attribution": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"$ref": "#/$defs/__schema0"
}
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
},
"required": [
"id",
"type",
"name",
"status",
"offerId",
"commission",
"attribution",
"createdAt",
"updatedAt"
],
"additionalProperties": false
}
},
"required": [
"campaign"
],
"additionalProperties": false,
"$defs": {
"__schema0": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/__schema0"
}
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"$ref": "#/$defs/__schema0"
}
}
]
}
}
}
Reviewed immutable source: TopoloCampaigns@cacbb8b12b4e19a662cf82d03a927aef3c3a35e8, docs/action-read-records.json. Fresh production catalog was read on 2026-10-20. Its publication metadata is not proof that this source is loaded. Output examples are not widened or rewritten to force schema success; the accompanying validation record classifies exact success, refusal, no-body and structural-schema limits.
Related actions
app_topolo_campaigns.campaigns.list: List the workspace's promo, influencer and referral programs with their status.app_topolo_campaigns.campaigns.dashboard.get: Read a campaign's dashboard: codes issued, redemptions and their total value.
Local input rejection example
This deliberately invalid input belongs to a pure schema check; it is never a planned or executed request. The closed action input schema must reject the extra field. It has no HTTP status or server response.
{
"id": "campaign_docs_fixture",
"__unsupported_field": true
}
The hidden companion labels this as ILLUSTRATIVE_LOCAL_SCHEMA_CHECK; its validation representation is not an action output.
Published output validation limits
Current published output qualification: the output schema rejects the empty-object, partial-success-marker, partial-data-object and refusal-body probes. A schema-valid success body still does not establish execution, live permission, selected context or a provider outcome.
These observations come from pure checks of the exact published schema; they are not server responses or production captures.