Add Document¶
Adds a document to your semantic index.
Endpoint¶
API Request¶
- 
Required Parameters 
 title string required Title of the document, in plain text. MinLength: 1MaxLength: 250
 Optional Parameters 
 content string The main content of the document, in one of the supported formats. Info- 
While this parameter is optional, it's used in nearly all cases as it holds the primary content of the document. 
- 
Supported formats: plaintext|html|markdown
- 
Formats other than plain text will be converted to plain text before being processed and stored in the semantic index. 
- 
To use Gainly for searching files (such as PDFs, Microsoft Word docs, etc.) in your app, you must first convert the file content to one of the supported formats before including it in this field. 
 MaxLength: 100 KB
 content_type string (enum) Content type of the contentfield. Default isplaintext.Valid values: plaintext|html|markdown
 created_at string ISO 8601 formatted string that indicates the creation time of the document. If not provided in the API request, it defaults to the timestamp when the document was added via the API. Example: 2023-10-05T14:48:02Z
 id string Unique ID for the document. If not specified, Gainly will automatically assign a unique ID. MinLength: 1MaxLength: 128Allowed characters- 
The following characters are permitted: - Lowercase letters (a-z)
- Uppercase letters (A-Z)
- Numbers (0-9)
- Underscore (_)
- Hyphen (-)
 
- Lowercase letters (
- 
This means you can use UUIDs, for example. 
 
 language string (enum) Language code (of a supported language) that indicates the language of the document. Default is en.
 metadata object JSON object containing metadata related to the document. Info- metadataJSON can include arbitrary key-value pairs.
- The values can themselves be objects, allowing for nested structures.
- When performing a search, you can filter and sort by metadata values using dot notation.
 Max number of keys: 100MaxLength for a key: 50 charactersMaxLength for a value: 500 characters
 source_uri string Source URI of the document. Typically a unique address/location/identifier (within your app) for the document. InfoWhen a user clicks on a search result that corresponds to this document, you can use its source_urito navigate the user to the correct location within your app.MaxLength: 1000
 tenant_id string required Tenant ID of the document owner. MinLength: 1MaxLength: 250
 updated_at string ISO 8601 formatted string that indicates the last modification time of the document. If not provided in the API request, it defaults to the timestamp when the document was added via the API. Example: 2023-10-05T14:48:02Z
- 
- 
POST /v20241104/documents 
 curl -X POST "https://api.gainly.ai/v20241104/documents" \ -H "Content-Type: application/json" \ -H "X-API-Key: YOUR_API_KEY_HERE" \ # (1)! -d '{ "title": "My awesome document", "content": "This document has great content. Can be really long, but is short here.", "source_uri": "/doc/7-my-awesome-document", "tenant_id": "tenant123" }'- Replace YOUR_API_KEY_HEREwith the value of your API key.
 # Prompt for AI coding assistants/IDEs (e.g., ChatGPT, Claude, GitHub Copilot, Cursor, Windsurf) Using the Gainly API: 1. Write code to call the add_document operation (see OpenAPI spec: https://api.gainly.ai/v20241104/openapi.json) 2. Implement authentication using the header "X-API-Key" as described in the docs: https://docs.gainly.ai/latest/api-reference/authentication/ 3. Implement rate limit handling as described in the docs: https://docs.gainly.ai/latest/api-reference/rate-limits/ 4. Implement error handling 5. Handle the response according to the DocumentAddResponse schema in the OpenAPI specusing System.Net.Http; using System.Text.Json; var client = new HttpClient(); var payload = new { title = "My awesome document", content = "This document has great content. Can be really long, but is short here.", source_uri = "/doc/7-my-awesome-document", tenant_id = "tenant123" }; client.DefaultRequestHeaders.Add("X-API-Key", "YOUR_API_KEY_HERE"); // (1)! var response = await client.PostAsJsonAsync( "https://api.gainly.ai/v20241104/documents", payload ); var result = await response.Content.ReadAsStringAsync(); Console.WriteLine(result);- Replace YOUR_API_KEY_HEREwith the value of your API key.
 package main import ( "encoding/json" "fmt" "net/http" "strings" ) func main() { payload := `{ "title": "My awesome document", "content": "This document has great content. Can be really long, but is short here.", "source_uri": "/doc/7-my-awesome-document", "tenant_id": "tenant123" }` req, _ := http.NewRequest("POST", "https://api.gainly.ai/v20241104/documents", strings.NewReader(payload)) req.Header.Set("Content-Type", "application/json") req.Header.Set("X-API-Key", "YOUR_API_KEY_HERE") // (1)! resp, _ := http.DefaultClient.Do(req) defer resp.Body.Close() var result map[string]interface{} json.NewDecoder(resp.Body).Decode(&result) fmt.Println(result) }- Replace YOUR_API_KEY_HEREwith the value of your API key.
 import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.URI; var client = HttpClient.newHttpClient(); var payload = """ { "title": "My awesome document", "content": "This document has great content. Can be really long, but is short here.", "source_uri": "/doc/7-my-awesome-document", "tenant_id": "tenant123" } """; var request = HttpRequest.newBuilder() .uri(URI.create("https://api.gainly.ai/v20241104/documents")) .header("Content-Type", "application/json") .header("X-API-Key", "YOUR_API_KEY_HERE") // (1)! .POST(HttpRequest.BodyPublishers.ofString(payload)) .build(); var response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());- Replace YOUR_API_KEY_HEREwith the value of your API key.
 // Node.js example using axios const axios = require('axios'); // or: import axios from 'axios'; const url = 'https://api.gainly.ai/v20241104/documents'; const payload = { title: 'My awesome document', content: 'This document has great content. Can be really long, but is short here.', source_uri: '/doc/7-my-awesome-document', tenant_id: 'tenant123' }; const headers = { 'Content-Type': 'application/json', 'X-API-Key': 'YOUR_API_KEY_HERE' // (1)! }; axios.post(url, payload, { headers }) .then(response => console.log(response.data)) .catch(error => console.error('Error:', error.message));- Replace YOUR_API_KEY_HEREwith the value of your API key.
 <?php $client = new \GuzzleHttp\Client(); $url = 'https://api.gainly.ai/v20241104/documents'; $response = $client->request('POST', $url, [ 'json' => [ 'title' => 'My awesome document', 'content' => 'This document has great content. Can be really long, but is short here.', 'source_uri' => '/doc/7-my-awesome-document', 'tenant_id' => 'tenant123' ], 'headers' => [ 'Accept' => 'application/json', 'Content-Type' => 'application/json', 'X-API-Key' => 'YOUR_API_KEY_HERE' # (1)! ], ]); echo $response->getBody();- Replace YOUR_API_KEY_HEREwith the value of your API key.
 import requests url = "https://api.gainly.ai/v20241104/documents" payload = { "title": "My awesome document", "content": "This document has great content. Can be really long, but is short here.", "source_uri": "/doc/7-my-awesome-document", "tenant_id": "tenant123" } headers = { "Content-Type": "application/json", "X-API-Key": "YOUR_API_KEY_HERE" # (1)! } response = requests.post(url, json=payload, headers=headers) data = response.json() print(data)- Replace YOUR_API_KEY_HEREwith the value of your API key.
 require 'json' require 'uri' require 'net/http' require 'openssl' url = URI('https://api.gainly.ai/v20241104/documents') http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request['Content-Type'] = 'application/json' request['X-API-Key'] = 'YOUR_API_KEY_HERE' # (1)! request.body = { title: 'My awesome document', content: 'This document has great content. Can be really long, but is short here.', source_uri: '/doc/7-my-awesome-document', tenant_id: 'tenant123' }.to_json response = http.request(request) puts response.read_body- Replace YOUR_API_KEY_HEREwith the value of your API key.
 
 
- Replace 
API Response¶
{
    "id": "PbOrIZIBzlg4zQqVFxxE",
    "object": "document",
    "title": "My awesome document",
    "content": "This document has great content. Can be really long, but is short here.",
    "metadata": null,
    "tenant_id": "tenant123",
    "language": "en",
    "source_uri": "/doc/7-my-awesome-document",
    "created_at": "2023-10-05T14:48:02Z",
    "updated_at": "2023-10-05T14:48:02Z",
    "token_usage": {
        "semantic_tokens": 8,  // determined by the size of 'title', 'content' fields
        "llm_tokens": {
            "llm_output_tokens": 0,
            "llm_input_tokens": 0,
            "model": null
        }
    },
    "livemode": false
}
Response will include the unique id assigned to the newly added document.