Skip to main content
POST
/
external
/
kb
Create Knowledge Base
curl --request POST \
  --url https://prod-api.ringg.ai/ca/api/v0/external/kb \
  --header 'Content-Type: multipart/form-data' \
  --header 'X-API-KEY: <x-api-key>' \
  --form 'kb_name=Product Documentation' \
  --form 'files=<string>' \
  --form 'urls=["https://example.com/docs", "https://example.com/faq"]' \
  --form 'faqs=[{"question": "What is your return policy?", "answer": "30-day money back guarantee"}]' \
  --form files.items='@example-file'
import requests

url = "https://prod-api.ringg.ai/ca/api/v0/external/kb"

files = { "files.items": ("example-file", open("example-file", "rb")) }
payload = {
"kb_name": "Product Documentation",
"files": "<string>",
"urls": "[\"https://example.com/docs\", \"https://example.com/faq\"]",
"faqs": "[{\"question\": \"What is your return policy?\", \"answer\": \"30-day money back guarantee\"}]"
}
headers = {"X-API-KEY": "<x-api-key>"}

response = requests.post(url, data=payload, files=files, headers=headers)

print(response.text)
const form = new FormData();
form.append('kb_name', 'Product Documentation');
form.append('files', '<string>');
form.append('urls', '["https://example.com/docs", "https://example.com/faq"]');
form.append('faqs', '[{"question": "What is your return policy?", "answer": "30-day money back guarantee"}]');
form.append('files.items', '{
"fileName": "example-file"
}');

const options = {method: 'POST', headers: {'X-API-KEY': '<x-api-key>'}};

options.body = form;

fetch('https://prod-api.ringg.ai/ca/api/v0/external/kb', 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://prod-api.ringg.ai/ca/api/v0/external/kb",
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=\"kb_name\"\r\n\r\nProduct Documentation\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"urls\"\r\n\r\n[\"https://example.com/docs\", \"https://example.com/faq\"]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"faqs\"\r\n\r\n[{\"question\": \"What is your return policy?\", \"answer\": \"30-day money back guarantee\"}]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"X-API-KEY: <x-api-key>"
],
]);

$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://prod-api.ringg.ai/ca/api/v0/external/kb"

payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"kb_name\"\r\n\r\nProduct Documentation\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"urls\"\r\n\r\n[\"https://example.com/docs\", \"https://example.com/faq\"]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"faqs\"\r\n\r\n[{\"question\": \"What is your return policy?\", \"answer\": \"30-day money back guarantee\"}]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("X-API-KEY", "<x-api-key>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://prod-api.ringg.ai/ca/api/v0/external/kb")
.header("X-API-KEY", "<x-api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"kb_name\"\r\n\r\nProduct Documentation\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"urls\"\r\n\r\n[\"https://example.com/docs\", \"https://example.com/faq\"]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"faqs\"\r\n\r\n[{\"question\": \"What is your return policy?\", \"answer\": \"30-day money back guarantee\"}]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();
require 'uri'
require 'net/http'

url = URI("https://prod-api.ringg.ai/ca/api/v0/external/kb")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<x-api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"kb_name\"\r\n\r\nProduct Documentation\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"urls\"\r\n\r\n[\"https://example.com/docs\", \"https://example.com/faq\"]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"faqs\"\r\n\r\n[{\"question\": \"What is your return policy?\", \"answer\": \"30-day money back guarantee\"}]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"

response = http.request(request)
puts response.read_body
{
  "message": "Knowledge Base creation initiated",
  "kb_id": "550e8400-e29b-41d4-a716-446655440000",
  "processing_status": "pending",
  "files_queued": 3
}

Create Knowledge Base

Create a new non-deterministic knowledge base that can be used to provide context and information to your AI agents. Knowledge bases support multiple content types including files, URLs, and FAQs.
Rate Limits:
  • Maximum 10 requests per hour per workspace
  • File size limit: 2 MB per file, 5 MB total
  • Maximum 10 files and 20 URLs per request

Content Types

Files

Upload documents (PDF, TXT, DOCX, etc.) to provide structured information to your knowledge base.
  • Max 10 files per request
  • 2 MB per file limit
  • 5 MB total size limit

URLs

Index web pages to automatically extract and store their content.
  • Max 20 URLs per request
  • URLs are crawled and indexed automatically
  • Content is refreshed periodically

FAQs

Provide question-answer pairs for deterministic responses to common queries.
{
  "faqs": "[{\"question\": \"What is your return policy?\", \"answer\": \"30-day money back guarantee\"}]"
}

Processing Status

Knowledge base creation is asynchronous. The response includes:
  • kb_id: Unique identifier for the knowledge base
  • processing_status: Current status (pending, processing, completed)
  • files_queued: Number of files being processed
Use the Get Knowledge Base by ID endpoint to check processing status.

Important Notes

  • Asynchronous Processing: Files and URLs are processed in the background
  • Content Updates: Use the Edit Knowledge Base endpoint to update content
  • Agent Integration: Link knowledge bases to agents via the assistant configuration

Headers

X-API-KEY
string
required

(Required) Your Ringg AI API key.

Example:

"7251cb4b-3373-43a4-844c-b27a1d45e0c9"

Body

multipart/form-data
kb_name
string
required

(Required) Name of the knowledge base

Example:

"Product Documentation"

files
file[]

(Optional) Array of files to upload (max 10 files, 2 MB each, 5 MB total)

urls
string

(Optional) JSON string array of URLs to index (max 20 URLs)

Example:

"[\"https://example.com/docs\", \"https://example.com/faq\"]"

faqs
string

(Optional) JSON string array of FAQ objects

Example:

"[{\"question\": \"What is your return policy?\", \"answer\": \"30-day money back guarantee\"}]"

Response

Knowledge base created successfully.

message
string
Example:

"Knowledge Base creation initiated"

kb_id
string
Example:

"550e8400-e29b-41d4-a716-446655440000"

processing_status
string
Example:

"pending"

files_queued
integer
Example:

3