> ## Documentation Index
> Fetch the complete documentation index at: https://docs.focale.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Send without the SDK

> OTLP/HTTP JSON or protobuf on /v1/traces, /v1/metrics, and /v1/logs. No gRPC. Bearer ingest key.

Use this only if you already speak OpenTelemetry and are not installing `@focale/sdk`. Most founders should [install the SDK](/install) or merge the watching PR.

## Where to send

Host: `https://intake.focale.io` in production. Do not add an `/otlp/` prefix.

| Method | Path          |
| ------ | ------------- |
| `POST` | `/v1/traces`  |
| `POST` | `/v1/metrics` |
| `POST` | `/v1/logs`    |
| `GET`  | `/healthz`    |

There is no gRPC. Unknown versions such as `/v2/...` return `404`.

## Auth

```text theme={null}
Authorization: Bearer <ingest-key>
```

The ingest key is the userinfo in your [DSN](/dsn). Missing or invalid keys return `401`.

## Body

Send OTLP/HTTP **JSON** (`Content-Type: application/json`) or **protobuf** (`application/x-protobuf`, `application/protobuf`, or `application/vnd.google.protobuf`). Anything else returns `415`.

```bash theme={null}
curl -X POST https://intake.focale.io/v1/traces \
  -H "Authorization: Bearer <ingest-key>" \
  -H "Content-Type: application/json" \
  -d '{"resourceSpans":[]}'
```

`GET /healthz` does not require a key. It only tells you the intake is up.
