---
title: Read requests and attempts
description: List requests with cursor pagination, retrieve request detail, and inspect completed delivery attempts through the HTTP API.
---

Read endpoints use the project selected by the bearer API key. A request belonging to another project is returned as `404 Not Found`.

## List requests

```http
GET https://api.stormedo.com/requests
```

### Query parameters

| Parameter | Description |
| --- | --- |
| `status` | `scheduled`, `queued`, `delivering`, `succeeded`, `failed`, or `cancelled`. |
| `search` | Exact `req_` ID or case-insensitive destination URL fragment, up to 2048 bytes. |
| `method` | `GET`, `POST`, `PUT`, `PATCH`, or `DELETE`. |
| `source` | `api`, `recurring`, or `replay`. |
| `from` | Inclusive RFC 3339 creation-time boundary. |
| `to` | Exclusive RFC 3339 creation-time boundary. Must be later than `from`. |
| `cursor` | Opaque cursor returned by the previous page. |
| `limit` | Items per page from 1 through 100. Defaults to 50. |

Requests are ordered newest first.

```bash
curl \
  'https://api.stormedo.com/requests?status=failed&method=POST&limit=25' \
  --header "Authorization: Bearer $STORMEDO_TOKEN"
```

### Response

```json
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "req_33uZSQsVaf8aZjDuzkuAq",
        "replayed_from_request_id": null,
        "schedule_id": null,
        "url": "https://your-app.example/webhooks/orders",
        "method": "POST",
        "queue": "default",
        "status": "failed",
        "scheduled_at": null,
        "created_at": "2026-08-28T10:15:30Z",
        "started_at": "2026-08-28T10:15:31Z",
        "completed_at": "2026-08-28T10:16:20Z"
      }
    ],
    "next_cursor": "AZv4h7Q2AACW2hJvR8WmC1p0YK9sP3nLqT5eX8aB2cQ",
    "history_retention_days": 30,
    "history_cutoff_at": "2026-07-29T10:20:00Z",
    "has_hidden_history": false
  },
  "error": null,
  "meta": null,
  "request_id": "95c07a5c-3d44-4b89-84a6-c5a71313bff2"
}
```

Pass `next_cursor` unchanged to retrieve the next page. A null cursor means there is no next page.

Terminal history older than the workspace retention period is not returned. Active requests remain visible even when they were created before the cutoff.

## Retrieve a request

```http
GET https://api.stormedo.com/requests/{request_id}
```

```bash
curl \
  'https://api.stormedo.com/requests/req_33uZSQsVaf8aZjDuzkuAq' \
  --header "Authorization: Bearer $STORMEDO_TOKEN"
```

The response includes the request definition, lifecycle timestamps, metadata, header names with redacted values, and completed attempts:

```json
{
  "success": true,
  "data": {
    "id": "req_33uZSQsVaf8aZjDuzkuAq",
    "replayed_from_request_id": null,
    "schedule_id": null,
    "url": "https://your-app.example/webhooks/orders",
    "method": "POST",
    "max_attempts": 4,
    "timeout_seconds": 45,
    "queue": "default",
    "metadata": {
      "order_id": "ord_123"
    },
    "content_type": "application/json",
    "headers": {
      "authorization": "[REDACTED]"
    },
    "status": "succeeded",
    "scheduled_at": null,
    "created_at": "2026-08-28T10:15:30Z",
    "updated_at": "2026-08-28T10:15:32Z",
    "started_at": "2026-08-28T10:15:31Z",
    "completed_at": "2026-08-28T10:15:32Z",
    "cancelled_at": null,
    "attempts": [
      {
        "attempt_number": 1,
        "status": "succeeded",
        "response_status_code": 204,
        "error_message": null,
        "duration_ms": 412,
        "started_at": "2026-08-28T10:15:31Z",
        "completed_at": "2026-08-28T10:15:32Z",
        "retry": null
      }
    ]
  },
  "error": null,
  "meta": null,
  "request_id": "95c07a5c-3d44-4b89-84a6-c5a71313bff2"
}
```

Stored request bodies and destination header values are never returned.

## List completed attempts

```http
GET https://api.stormedo.com/requests/{request_id}/attempts
```

This endpoint returns the same completed attempt objects without the surrounding request definition. It returns an empty array until the first attempt completes.

When another attempt is scheduled, `retry` contains the decision:

```json
{
  "reason": "http_429",
  "retry_after_raw": "120",
  "retry_after_truncated": false,
  "retry_after_escaped": false,
  "retry_after_status": "valid",
  "retry_after_delay_ms": 120000,
  "backoff_delay_ms": 30000,
  "selected_delay_ms": 120000,
  "delay_source": "retry_after",
  "next_attempt_at": "2026-08-28T10:17:32Z"
}
```

## Consistency and errors

A newly accepted request can take a short time to appear in list and detail responses. The original `202 Accepted` response remains confirmation that Stormedo accepted it durably.

- `401` indicates a missing or invalid API key.
- `404` indicates a missing, malformed, cross-project, or expired-retention request ID.
- `422` indicates invalid filters, timestamps, cursor, method, or limit.
