curl --request POST \
--url https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/ \
--header 'Content-Type: multipart/form-data' \
--cookie sessionid= \
--form file='@example-file' \
--form force_reupload_existing=false \
--form 'parent_topic_path=<string>'import requests
url = "https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"force_reupload_existing": "false",
"parent_topic_path": "<string>"
}
headers = {"cookie": "sessionid="}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('force_reupload_existing', 'false');
form.append('parent_topic_path', '<string>');
const options = {method: 'POST', headers: {cookie: 'sessionid='}};
options.body = form;
fetch('https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"force_reupload_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parent_topic_path\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_COOKIE => "sessionid=",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"force_reupload_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parent_topic_path\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cookie", "sessionid=")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/")
.header("cookie", "sessionid=")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"force_reupload_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parent_topic_path\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["cookie"] = 'sessionid='
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"force_reupload_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parent_topic_path\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"message": "<string>",
"job_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}Create Sources from ZIP
Upload a ZIP file, ingest supported files, assign topics from ZIP folder paths, and queue parse jobs.
In addition to standard source files (pdf, html, md, csv, etc.),
this endpoint also discovers structured JSON files for KBA and Forum
ingestion. Files whose name ends with _kba.json are ingested as
KBA sources, and files ending with _forum.json are ingested as
Forum sources. Other .json files are ignored.
curl --request POST \
--url https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/ \
--header 'Content-Type: multipart/form-data' \
--cookie sessionid= \
--form file='@example-file' \
--form force_reupload_existing=false \
--form 'parent_topic_path=<string>'import requests
url = "https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"force_reupload_existing": "false",
"parent_topic_path": "<string>"
}
headers = {"cookie": "sessionid="}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('force_reupload_existing', 'false');
form.append('parent_topic_path', '<string>');
const options = {method: 'POST', headers: {cookie: 'sessionid='}};
options.body = form;
fetch('https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"force_reupload_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parent_topic_path\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_COOKIE => "sessionid=",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"force_reupload_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parent_topic_path\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("cookie", "sessionid=")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/")
.header("cookie", "sessionid=")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"force_reupload_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parent_topic_path\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-prod.voltai.ai/source/api/sources/bulk-ingest-zip/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["cookie"] = 'sessionid='
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"force_reupload_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parent_topic_path\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"message": "<string>",
"job_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}Authorizations
Query Parameters
Organization name (required for multi-tenant API keys)
Body
Request schema for bulk source ingestion from a ZIP upload.
ZIP file to upload and ingest.
When true, re-upload and re-parse even if source already exists.
Optional parent topic root-to-leaf path as a JSON-encoded array of strings (example: '["Manufacturers", "Acme"]'). This path is prefixed to each ZIP-derived file topic path.