---
title: "Deliver an approval/external signal to a waiting execution"
method: POST
path: "/executions/{id}:signal"
tags: ["Executions"]
---

# Deliver an approval/external signal to a waiting execution

`POST /executions/{id}:signal`

Resumes a WAITING execution (durable execution). The caller must own the
workflow; the signal only counts against an actual pending wait whose kind
it matches and which has not timed out. v1 is the external-signal (human
approval) flavor — e.g. a Telegram approve/reject for a money-moving step.

## Request body

- SignalExecutionRequest
  - `decision` 'approve' | 'reject', required — The approver's decision.
  - `payload` object — Optional structured data delivered as the await step's output.

## Response `200`

The resumed (terminal or still-waiting) execution.

- Execution
  - `id` string, required — ULID identifier (26-char Crockford base32).
  - `workflowId` string, required — ULID identifier (26-char Crockford base32).
  - `chainId` integer — Numeric chain ID (e.g. 11155111 for Sepolia, 8453 for Base). On chain-aware trigger/node configs this is required and must be a configured chain; on query/filter params it is optional.
  - `index` integer — 0-based run counter within the workflow.
  - `startAt` integer, required
  - `endAt` integer
  - `status` 'pending' | 'waiting' | 'success' | 'failed' | 'error', required — Outcome of an execution. `pending` is in-flight; `waiting` is suspended mid-workflow at an `await` node, durably parked until a signal arrives (a human approve/reject or an operator-observed chain event) or the wait times out — non-terminal, like `pending`, but distinguishable so a client can show "awaiting approval"; `success` is full success; `failed` is logical failure (e.g., a node returned an error, or a wait timed out); `error` is a system / infrastructure failure (e.g., RPC unreachable).
  - `error` string
  - `steps` ExecutionStep[]
    - `id` string, required
    - `type` string, required
    - `name` string
    - `success` boolean, required
    - `error` string
    - `errorCode` string
    - `log` string
    - `inputs` string[]
    - `config` unknown
    - `metadata` unknown
    - `executionContext` unknown
    - `output` unknown
    - `gasUsed` string — Gas units consumed (decimal string). Empty if unavailable.
    - `gasPrice` string — Gas price in wei per unit (decimal string).
    - `totalGasCost` string — gasUsed × gasPrice in wei (decimal string).
    - `startAt` integer
    - `endAt` integer
  - `executionFee` Fee
    - `amount` string, required — Decimal numeric value, encoded as a string for big-int safety.
    - `unit` 'USD' | 'WEI' | 'PERCENTAGE', required
  - `cogs` NodeCOGS[] — Per-node actual costs (gas, external API).
    - `nodeId` string, required
    - `costType` 'gas' | 'externalApi' | 'walletCreation', required
    - `fee` Fee, required
      - `amount` string, required — Decimal numeric value, encoded as a string for big-int safety.
      - `unit` 'USD' | 'WEI' | 'PERCENTAGE', required
    - `gasUnits` string — Gas units (for `gas` cost type only).
  - `valueFee` ValueFee
    - `fee` Fee, required
      - `amount` string, required — Decimal numeric value, encoded as a string for big-int safety.
      - `unit` 'USD' | 'WEI' | 'PERCENTAGE', required
    - `tier` 'unspecified' | 'tier1' | 'tier2' | 'tier3', required — Pricing group for value-capture fees.
    - `valueBase` string — What the percentage applies to (e.g., `input_token_value`).
    - `classificationMethod` 'ruleBased' | 'llm'
    - `confidence` number, float
    - `reason` string

## Other responses

- `400` — Request validation failed.
- `401` — Missing or invalid bearer token.
- `404` — Resource not found.

---

[API](https://skmtc.net/avaprotocol/apis/ava-protocol-avs-api.md) · [All operations](https://skmtc.net/avaprotocol/apis/ava-protocol-avs-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/avaprotocol/ava-protocol-avs-api/versions/231d563f2c9f/schema)
