JavaScript
import Courier from '@trycourier/courier';
const client = new Courier({
apiKey: process.env['COURIER_API_KEY'], // This is the default and can be omitted
});
const automationRunStepsResponse = await client.automations.runs.listSteps('x');
console.log(automationRunStepsResponse.steps);import os
from courier import Courier
client = Courier(
api_key=os.environ.get("COURIER_API_KEY"), # This is the default and can be omitted
)
automation_run_steps_response = client.automations.runs.list_steps(
"x",
)
print(automation_run_steps_response.steps)package main
import (
"context"
"fmt"
"github.com/trycourier/courier-go/v4"
"github.com/trycourier/courier-go/v4/option"
)
func main() {
client := courier.NewClient(
option.WithAPIKey("My API Key"),
)
automationRunStepsResponse, err := client.Automations.Runs.ListSteps(context.TODO(), "x")
if err != nil {
panic(err.Error())
}
fmt.Printf("%+v\n", automationRunStepsResponse.Steps)
}
package com.courier.example;
import com.courier.client.CourierClient;
import com.courier.client.okhttp.CourierOkHttpClient;
import com.courier.models.automations.AutomationRunStepsResponse;
import com.courier.models.automations.runs.RunListStepsParams;
public final class Main {
private Main() {}
public static void main(String[] args) {
CourierClient client = CourierOkHttpClient.fromEnv();
AutomationRunStepsResponse automationRunStepsResponse = client.automations().runs().listSteps("x");
}
}require "courier"
courier = Courier::Client.new(api_key: "My API Key")
automation_run_steps_response = courier.automations.runs.list_steps("x")
puts(automation_run_steps_response)<?php
require_once dirname(__DIR__) . '/vendor/autoload.php';
use Courier\Client;
use Courier\Core\Exceptions\APIException;
$client = new Client(apiKey: getenv('COURIER_API_KEY') ?: 'My API Key');
try {
$automationRunStepsResponse = $client->automations->runs->listSteps('x');
var_dump($automationRunStepsResponse);
} catch (APIException $e) {
echo $e->getMessage();
}using System;
using TryCourier;
using TryCourier.Models.Automations.Runs;
CourierClient client = new();
RunListStepsParams parameters = new() { ID = "x" };
var automationRunStepsResponse = await client.Automations.Runs.ListSteps(parameters);
Console.WriteLine(automationRunStepsResponse);courier automations:runs list-steps \
--api-key 'My API Key' \
--id xcurl --request GET \
--url https://api.courier.com/automations/runs/{id}/steps \
--header 'Authorization: Bearer <token>'{
"steps": [
{
"step_id": "c95b53a5-6f60-49ac-81fc-ad0907e2be2e",
"action": "send",
"status": "PROCESSED",
"created_at": "2026-08-05T20:06:36.259Z",
"updated_at": "2026-08-05T20:06:59.047Z",
"message_id": "EWi969cU2xcOTkPLMCYus"
}
]
}{
"message": "invalid run id",
"type": "invalid_request_error"
}{
"message": "run not found",
"type": "invalid_request_error"
}Automations
List steps for an Automation run
List the per-step state of one Automation run, in full — this endpoint is not paginated. message_id is present on send steps that produced a message; follow it to GET /messages/{message_id} for delivery status. A send to a List or an Audience yields one message_id for the request, not one per recipient.
GET
/
automations
/
runs
/
{id}
/
steps
JavaScript
import Courier from '@trycourier/courier';
const client = new Courier({
apiKey: process.env['COURIER_API_KEY'], // This is the default and can be omitted
});
const automationRunStepsResponse = await client.automations.runs.listSteps('x');
console.log(automationRunStepsResponse.steps);import os
from courier import Courier
client = Courier(
api_key=os.environ.get("COURIER_API_KEY"), # This is the default and can be omitted
)
automation_run_steps_response = client.automations.runs.list_steps(
"x",
)
print(automation_run_steps_response.steps)package main
import (
"context"
"fmt"
"github.com/trycourier/courier-go/v4"
"github.com/trycourier/courier-go/v4/option"
)
func main() {
client := courier.NewClient(
option.WithAPIKey("My API Key"),
)
automationRunStepsResponse, err := client.Automations.Runs.ListSteps(context.TODO(), "x")
if err != nil {
panic(err.Error())
}
fmt.Printf("%+v\n", automationRunStepsResponse.Steps)
}
package com.courier.example;
import com.courier.client.CourierClient;
import com.courier.client.okhttp.CourierOkHttpClient;
import com.courier.models.automations.AutomationRunStepsResponse;
import com.courier.models.automations.runs.RunListStepsParams;
public final class Main {
private Main() {}
public static void main(String[] args) {
CourierClient client = CourierOkHttpClient.fromEnv();
AutomationRunStepsResponse automationRunStepsResponse = client.automations().runs().listSteps("x");
}
}require "courier"
courier = Courier::Client.new(api_key: "My API Key")
automation_run_steps_response = courier.automations.runs.list_steps("x")
puts(automation_run_steps_response)<?php
require_once dirname(__DIR__) . '/vendor/autoload.php';
use Courier\Client;
use Courier\Core\Exceptions\APIException;
$client = new Client(apiKey: getenv('COURIER_API_KEY') ?: 'My API Key');
try {
$automationRunStepsResponse = $client->automations->runs->listSteps('x');
var_dump($automationRunStepsResponse);
} catch (APIException $e) {
echo $e->getMessage();
}using System;
using TryCourier;
using TryCourier.Models.Automations.Runs;
CourierClient client = new();
RunListStepsParams parameters = new() { ID = "x" };
var automationRunStepsResponse = await client.Automations.Runs.ListSteps(parameters);
Console.WriteLine(automationRunStepsResponse);courier automations:runs list-steps \
--api-key 'My API Key' \
--id xcurl --request GET \
--url https://api.courier.com/automations/runs/{id}/steps \
--header 'Authorization: Bearer <token>'{
"steps": [
{
"step_id": "c95b53a5-6f60-49ac-81fc-ad0907e2be2e",
"action": "send",
"status": "PROCESSED",
"created_at": "2026-08-05T20:06:36.259Z",
"updated_at": "2026-08-05T20:06:59.047Z",
"message_id": "EWi969cU2xcOTkPLMCYus"
}
]
}{
"message": "invalid run id",
"type": "invalid_request_error"
}{
"message": "run not found",
"type": "invalid_request_error"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
A unique identifier representing the Automation run.
Minimum string length:
1Response
Every step of the Automation run.
Every step of an Automation run. Not paginated.
Show child attributes
Show child attributes
⌘I