How it works
- Name the conversation source once, such as
in-app chat. - Ask for an upload slot for it. Rippit returns a one-time upload link.
- Upload one file to that link. The file has one conversation per line.
- Tell Rippit the upload is finished. Processing starts right away.
- Check the job until it says
done. Any rows that failed come back with their line number and the reason.
Conversation sources
A source is where a set of conversations comes from, such asin-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 asRIPPIT_API_TOKEN, not in a script or a chat.
Authentication. Send your token in the apitoken header on every request:
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.
searchable. ended_at is left out, so the last message’s time is used.
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
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:
3. Upload the file
Send a multipart form POST toupload_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.
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
status: "queued".
5. Check the job
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.