curl --request POST \
--url https://api.hyperspell.com/memories/add/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"collection": "my-collection",
"metadata": {
"author": "John Doe",
"date": "2025-05-20T02:31:00Z",
"rating": 3
},
"text": "...",
"title": "My Document"
}
]
}
'import requests
url = "https://api.hyperspell.com/memories/add/bulk"
payload = { "items": [
{
"collection": "my-collection",
"metadata": {
"author": "John Doe",
"date": "2025-05-20T02:31:00Z",
"rating": 3
},
"text": "...",
"title": "My Document"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
items: [
{
collection: 'my-collection',
metadata: {author: 'John Doe', date: '2025-05-20T02:31:00Z', rating: 3},
text: '...',
title: 'My Document'
}
]
})
};
fetch('https://api.hyperspell.com/memories/add/bulk', 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.hyperspell.com/memories/add/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'items' => [
[
'collection' => 'my-collection',
'metadata' => [
'author' => 'John Doe',
'date' => '2025-05-20T02:31:00Z',
'rating' => 3
],
'text' => '...',
'title' => 'My Document'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.hyperspell.com/memories/add/bulk"
payload := strings.NewReader("{\n \"items\": [\n {\n \"collection\": \"my-collection\",\n \"metadata\": {\n \"author\": \"John Doe\",\n \"date\": \"2025-05-20T02:31:00Z\",\n \"rating\": 3\n },\n \"text\": \"...\",\n \"title\": \"My Document\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.hyperspell.com/memories/add/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"collection\": \"my-collection\",\n \"metadata\": {\n \"author\": \"John Doe\",\n \"date\": \"2025-05-20T02:31:00Z\",\n \"rating\": 3\n },\n \"text\": \"...\",\n \"title\": \"My Document\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperspell.com/memories/add/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"items\": [\n {\n \"collection\": \"my-collection\",\n \"metadata\": {\n \"author\": \"John Doe\",\n \"date\": \"2025-05-20T02:31:00Z\",\n \"rating\": 3\n },\n \"text\": \"...\",\n \"title\": \"My Document\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"count": 123,
"items": [
{
"source": "reddit",
"resource_id": "<string>",
"status": "pending"
}
],
"success": true,
"skipped": [
{
"resource_id": "<string>",
"reason": "<string>"
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Add multiple memories
Adds multiple documents to the index in a single request.
All items are validated before processing begins. If any item fails validation, the entire batch is rejected with a 422 error detailing which items failed and why.
Maximum 100 items per request. Each item follows the same schema as the single-item /memories/add endpoint.
curl --request POST \
--url https://api.hyperspell.com/memories/add/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"collection": "my-collection",
"metadata": {
"author": "John Doe",
"date": "2025-05-20T02:31:00Z",
"rating": 3
},
"text": "...",
"title": "My Document"
}
]
}
'import requests
url = "https://api.hyperspell.com/memories/add/bulk"
payload = { "items": [
{
"collection": "my-collection",
"metadata": {
"author": "John Doe",
"date": "2025-05-20T02:31:00Z",
"rating": 3
},
"text": "...",
"title": "My Document"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
items: [
{
collection: 'my-collection',
metadata: {author: 'John Doe', date: '2025-05-20T02:31:00Z', rating: 3},
text: '...',
title: 'My Document'
}
]
})
};
fetch('https://api.hyperspell.com/memories/add/bulk', 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.hyperspell.com/memories/add/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'items' => [
[
'collection' => 'my-collection',
'metadata' => [
'author' => 'John Doe',
'date' => '2025-05-20T02:31:00Z',
'rating' => 3
],
'text' => '...',
'title' => 'My Document'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.hyperspell.com/memories/add/bulk"
payload := strings.NewReader("{\n \"items\": [\n {\n \"collection\": \"my-collection\",\n \"metadata\": {\n \"author\": \"John Doe\",\n \"date\": \"2025-05-20T02:31:00Z\",\n \"rating\": 3\n },\n \"text\": \"...\",\n \"title\": \"My Document\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.hyperspell.com/memories/add/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"collection\": \"my-collection\",\n \"metadata\": {\n \"author\": \"John Doe\",\n \"date\": \"2025-05-20T02:31:00Z\",\n \"rating\": 3\n },\n \"text\": \"...\",\n \"title\": \"My Document\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperspell.com/memories/add/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"items\": [\n {\n \"collection\": \"my-collection\",\n \"metadata\": {\n \"author\": \"John Doe\",\n \"date\": \"2025-05-20T02:31:00Z\",\n \"rating\": 3\n },\n \"text\": \"...\",\n \"title\": \"My Document\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"count": 123,
"items": [
{
"source": "reddit",
"resource_id": "<string>",
"status": "pending"
}
],
"success": true,
"skipped": [
{
"resource_id": "<string>",
"reason": "<string>"
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
API Key or JWT User Token. If using an API Key, set the X-As-User header to act as a specific user. A JWT User Token is always scoped to a specific user.
Headers
Optionally set this header to act as a specific user when using an API Key, equivalent to first exchanging the API Key for a User Token
Body
Request schema for bulk memory ingestion.
List of memories to ingest. Maximum 100 items.
1 - 100 elementsShow child attributes
Show child attributes
Response
Successful Response
Response schema for successful bulk ingestion.
Number of items successfully processed
Status of each ingested item
Show child attributes
Show child attributes
Items not ingested because their resource_id is already owned by another user on this app. Empty in the common case; a non-empty list is a partial success, not an error.
Show child attributes
Show child attributes
Was this page helpful?