## Create a span

**post** `/v5/spans`

Create a single span and return the persisted span.

Use this for one-off span ingestion; to write many spans in one request use
POST /v5/spans/batch. When `id` is omitted the server generates a UUID.
Depending on per-account server configuration the span is persisted to the
legacy trace store, to the tracing service, or both. `end_timestamp`
must not precede `start_timestamp`, which is rejected with a 422. When the
tracing service is the primary store, its 400, 413 and 422 rejections keep that
status and detail, as does a 403 when the request carried its own API key, and
every other failure returns a 503 with a Retry-After header. A span whose parent
belongs to another trace is rejected with 409 before either store is written. The
parent is looked up in Postgres, so that check ends once the account's spans stop
being written there. Which writes the tracing service rejects depends in part on
its storage engine: on Postgres deployments a NUL byte or invalid UTF-8 inside
`trace_id`, `id`, `parent_id` or `group_id` rejects the span with a 400
naming the field, because replacing the byte would change the identity the
response echoes; a NUL byte or invalid UTF-8 in any other field is replaced with
U+FFFD and the span is persisted. ClickHouse deployments store the bytes verbatim.

Credential redaction: values in the free-form `input`, `output`, `metadata`,
and `expected` objects, and in `name`, that are credential-shaped (bearer/JWT,
API keys, connection-string passwords) or under a credential-named key are replaced
with `[REDACTED:credential]` before the span is persisted, so the stored and
returned span reflects the redacted value (EY 12.3).

### Body Parameters

- `name: string`

- `start_timestamp: string`

  When the span started. With trace_id and id it forms the span's storage identity, so a span re-sent with a start_timestamp on another UTC day is stored as a second row that the store never collapses. Get span and trace detail return the newest version. Search returns the newest version whose start_timestamp falls in the queried window. Export, metrics and facets count both rows until the trace is deleted and re-sent.

- `trace_id: string`

  id for grouping traces together, uuid is recommended

- `id: optional string`

  The id of the span, at most 256 bytes. A value longer than 256 characters is refused here with a 422 before it is forwarded; a value within that count whose UTF-8 form exceeds 256 bytes is refused with a 400 naming the field once the tracing service is the account's primary store, and accepted for accounts still written primarily to the legacy trace store.

- `application_interaction_id: optional string`

  The optional application interaction ID this span belongs to

- `application_variant_id: optional string`

  The optional application variant ID this span belongs to

- `end_timestamp: optional string`

- `expected: optional map[unknown]`

- `group_id: optional string`

  Reference to a group_id, at most 256 bytes. A value longer than 256 characters is refused here with a 422 before it is forwarded; a value within that count whose UTF-8 form exceeds 256 bytes is refused with a 400 naming the field once the tracing service is the account's primary store, and accepted for accounts still written primarily to the legacy trace store.

- `input: optional map[unknown]`

- `metadata: optional map[unknown]`

- `obs_span_id: optional string`

  W3C span id (16 lowercase hex chars) of the observability span this span executed in. Requires obs_trace_id.

- `obs_trace_id: optional string`

  W3C trace id (32 lowercase hex chars) of the observability trace this span executed in, for correlating a business span with the infrastructure work it caused. Stored only by the sgp-traces service, so accounts still served by the legacy store accept the field and read it back as null.

- `output: optional map[unknown]`

- `parent_id: optional string`

  Reference to a parent span_id

- `status: optional SpanStatus`

  - `"SUCCESS"`

  - `"ERROR"`

  - `"CANCELED"`

- `type: optional SpanType`

  - `"TEXT_INPUT"`

  - `"TEXT_OUTPUT"`

  - `"COMPLETION_INPUT"`

  - `"COMPLETION"`

  - `"KB_RETRIEVAL"`

  - `"KB_INPUT"`

  - `"RERANKING"`

  - `"EXTERNAL_ENDPOINT"`

  - `"PROMPT_ENGINEERING"`

  - `"DOCUMENT_INPUT"`

  - `"MAP_REDUCE"`

  - `"DOCUMENT_SEARCH"`

  - `"DOCUMENT_PROMPT"`

  - `"CUSTOM"`

  - `"CODE_EXECUTION"`

  - `"DATA_MANIPULATION"`

  - `"EVALUATION"`

  - `"FILE_RETRIEVAL"`

  - `"KB_ADD_CHUNK"`

  - `"KB_MANAGEMENT"`

  - `"GUARDRAIL"`

  - `"OUTPUT_GUARDRAIL"`

  - `"TRACER"`

  - `"AGENT_TRACER"`

  - `"AGENT_WORKFLOW"`

  - `"STANDALONE"`

### Returns

- `Span object { id, account_id, name, 19 more }`

  - `id: string`

  - `account_id: string`

  - `name: string`

  - `start_timestamp: string`

  - `trace_id: string`

    id for grouping traces together, uuid is recommended

  - `application_interaction_id: optional string`

    The interaction ID this span belongs to

  - `application_variant_id: optional string`

    The id of the application variant this span belongs to

  - `created_by: optional Identity`

    The identity that created the entity.

    - `id: string`

    - `type: "user" or "service_account"`

      - `"user"`

      - `"service_account"`

    - `object: optional "identity"`

      - `"identity"`

  - `end_timestamp: optional string`

  - `expected: optional map[unknown]`

  - `group_id: optional string`

    Reference to a group_id

  - `input: optional map[unknown]`

  - `input_tokens: optional number`

    Prompt tokens the producer reported for this span, absent when it reported none. Same quantity the input_tokens sort orders by.

  - `metadata: optional map[unknown]`

  - `object: optional "span"`

    - `"span"`

  - `obs_span_id: optional string`

    W3C span id of the observability span this span executed in.

  - `obs_trace_id: optional string`

    W3C trace id of the observability trace this span executed in. Null for spans written without the edge, and for accounts still served by the legacy trace store.

  - `output: optional map[unknown]`

  - `output_tokens: optional number`

    Completion tokens the producer reported for this span, absent when it reported none. Same quantity the output_tokens sort orders by.

  - `parent_id: optional string`

    Reference to a parent span_id

  - `status: optional SpanStatus`

    - `"SUCCESS"`

    - `"ERROR"`

    - `"CANCELED"`

  - `type: optional SpanType`

    - `"TEXT_INPUT"`

    - `"TEXT_OUTPUT"`

    - `"COMPLETION_INPUT"`

    - `"COMPLETION"`

    - `"KB_RETRIEVAL"`

    - `"KB_INPUT"`

    - `"RERANKING"`

    - `"EXTERNAL_ENDPOINT"`

    - `"PROMPT_ENGINEERING"`

    - `"DOCUMENT_INPUT"`

    - `"MAP_REDUCE"`

    - `"DOCUMENT_SEARCH"`

    - `"DOCUMENT_PROMPT"`

    - `"CUSTOM"`

    - `"CODE_EXECUTION"`

    - `"DATA_MANIPULATION"`

    - `"EVALUATION"`

    - `"FILE_RETRIEVAL"`

    - `"KB_ADD_CHUNK"`

    - `"KB_MANAGEMENT"`

    - `"GUARDRAIL"`

    - `"OUTPUT_GUARDRAIL"`

    - `"TRACER"`

    - `"AGENT_TRACER"`

    - `"AGENT_WORKFLOW"`

    - `"STANDALONE"`

### Example

```http
curl https://api.egp.scale.com/v5/spans \
    -H 'Content-Type: application/json' \
    -H "x-api-key: $SGP_API_KEY" \
    -d '{
          "name": "name",
          "start_timestamp": "2019-12-27T18:11:19.117Z",
          "trace_id": "trace_id"
        }'
```

#### Response

```json
{
  "id": "id",
  "account_id": "account_id",
  "name": "name",
  "start_timestamp": "2019-12-27T18:11:19.117Z",
  "trace_id": "trace_id",
  "application_interaction_id": "application_interaction_id",
  "application_variant_id": "application_variant_id",
  "created_by": {
    "id": "id",
    "type": "user",
    "object": "identity"
  },
  "end_timestamp": "2019-12-27T18:11:19.117Z",
  "expected": {
    "foo": "bar"
  },
  "group_id": "group_id",
  "input": {
    "foo": "bar"
  },
  "input_tokens": 0,
  "metadata": {
    "foo": "bar"
  },
  "object": "span",
  "obs_span_id": "obs_span_id",
  "obs_trace_id": "obs_trace_id",
  "output": {
    "foo": "bar"
  },
  "output_tokens": 0,
  "parent_id": "parent_id",
  "status": "SUCCESS",
  "type": "TEXT_INPUT"
}
```
