---
title: Send a request
description: Submit raw bytes to Stormedo with the quick send API and configure the destination method, timing, retries, timeout, and headers.
---

Use the quick send endpoint when the body should be forwarded without transformation and the request needs only query-string delivery controls.

```http
POST https://api.stormedo.com/send
```

## Headers

| Header | Required | Description |
| --- | --- | --- |
| `Authorization: Bearer <token>` | Yes | Project API key used to authenticate with Stormedo. It is never forwarded. |
| `Content-Type` | No | Forwarded unchanged to the destination. Maximum 255 bytes. |
| `Idempotency-Key` | No | Stable project-scoped key containing 1 to 255 bytes. Retained for 24 hours. |
| `X-Forward-<name>` | No | Sends `<name>` to the destination. For example, `X-Forward-Authorization` becomes `Authorization`. |

Stormedo accepts up to 64 destination headers with at most 32 KiB of combined names and values. Transport-controlled headers and `Stormedo-*` delivery headers cannot be supplied.

## Query parameters

| Parameter | Required | Default | Description |
| --- | --- | --- | --- |
| `url` | Yes | None | Public HTTPS destination, up to 2048 bytes. Credentials and fragments are not allowed. |
| `method` | No | `POST` | Destination method: `GET`, `POST`, `PUT`, `PATCH`, or `DELETE`. |
| `retry` | No | `0` | Additional retries after the first attempt, from `0` through `19`. |
| `delay` | No | Immediate | Relative delay from `1s` through `30d`. Use an integer followed by `s`, `m`, `h`, or `d`. |
| `deliver_at` | No | Immediate | RFC 3339 delivery time within 30 days of the current time. Cannot be combined with `delay`. |
| `timeout` | No | `50s` | Per-attempt timeout from `1s` through `5m`. Whole seconds and minutes are accepted. |
| `queue` | No | `default` | Queue label containing 1 to 64 letters, numbers, dots, hyphens, or underscores. |

`retry=3` allows four total attempts: the first attempt and up to three retries.

A valid `deliver_at` timestamp that is already in the past starts delivery immediately.

## Request body

The complete incoming body is forwarded as exact bytes and may contain up to 256 KiB. Stormedo does not parse or re-serialize it.

## Example

```bash
curl --request POST \
  'https://api.stormedo.com/send?url=https://your-app.example/webhooks/orders&retry=3&timeout=45s' \
  --header "Authorization: Bearer $STORMEDO_TOKEN" \
  --header 'Content-Type: application/json' \
  --header 'X-Forward-Authorization: Bearer destination-token' \
  --data '{"type":"order.created","order_id":"ord_123"}'
```

The destination receives the JSON body, `Content-Type`, and destination `Authorization` header. It does not receive the Stormedo project API key.

## Response

Stormedo returns `202 Accepted` after durable handoff:

```json
{
  "success": true,
  "data": {
    "id": "req_33uZSQsVaf8aZjDuzkuAq",
    "project_id": "prj_2Z5mQe7cB9kP4sV8xH1nD",
    "replayed_from_request_id": null,
    "status": "queued",
    "scheduled_at": null,
    "created_at": "2026-08-28T10:15:30Z"
  },
  "error": null,
  "meta": null,
  "request_id": "95c07a5c-3d44-4b89-84a6-c5a71313bff2"
}
```

Delayed requests initially use `status: "scheduled"` and include an absolute `scheduled_at` value. A `202` response confirms acceptance, not destination completion.

## Errors

| Status | When it occurs |
| --- | --- |
| `401` | The project API key is missing or invalid. |
| `409` | The idempotency key was already used with different request input. |
| `413` | The HTTP body exceeds 256 KiB. |
| `422` | The destination, method, timing, timeout, headers, queue, or key is invalid. |
| `429` | The workspace monthly request allowance has been reached. |
| `502` or `503` | Stormedo could not durably accept the request. |

Continue with [Read requests](/docs/api-reference/request-history/) to retrieve request state and completed attempts.
