Skip to main content
A conversation is an ordered set of messages, usually between a customer and an agent (a support rep, a sales rep, or a bot). It can also be one-sided, such as an AI agent trace where every step is the agent’s. Each upload line is one conversation and all of its messages. You don’t have to write the code yourself: drop the Bulk Ingest API skill into your assistant and it walks you through the upload. Assistants can read this guide as raw markdown at bulk_conversations.md.

How it works

  1. Name the conversation source once, such as in-app chat.
  2. Ask for an upload slot for it. Rippit returns a one-time upload link.
  3. Upload one file to that link. The file has one conversation per line.
  4. Tell Rippit the upload is finished. Processing starts right away.
  5. Check the job until it says done. Any rows that failed come back with their line number and the reason.
Uploading the same conversation again updates it instead of creating a duplicate. That makes it safe to run the same export every hour or every day.

Conversation sources

A source is where a set of conversations comes from, such as in-app chat, support email or sales calls. You name it once, then pass that name as source on every upload. Each source becomes its own table in Rippit, with one row per conversation and your searchable keys as columns. A source’s columns are the searchable keys of its first upload. Later uploads should use the same keys: a file whose keys fit another of your sources better than the one you named fails with a message naming the better fit, so a sales-call export can’t end up in your support chats by mistake. To add your own tables alongside, such as accounts or orders, see the bulk dataset upload. Join them to conversations on conversation_id.

Before you start

Get an API token. In Rippit, open Tables, click Add table, then Add API Table, and create or copy a token. You need to be a workspace admin. Keep it in an environment variable such as RIPPIT_API_TOKEN, not in a script or a chat. Authentication. Send your token in the apitoken header on every request:
Base URL: https://integrations.maestroqa.com/api/v2/bulk_ingest Bulk upload has to be switched on for your account. If it isn’t, requests return 403 with “Your account does not have API ingest enabled.” Ask your Rippit contact to turn it on.

The file format

Upload JSON Lines (.jsonl): one conversation per line, and each line is a complete JSON object.

conversation

events (the messages)

A conversation can have up to 10,000 events. Rules for keys in searchable and attributes: letters, numbers and underscores only, starting with a letter or underscore, and at most 64 characters. plan_tier works. Plan Tier! doesn’t.

More examples

These are pretty-printed so they’re easier to read. In your file, each conversation goes on one line. An in-app chat from your own product. A bot hands off to an agent. It includes an internal note (public: false) and per-message attributes.
An email ticket exported from a help desk. Your ticket fields go in searchable. ended_at is left out, so the last message’s time is used.
Values in searchable must be single values, not lists. Join a list like tags into one string, as in "billing,refund".

The API

1. Name the conversation source

The response:
Calling it again with the same name returns status: "exists", so your script can always call it first. To see your sources and their columns:
columns and table_url are null until the source’s first upload. table_url opens the table in Rippit.

2. Ask for an upload slot

source is the source’s name, URL-encoded. Uploading to a name you haven’t created returns 404. The response:
The upload link expires after one hour.

3. Upload the file

Send a multipart form POST to upload_url. Include every entry in upload_fields exactly as you received it, and attach the file as file. Don’t send your Rippit credentials on this request.
A successful upload returns 204. The file can be at most 128 MB, the value of max_bytes. Split bigger exports across several uploads.

4. Mark the upload finished

This returns the job with status: "queued".

5. Check the job

Poll this every 10 to 30 seconds until status is done or failed.
row is the 0-based line number in your file. Fix the rejected lines and upload just those again.

Limits

Only uploads that were actually completed count toward the limits. If you hit one you get 429 with a Retry-After header. Wait that many seconds and try again.

Errors