curl --request PATCH \
--url https://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Namespace: <api-key>' \
--data '
{
"taxonomy_name": "<string>",
"description": "<string>",
"metadata": {}
}
'import requests
url = "https://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier}"
payload = {
"taxonomy_name": "<string>",
"description": "<string>",
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"X-Namespace": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
Authorization: 'Bearer <token>',
'X-Namespace': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({taxonomy_name: '<string>', description: '<string>', metadata: {}})
};
fetch('https://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier}', 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.mixpeek.com/v1/taxonomies/{taxonomy_identifier}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'taxonomy_name' => '<string>',
'description' => '<string>',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Namespace: <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://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier}"
payload := strings.NewReader("{\n \"taxonomy_name\": \"<string>\",\n \"description\": \"<string>\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("X-Namespace", "<api-key>")
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.patch("https://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier}")
.header("Authorization", "Bearer <token>")
.header("X-Namespace", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"taxonomy_name\": \"<string>\",\n \"description\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["X-Namespace"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"taxonomy_name\": \"<string>\",\n \"description\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"config": {
"default_input_mappings": [
{
"input_key": "image_vector",
"path": "features.clip_vit_l_14",
"source_type": "vector"
}
],
"default_retriever_id": "ret_clip_v1",
"source_collection": {
"collection_id": "col_products_v1"
},
"taxonomy_type": "flat"
},
"namespace_id": "ns_123",
"taxonomy_name": "product_tags",
"taxonomy_type": "flat"
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}Partially Update Taxonomy
Update a taxonomy’s metadata.
Metadata Only Updates: This endpoint allows updating ONLY metadata fields. Core taxonomy logic is immutable to ensure consistency for join history and dependent resources.
Fields You CAN Update:
- taxonomy_name: Rename the taxonomy
- description: Update documentation
- metadata: Update custom metadata
Fields You CANNOT Update:
- config: Taxonomy configuration (retriever_id, input_mappings, collections)
- taxonomy_type: Type (flat vs hierarchical)
Need to Modify Core Logic? Use POST //clone instead to modify configuration, retriever_id, input_mappings, or collections.
curl --request PATCH \
--url https://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Namespace: <api-key>' \
--data '
{
"taxonomy_name": "<string>",
"description": "<string>",
"metadata": {}
}
'import requests
url = "https://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier}"
payload = {
"taxonomy_name": "<string>",
"description": "<string>",
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"X-Namespace": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {
Authorization: 'Bearer <token>',
'X-Namespace': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({taxonomy_name: '<string>', description: '<string>', metadata: {}})
};
fetch('https://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier}', 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.mixpeek.com/v1/taxonomies/{taxonomy_identifier}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'taxonomy_name' => '<string>',
'description' => '<string>',
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Namespace: <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://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier}"
payload := strings.NewReader("{\n \"taxonomy_name\": \"<string>\",\n \"description\": \"<string>\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("X-Namespace", "<api-key>")
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.patch("https://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier}")
.header("Authorization", "Bearer <token>")
.header("X-Namespace", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"taxonomy_name\": \"<string>\",\n \"description\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/taxonomies/{taxonomy_identifier}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["X-Namespace"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"taxonomy_name\": \"<string>\",\n \"description\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"config": {
"default_input_mappings": [
{
"input_key": "image_vector",
"path": "features.clip_vit_l_14",
"source_type": "vector"
}
],
"default_retriever_id": "ret_clip_v1",
"source_collection": {
"collection_id": "col_products_v1"
},
"taxonomy_type": "flat"
},
"namespace_id": "ns_123",
"taxonomy_name": "product_tags",
"taxonomy_type": "flat"
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}Authorizations
Mixpeek API key, sent as Authorization: Bearer mxp_sk_.... Create one in Studio under Settings → API Keys, or with an admin key via POST /v1/organizations/users/{user_email}/api-keys. A missing header returns 403; an invalid or revoked key returns 401.
Namespace id (ns_...), not the namespace name. This scopes the request rather than authenticating it, and it is required on every operation marked x-mixpeek-namespace-scoped.
Path Parameters
Taxonomy ID or name
Body
Keys this body does not declare are ignored, and the response's warnings name them, until 2026-11-02; from 2026-11-02 they are refused with 422 extra_forbidden naming the accepted keys.
Request to update a taxonomy's metadata.
IMPORTANT: Partial Updates with Controlled Mutability
This endpoint allows updating ONLY metadata fields. Core taxonomy logic is immutable to ensure consistency for join history and dependent resources.
✅ Fields You CAN Update (Metadata Only):
taxonomy_name: Rename the taxonomydescription: Update documentationmetadata: Update custom metadata fields
❌ Fields You CANNOT Update (Immutable Core Logic):
config: Taxonomy configuration (retriever_id, input_mappings, collections, hierarchy)taxonomy_type: Type (flat vs hierarchical)retriever_id: Associated retrieverinput_mappings: Field mappingsenrichment_fields: Enrichment configuration
Need to Modify Core Logic? Use POST /taxonomies/{taxonomy_id}/clone instead. Cloning creates a new taxonomy with a new ID, allowing you to:
- Change retriever or input mappings
- Modify enrichment fields
- Update collection configuration
- Change taxonomy hierarchy
Behavior:
- All fields are OPTIONAL - provide only what you want to update
- Empty updates (no fields provided) will be rejected with 400 error
- Original taxonomy remains unchanged (no destructive operations)
Why This Design?
- Join history is tied to specific taxonomy configuration
- Changing retriever would invalidate previous joins
- Version tracking enables auditing and rollback
Response
Successful Response
Response model for a taxonomy.
A unique name for the taxonomy within the namespace.
Configuration for a flat taxonomy - single source collection with one retriever.
- FlatTaxonomyConfig
- HierarchicalTaxonomyConfig
Show child attributes
Show child attributes
{
"input_mappings": [
{
"input_key": "image_vector",
"path": "features.clip_vit_l_14",
"source_type": "vector"
}
],
"retriever_id": "ret_clip_v1",
"source_collection": {
"collection_id": "col_products_v1",
"enrichment_fields": [
{
"field_path": "metadata.tags",
"merge_mode": "append"
}
]
},
"taxonomy_type": "flat"
}
Unique identifier for the taxonomy
Monotonic version number of the taxonomy configuration
x >= 1Optional human-readable description.
Optional taxonomy-level retriever (prefer per-layer).
Optional taxonomy-level inputs (prefer per-layer).
Show child attributes
Show child attributes
For a hierarchy built from config.path_field: one node per distinct path prefix seen in enriched documents, with its parent. Grows as enrichment meets new paths. None for other taxonomies.
Show child attributes
Show child attributes
Whether the taxonomy is ready for use. False for async inference (cluster/LLM) that needs processing. True for flat/explicit hierarchies.
Creation timestamp for this taxonomy record
Additional user-defined metadata for the taxonomy
Was this page helpful?

