# Sending Data

Send records to the full ingest endpoint copied from a source's **Ingest** tab:

```text
https://{region}.ingest.tailglow.io/{project_id}
```

Include an ingest key as the endpoint requires. Do not substitute a generic ingest hostname for your project endpoint.

## Formats

Tailglow accepts JSON objects or arrays, JSONL, CSV, TSV, PSV, SSV, and plain text. JSON needs no wrapper. Input is normalized before it is stored, so tabular and text payloads become records and dangerous keys or embedded images may be transformed.

```bash
curl -X POST "https://{region}.ingest.tailglow.io/{project_id}?key={ingest_key}" \
  -H "Content-Type: text/plain" \
  -d '{"method":"POST","path":"/v1/users","status":200}'
```

## Response and delivery

A successful request returns `202 Accepted`. Tailglow then processes the records in the background.

Wait for that response, use the SDK queue, or otherwise record delivery failures. You do not need to wait for downstream processing, but a request can be lost if the caller exits before delivery completes.

The maximum request body is 20 MiB (20,971,520 bytes). A larger body is rejected with `413 Payload Too Large`; split it into smaller requests.

## Errors and retries

A `202 Accepted` response means the data is durably accepted: it is queued on your server and retried internally until it lands. Accepted data is never dropped.

Any error response means nothing was recorded from that request. The data is still yours to resend.

Retry on any `5xx` response and on network failures such as a dropped connection; the official SDKs do this automatically with backoff. A `4xx` response means the request itself must change, so fix the key, payload, or size before resending.

Refused requests appear on the server page's Ingest Pipeline chart, grouped by reason. The error drawer marks each group as retryable or needing a change to the request. The full reason list is on the [Enums](/api/enums#ingest-pipeline-error-reasons) page.
