Skip to main content
Pinecone Docs
current

Search documentation

Type to search this documentation.

Build or rebuild the context's index from its sources

Curate the staged sources under the active manifest. Required before querying — there is no auto-curate. Body is optional; force: true rebuilds fully, which is what a manifest edit needs. Search contexts only: a work context builds via work/groom.

POST /contexts/{slug}/curate

cURL
curl --request POST \
  --url https://{host}/api/contexts/{slug}/curate \
  --header 'Authorization: Bearer <token>' \
  --header 'X-Pinecone-Api-Version: <x-pinecone-api-version>' \
  --header 'Content-Type: application/json' \
  --data '{
  "force": true,
  "batch_size": 123,
  "scope": "<string>",
  "trigger": "<string>",
  "model": "<string>",
  "pinecone_api_key": "<string>"
}'
Python
import requests

url = "https://{host}/api/contexts/{slug}/curate"

payload = {
  "force": True,
  "batch_size": 123,
  "scope": "<string>",
  "trigger": "<string>",
  "model": "<string>",
  "pinecone_api_key": "<string>"
}
headers = {
    "Authorization": "Bearer <token>",
    "X-Pinecone-Api-Version": "<x-pinecone-api-version>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
JavaScript
const options = {method: "POST", headers: {"Authorization": "Bearer <token>", "X-Pinecone-Api-Version": "<x-pinecone-api-version>", "Content-Type": "application/json"}, body: JSON.stringify({
  "force": true,
  "batch_size": 123,
  "scope": "<string>",
  "trigger": "<string>",
  "model": "<string>",
  "pinecone_api_key": "<string>"
})};

fetch("https://{host}/api/contexts/{slug}/curate", options)
  .then(res => res.json())
  .then(res => console.log(res))
  .catch(err => console.error(err));
PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://{host}/api/contexts/{slug}/curate",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"force\":true,\"batch_size\":123,\"scope\":\"<string>\",\"trigger\":\"<string>\",\"model\":\"<string>\",\"pinecone_api_key\":\"<string>\"}",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer <token>",
    "X-Pinecone-Api-Version: <x-pinecone-api-version>",
    "Content-Type: application/json"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
Go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://{host}/api/contexts/{slug}/curate"

	payload := strings.NewReader("{\"force\":true,\"batch_size\":123,\"scope\":\"<string>\",\"trigger\":\"<string>\",\"model\":\"<string>\",\"pinecone_api_key\":\"<string>\"}")

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

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("X-Pinecone-Api-Version", "<x-pinecone-api-version>")
	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))

}
Java
HttpResponse<String> response = Unirest.post("https://{host}/api/contexts/{slug}/curate")
  .header("Authorization", "Bearer <token>")
  .header("X-Pinecone-Api-Version", "<x-pinecone-api-version>")
  .header("Content-Type", "application/json")
  .body("{\"force\":true,\"batch_size\":123,\"scope\":\"<string>\",\"trigger\":\"<string>\",\"model\":\"<string>\",\"pinecone_api_key\":\"<string>\"}")
  .asString();
Ruby
require 'uri'
require 'net/http'

url = URI("https://{host}/api/contexts/{slug}/curate")

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

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["X-Pinecone-Api-Version"] = '<x-pinecone-api-version>'
request["Content-Type"] = 'application/json'
request.body = "{\"force\":true,\"batch_size\":123,\"scope\":\"<string>\",\"trigger\":\"<string>\",\"model\":\"<string>\",\"pinecone_api_key\":\"<string>\"}"

response = http.request(request)
puts response.read_body
200
{
  "task_id": "<string>",
  "state": "<string>",
  "exploring": true,
  "profiling": true,
  "importing": true
}
404
{
  "message": "<string>",
  "code": "<string>"
}
Authorizationstringrequired

Session token from POST /auth/login, sent as Authorization: Bearer <token>.

X-Pinecone-Api-Version?string

Date-based contract version, echoed back on the same header. Omit for the default (2026-07); send unstable for the in-development surface. An unrecognized value is rejected with 400 unsupported_api_version.

Typestring
Default2026-07
slugstringrequired

Context slug or UUID.

Typestring
force?boolean

Full rebuild rather than incremental

Typeboolean
Defaultfalse
batch_size?integer

How many sources curate reads per pass.

Typeinteger
scope?string

Curate scope recorded on the task input

Typestring
trigger?string

Provenance label recorded on the task input

Typestring
model?string

Model-id override for the curate runtime

Typestring
pinecone_api_key?string

Task-token override; normally not needed

Typestring

200 — Curate enqueued (state: importing)

What every context-workflow trigger returns. The work is asynchronous: poll GET /tasks/{task_id}. The per-workflow booleans duplicate state and appear only where a workflow's contract names one.

task_idstringrequired

The enqueued task. Poll it at GET /tasks/id.

Typestring
statestringrequired

The forward-looking status the trigger put the context into.

Typestring
exploring?boolean

Duplicates state; present only for explore

Typeboolean
profiling?boolean

Duplicates state; present only for profile

Typeboolean
importing?boolean

Duplicates state; present only for the import/curate triggers

Typeboolean
Suggest an edit

Propose a replacement for this page. The site team reviews it before applying any changes.

Export
Documentation menu