Estimate the token + time cost of curating the in-progress manifest
Estimates the token and time cost of curating the sources under the manifest in the request body, reported as the task's output (see ProfileEstimateOutput). Persists nothing. Body is optional.
POST /contexts/{slug}/profile
curl --request POST \
--url https://{host}/api/contexts/{slug}/profile \
--header 'Authorization: Bearer <token>' \
--header 'X-Pinecone-Api-Version: <x-pinecone-api-version>' \
--header 'Content-Type: application/json' \
--data '{
"manifest": {
"curate": {
"chunks": null,
"artifacts": null
},
"optimize": {
"schedule": "<string>",
"latency_threshold_ms": 123,
"min_group_size": 123,
"eval_pass_rate_threshold": 123,
"max_iterations": 123
},
"search": {
"instructions": "<string>"
}
},
"pinecone_api_key": "<string>"
}'import requests
url = "https://{host}/api/contexts/{slug}/profile"
payload = {
"manifest": {
"curate": {
"chunks": None,
"artifacts": None
},
"optimize": {
"schedule": "<string>",
"latency_threshold_ms": 123,
"min_group_size": 123,
"eval_pass_rate_threshold": 123,
"max_iterations": 123
},
"search": {
"instructions": "<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)const options = {method: "POST", headers: {"Authorization": "Bearer <token>", "X-Pinecone-Api-Version": "<x-pinecone-api-version>", "Content-Type": "application/json"}, body: JSON.stringify({
"manifest": {
"curate": {
"chunks": null,
"artifacts": null
},
"optimize": {
"schedule": "<string>",
"latency_threshold_ms": 123,
"min_group_size": 123,
"eval_pass_rate_threshold": 123,
"max_iterations": 123
},
"search": {
"instructions": "<string>"
}
},
"pinecone_api_key": "<string>"
})};
fetch("https://{host}/api/contexts/{slug}/profile", 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://{host}/api/contexts/{slug}/profile",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{\"manifest\":{\"curate\":{\"chunks\":null,\"artifacts\":null},\"optimize\":{\"schedule\":\"<string>\",\"latency_threshold_ms\":123,\"min_group_size\":123,\"eval_pass_rate_threshold\":123,\"max_iterations\":123},\"search\":{\"instructions\":\"<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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{host}/api/contexts/{slug}/profile"
payload := strings.NewReader("{\"manifest\":{\"curate\":{\"chunks\":null,\"artifacts\":null},\"optimize\":{\"schedule\":\"<string>\",\"latency_threshold_ms\":123,\"min_group_size\":123,\"eval_pass_rate_threshold\":123,\"max_iterations\":123},\"search\":{\"instructions\":\"<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))
}HttpResponse<String> response = Unirest.post("https://{host}/api/contexts/{slug}/profile")
.header("Authorization", "Bearer <token>")
.header("X-Pinecone-Api-Version", "<x-pinecone-api-version>")
.header("Content-Type", "application/json")
.body("{\"manifest\":{\"curate\":{\"chunks\":null,\"artifacts\":null},\"optimize\":{\"schedule\":\"<string>\",\"latency_threshold_ms\":123,\"min_group_size\":123,\"eval_pass_rate_threshold\":123,\"max_iterations\":123},\"search\":{\"instructions\":\"<string>\"}},\"pinecone_api_key\":\"<string>\"}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/api/contexts/{slug}/profile")
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 = "{\"manifest\":{\"curate\":{\"chunks\":null,\"artifacts\":null},\"optimize\":{\"schedule\":\"<string>\",\"latency_threshold_ms\":123,\"min_group_size\":123,\"eval_pass_rate_threshold\":123,\"max_iterations\":123},\"search\":{\"instructions\":\"<string>\"}},\"pinecone_api_key\":\"<string>\"}"
response = http.request(request)
puts response.read_body{
"task_id": "<string>",
"state": "<string>",
"exploring": true,
"profiling": true,
"importing": true
}{
"message": "<string>",
"code": "<string>"
}Authorizations
Section titled “Authorizations”AuthorizationstringrequiredSession token from POST /auth/login, sent as Authorization: Bearer <token>.
Headers
Section titled “Headers”X-Pinecone-Api-Version?stringDate-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.
Path Parameters
Section titled “Path Parameters”slugstringrequiredContext slug or UUID.
manifest?objectIn-progress manifest to estimate against (default )
Show child attributes
curate?objectWhat curate builds out of the sources — the chunk leg, the artifact leg, or both.
Show child attributes
chunks?objectThe chunk leg — sources split into passages, embedded for semantic search and optionally indexed for keyword search.
Show child attributes
enabled?booleanWhether curate builds the chunk leg at all.
embedding_model?stringModel that embeds the chunks.
Required string length: 0 - 128
chunking?objectHow a source is cut into chunks.
keyword?objectThe lexical index built alongside the vectors, for exact-term matching.
artifacts?objectThe artifact leg: knowledge an LLM distills out of the sources, as prose files or database rows. Off by default.
Show child attributes
enabled?booleanWhether curate extracts artifacts at all.
artifact_model?stringModel tier that does the extraction. standard reads more carefully at a higher token cost.
artifact_types?object[]What kinds of artifact to extract. Nothing is extracted until at least one is declared.
edge_types?object[]Typed, directed relationships between artifact types, which turn the artifacts into a graph the agent can traverse.
min_doc_count?integerHow many source documents must mention a corpus-scoped subject before it earns an artifact. Raise it to suppress one-off mentions. An artifact type may override it.
Required range: 1 <= x <= 64
max_tokens?integerOutput cap for one extracted artifact, in tokens.
Required range: 128 <= x <= 8192
max_doc_chars?integerInput cap for one extraction call, in characters. With windowing off this also caps how much of a source is read at all; everything beyond it is dropped.
Required range: 1000 <= x <= 2000000
extraction_window_chars?integerWindow size for walking a long source across several extraction calls, so its back half is covered rather than dropped. 0 opts out and reads only the head, up to max_doc_chars.
Required range: 0 <= x <= 1000000
mention_max_chars?integerCap on one recorded mention — what a single document says about the subject — in characters.
Required range: 100 <= x <= 4000
max_mentions_per_artifact?integerHow many mentions are fed into the pass that reduces them into one corpus-wide artifact.
Required range: 1 <= x <= 500
mention_context_chars?integerCap on those mentions once concatenated, in characters. Applied after max_mentions_per_artifact.
Required range: 1000 <= x <= 100000
max_artifacts_per_type?integerHow many artifacts one type may produce. Omit for no cap.
Required range: 1 <= x <= 10000
optimize?objectThe scheduled self-tuning loop: it clusters the queries that answered badly and tries candidate manifests against an ephemeral index until one reproduces the recorded answers.
Show child attributes
schedule?stringCron expression the tuning loop runs on.
Required string length: 0 - 128
latency_threshold_ms?integerA query slower than this counts as a problem worth tuning for, as does any query that fell back from artifacts to chunks. 0 disables the latency test, leaving only fallback.
Required range: 0 <= x <= 600000
min_group_size?integerHow many near-duplicate problem queries must cluster together before the loop tunes for them. Keeps a one-off slow query from triggering a manifest change.
Required range: 1 <= x <= 100
eval_pass_rate_threshold?numberFraction of eval queries a candidate manifest must answer correctly to be considered ready. 1 demands all of them.
Required range: 0 <= x <= 1
max_iterations?integerHow many candidate manifests the loop tries before stopping with its best.
Required range: 1 <= x <= 100
search?objectStanding instructions for the query runtime, pinned on the context rather than sent per turn.
Show child attributes
instructions?stringThe context's default system prompt, applied to every turn in scope. A session's own system_prompt appends to it rather than replacing it.
pinecone_api_key?stringTask-token override; normally not needed
Response
Section titled “Response”200 — Profile enqueued (state: profiling)
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_idstringrequiredThe enqueued task. Poll it at GET /tasks/id.
statestringrequiredThe forward-looking status the trigger put the context into.
exploring?booleanDuplicates state; present only for explore
profiling?booleanDuplicates state; present only for profile
importing?booleanDuplicates state; present only for the import/curate triggers