---
title: "Ingest data for processing with memory integration"
method: POST
path: "/v1/data/ingest"
tags: ["v1 data"]
---

# Ingest data for processing with memory integration

`POST /v1/data/ingest`

Ingest data for asynchronous processing

    Accepts various content types (text, messages, files) and processes them to extract information
    and integrate it into the user's memory system. Returns a job_id for tracking status.

    **Entity Resolution:**
    - user_id (str, required): Always required - the main user identifier
    - persona_id (str, optional): If provided, data is ingested to this persona instead of user
    - project_id (str, optional): If provided, data is ingested to this project (inherits from user)
    
    Priority: persona_id > project_id > user_id

    **Request Parameters:**
    - content_type (str, required): One of: "text", "messages", "pdf", "word", "image", "video", "audio", "file"
    - payload (str|dict|list, required): Content data (text string, message list, or base64 for files)
    - content_description (str, optional): Description of the content being ingested (e.g., 'Logo design concepts', 'Meeting notes')
    - session_id (str, optional): Groups related content for session-based retrieval
    - timestamp (str, optional): ISO-8601 timestamp for historical data
    - filename (str, optional): Original filename for file uploads

    **Response:**
    - job_id (str): Unique identifier for tracking the processing job
    - user_id (str): Confirmed entity ID (user, persona, or project)
    - content_type (str): Confirmed content type
    - status (str): Job status ('queued', 'accepted')
    - message (str): Status message
    - created_at (str): ISO-8601 timestamp
    - success (bool): True if accepted

    **Example:**
    ```json
    {
        "user_id": "user-123",
        "persona_id": null,
        "project_id": "project-456",
        "content_type": "text",
        "payload": "Meeting notes from today's discussion",
        "content_description": "Meeting notes from today's discussion"
    }
    ```

    Returns 202 Accepted with job_id. Use /job/status to check processing status.
    Max payload: 5MB (JSON), 20MB (multipart). Requires JWT authentication.

## Request body

- IngestRequest — Request model for data ingestion (JSON payload)
  - `user_id` string, required — User ID (always required)
  - `persona_id` string, nullable — Optional persona ID. If provided, data is ingested to this persona instead of the user
  - `project_id` string, nullable — Optional project ID. If provided, data is ingested to this project (inherits from user)
  - `content_type` string, nullable — Content category: 'text', 'image', 'video', 'pdf', 'audio', 'messages', 'file'. If omitted, the category is auto-detected from the uploaded file bytes.
  - `payload` union, required — Raw content as string, object, list (for messages), or base64 encoded data
    - string
    - object
    - unknown[]
      - unknown
  - `content_description` string, nullable — Optional description of the content being ingested (e.g., 'Logo design concepts', 'Meeting notes')
  - `session_id` string, nullable — Session ID for grouping related ingested content and enabling session-based retrieval
  - `timestamp` string, nullable — ISO-8601 timestamp to preserve original data moment
  - `filename` string, nullable — Filename of the uploaded file
  - `callback_url` string, nullable — Optional URL the server will POST to when the job reaches a terminal state (done, error, cancelled). The payload will match the /v1/data/job/status response shape.
  - `notification_email` string, email, nullable — Optional email address to notify when the job reaches a terminal state.

## Response `202`

Successful Response

- IngestResponse — Response model for data ingestion
  - `job_id` string, required — Unique job identifier for tracking
  - `status` string, required — Processing status ('accepted', 'queued', 'failed')
  - `message` string, nullable — Additional status or error message
  - `success` boolean — Whether the request was accepted successfully

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `404` — User/Persona/Project Not Found
- `413` — Payload Too Large
- `422` — Validation Error
- `500` — Internal Server Error

---

[API](https://skmtc.net/elicitlabs/apis/elicit-labs-api.md) · [All operations](https://skmtc.net/elicitlabs/apis/elicit-labs-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/elicitlabs/elicit-labs-api/revisions/27701839a070/schema)
