---
title: "Ingest Route"
method: POST
path: "/v1/ingest"
---

# Ingest Route

`POST /v1/ingest`

## Request

- Base URL: `https://api.june.januraine.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.june.januraine.ai/v1/ingest`
- Auth: none declared

## Headers

- `Idempotency-Key` string, nullable
- `X-Canvas` string, nullable
- `X-API-Key` string, nullable
- `Authorization` string, nullable

## Request body

- IngestIn
  - `nodes` NodeIn[]
    - `node_id` string, uuid, required
    - `node_type` string, required
    - `label` string, required
    - `source_app` string
    - `extra` object
  - `proposals` EdgeProposalIn[]
    - `source_node_id` string, uuid, required
    - `source_node_type` string, required
    - `target_node_id` string, uuid, required
    - `target_node_type` string, required
    - `edge_kind` string, required
    - `confidence` number
    - `source_tag` string
    - `rule_name` string
    - `evidence_node_ids` string[]

## Response `200`

Successful Response

- IngestOut
  - `status` string
  - `nodes_written` integer, required
  - `edges_written` integer, required
  - `created` IngestReceipt: CH-2a mutation receipt — what THIS call did to the graph, by id. The created/updated split is the undo contract: a write can be reversed by tombstoning ``node_ids`` (its own creations) and never touches ``updated_node_ids`` (pre-existing knowledge it merely merged into). Canonical home (2026-08-08) — ``ingest_route`` re-exports it, so the file/sql routes' existing imports keep working.
    - `node_ids` string[]
    - `updated_node_ids` string[]
    - `edge_ids` string[]

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/januraine/apis/june-ai.md) · [All operations](https://skmtc.dev/januraine/apis/june-ai/llms.txt) · [OpenAPI document](https://skmtc.dev/januraine/apis/june-ai/revisions/097b95b163c7?raw)
