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

# Bulk API

> Send conversations and tables from your own systems into Rippit when there is no built-in integration for them.

> [!TIP]
>
> For a CSV file, use the [Rippit CLI](https://docs.rippit.com/cli.md) to upload directly from your terminal or coding agent. You do not need to convert it to JSON Lines or create an API token.

The Bulk API is for data Rippit doesn't have a dedicated [integration](https://docs.rippit.com/plg/data-integrations.md) for: chats from your own product, an internal ticket system, a call transcript export, or a table in your database or warehouse. You send it with an API token, and it lands in Rippit as a table you can query, report on, and point Agent Apps at, the same as integrated data.

You don't have to write the code yourself. Drop the [Bulk API skill](https://docs.rippit.com/api-reference/connect/bulk/rippit-bulk-ingest-api.md) into your assistant and it walks you through every step below, then writes and runs the upload script for you.

> [!NOTE]
>
> The Bulk API is for bulk uploads, not a streaming real-time ingest (i.e. a webhook per conversation or row). Data shows up in Rippit after each upload is processed, so run it on a schedule (hourly or daily) to keep Rippit current. A real-time streaming API is coming soon.

## What you can send

There are two types of upload. Pick the one that matches your data.

| | Type 1: Conversations | Type 2: Tables |
| - | - | - |
| **What it is** | Back-and-forth messages between two sides: customer and agent, user and bot, buyer and sales rep | Flat rows, one per record: accounts, orders, subscriptions, product usage, custom attributes |
| **One row is** | One conversation and all of its messages | One record |
| **File format** | JSON Lines | Parquet (recommended) or JSON Lines |
| **In Rippit** | One table per conversation source, with your own fields as columns | One table per dataset |
| **Re-sending a record** | Updates it, matched on your conversation ID | Updates it, matched on the primary key you choose |
| **Guide** | [Conversations guide](https://docs.rippit.com/api-reference/connect/bulk/conversations.md) | [Tables guide](https://docs.rippit.com/api-reference/connect/bulk/tables.md) |
| **For your assistant** | [conversations.md](https://docs.rippit.com/api-reference/connect/bulk/conversations.md) | [tables.md](https://docs.rippit.com/api-reference/connect/bulk/tables.md) |

Tables join to conversations on a `conversation_id` column, so you can send ticket metadata or the orders a customer placed alongside the conversation itself.

Because re-sending a record updates it instead of duplicating it, the same upload is safe to run every hour or every day.

## Before you start

The Bulk API has to be enabled for your workspace. If it isn't, every request returns `403`; ask your Rippit contact to turn it on.

You need to be a workspace admin to create an API token.

## Get an API token

Create one in Rippit chat (ask to "connect via API", then click **Create API token**) or with `rippit token create`, and copy it right away: it's shown once. Send it as `Authorization: Bearer <token>` on every request. See [Authentication](https://docs.rippit.com/api-reference/authentication.md).

The skill stores the token in a private file only you can read, so it never goes into the chat.

For a one-off upload, you can skip the token: an assistant with a shell, such as Claude Code, can send files through the Rippit MCP tools (`create_api_upload`, `start_api_upload`, `get_api_upload_status`) using its existing sign-in. Use a token for anything that runs on its own, like a script or a schedule.

## How an upload works

1. **Name the destination once.** A conversation source (such as `in-app chat`) or a dataset (such as `accounts`). Doing this again with the same name is safe.
2. **Ask for an upload slot.** Rippit returns a one-time upload link, valid for one hour.
3. **Upload one file** to that link, up to 128 MB.
4. **Mark the upload finished.** Processing starts right away.
5. **Check the job** until it says `done`. Rows that failed come back with their line number and the reason, while the rest are written.

Start with a small test upload, such as 10 conversations or 1,000 rows, and check the result in Rippit before sending everything.

## Limits

These are the free tier limits. Need more? Contact your Rippit point of contact, or ask in the [Rippit Community](https://docs.rippit.com/community.md), and we can raise them for your workspace.

| Limit | Free tier |
| - | - |
| File size | 128 MB per upload |
| Uploads | 10 per minute, 100 per hour, 100 per day |
| Messages per conversation | 10,000 |
| Columns per dataset | 500 |

Going over the upload limit returns `429` with a `Retry-After` header. Wait that many seconds and try again.

## Next steps

* [Drop in the Bulk API skill](https://docs.rippit.com/api-reference/connect/bulk/rippit-bulk-ingest-api.md)
* [API schema (OpenAPI)](https://integrations.maestroqa.com/api/v2/openapi.json)
* [How data integrations work](https://docs.rippit.com/plg/data-integrations.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.