---
title: "Ingest Sources"
method: POST
path: "/api/v1/sources"
tags: ["sources"]
---

# Ingest Sources

`POST /api/v1/sources`

Enqueue a batch of sources for asynchronous ingestion. Fire-and-forget: returns 202 with a job_id you can poll via GET /jobs/{job_id}.

## Request body

- IngestSourcesRequest
  - `space_id` string, uuid, required
  - `sources` SourcePayload[], required
    - `content` string, required
    - `content_type` 'text' | 'markdown' | 'conversation' | 'html' | 'json' | 'pdf' | 'image' | 'audio' | 'video' — Today only `text` and `markdown` are processable.
    - `role` string
    - `visibility` 'private' | 'org'
    - `meta` object, nullable

## Response `202`

Accepted — job enqueued

- IngestAcceptedResponse
  - `job_id` string, uuid, required
  - `status` 'pending', required
  - `source_ids` string[], required
  - `jobs` object[], required — One entry per job the request was split into.
    - `job_id` string, uuid, required
    - `source_ids` string[], required

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `404` — Not found
- `429` — Rate limited / quota / pending cap
- `503` — Queue full

---

[API](https://skmtc.net/crosmos/apis/crosmos-api.md) · [All operations](https://skmtc.net/crosmos/apis/crosmos-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/crosmos/crosmos-api/versions/a828d1399648/schema)
