curl --request PATCH \
--url https://api.mixpeek.com/v1/organizations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"organization_name": "<string>",
"logo_url": "<string>",
"billing_email": "jsmith@example.com",
"notifications_email": "jsmith@example.com",
"metadata": {},
"rate_limit_overrides": {
"metadata": 20,
"data": 10,
"search": 10,
"upload": 5,
"compute": 5
},
"default_llm_credentials": {},
"nsfw_check_enabled": true,
"nsfw_fail_closed": true
}
'import requests
url = "https://api.mixpeek.com/v1/organizations"
payload = {
"organization_name": "<string>",
"logo_url": "<string>",
"billing_email": "jsmith@example.com",
"notifications_email": "jsmith@example.com",
"metadata": {},
"rate_limit_overrides": {
"metadata": 20,
"data": 10,
"search": 10,
"upload": 5,
"compute": 5
},
"default_llm_credentials": {},
"nsfw_check_enabled": True,
"nsfw_fail_closed": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
organization_name: '<string>',
logo_url: '<string>',
billing_email: 'jsmith@example.com',
notifications_email: 'jsmith@example.com',
metadata: {},
rate_limit_overrides: {metadata: 20, data: 10, search: 10, upload: 5, compute: 5},
default_llm_credentials: {},
nsfw_check_enabled: true,
nsfw_fail_closed: true
})
};
fetch('https://api.mixpeek.com/v1/organizations', 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/organizations",
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([
'organization_name' => '<string>',
'logo_url' => '<string>',
'billing_email' => 'jsmith@example.com',
'notifications_email' => 'jsmith@example.com',
'metadata' => [
],
'rate_limit_overrides' => [
'metadata' => 20,
'data' => 10,
'search' => 10,
'upload' => 5,
'compute' => 5
],
'default_llm_credentials' => [
],
'nsfw_check_enabled' => true,
'nsfw_fail_closed' => true
]),
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.mixpeek.com/v1/organizations"
payload := strings.NewReader("{\n \"organization_name\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"billing_email\": \"jsmith@example.com\",\n \"notifications_email\": \"jsmith@example.com\",\n \"metadata\": {},\n \"rate_limit_overrides\": {\n \"metadata\": 20,\n \"data\": 10,\n \"search\": 10,\n \"upload\": 5,\n \"compute\": 5\n },\n \"default_llm_credentials\": {},\n \"nsfw_check_enabled\": true,\n \"nsfw_fail_closed\": true\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.mixpeek.com/v1/organizations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"organization_name\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"billing_email\": \"jsmith@example.com\",\n \"notifications_email\": \"jsmith@example.com\",\n \"metadata\": {},\n \"rate_limit_overrides\": {\n \"metadata\": 20,\n \"data\": 10,\n \"search\": 10,\n \"upload\": 5,\n \"compute\": 5\n },\n \"default_llm_credentials\": {},\n \"nsfw_check_enabled\": true,\n \"nsfw_fail_closed\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/organizations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"organization_name\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"billing_email\": \"jsmith@example.com\",\n \"notifications_email\": \"jsmith@example.com\",\n \"metadata\": {},\n \"rate_limit_overrides\": {\n \"metadata\": 20,\n \"data\": 10,\n \"search\": 10,\n \"upload\": 5,\n \"compute\": 5\n },\n \"default_llm_credentials\": {},\n \"nsfw_check_enabled\": true,\n \"nsfw_fail_closed\": true\n}"
response = http.request(request)
puts response.read_body{
"account_type": "pro",
"created_at": "2025-01-01T00:00:00Z",
"credit_count": 250000,
"logo_url": "https://www.google.com/s2/favicons?domain=acme.com&sz=128",
"organization_id": "org_demo123",
"organization_name": "Acme Corporation"
}{
"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
}Update Organization
Update organization settings (requires ADMIN permission).
Security: Infrastructure configuration cannot be modified via this endpoint. Infrastructure updates require Mixpeek admin access via private endpoints.
curl --request PATCH \
--url https://api.mixpeek.com/v1/organizations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"organization_name": "<string>",
"logo_url": "<string>",
"billing_email": "jsmith@example.com",
"notifications_email": "jsmith@example.com",
"metadata": {},
"rate_limit_overrides": {
"metadata": 20,
"data": 10,
"search": 10,
"upload": 5,
"compute": 5
},
"default_llm_credentials": {},
"nsfw_check_enabled": true,
"nsfw_fail_closed": true
}
'import requests
url = "https://api.mixpeek.com/v1/organizations"
payload = {
"organization_name": "<string>",
"logo_url": "<string>",
"billing_email": "jsmith@example.com",
"notifications_email": "jsmith@example.com",
"metadata": {},
"rate_limit_overrides": {
"metadata": 20,
"data": 10,
"search": 10,
"upload": 5,
"compute": 5
},
"default_llm_credentials": {},
"nsfw_check_enabled": True,
"nsfw_fail_closed": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
organization_name: '<string>',
logo_url: '<string>',
billing_email: 'jsmith@example.com',
notifications_email: 'jsmith@example.com',
metadata: {},
rate_limit_overrides: {metadata: 20, data: 10, search: 10, upload: 5, compute: 5},
default_llm_credentials: {},
nsfw_check_enabled: true,
nsfw_fail_closed: true
})
};
fetch('https://api.mixpeek.com/v1/organizations', 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/organizations",
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([
'organization_name' => '<string>',
'logo_url' => '<string>',
'billing_email' => 'jsmith@example.com',
'notifications_email' => 'jsmith@example.com',
'metadata' => [
],
'rate_limit_overrides' => [
'metadata' => 20,
'data' => 10,
'search' => 10,
'upload' => 5,
'compute' => 5
],
'default_llm_credentials' => [
],
'nsfw_check_enabled' => true,
'nsfw_fail_closed' => true
]),
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.mixpeek.com/v1/organizations"
payload := strings.NewReader("{\n \"organization_name\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"billing_email\": \"jsmith@example.com\",\n \"notifications_email\": \"jsmith@example.com\",\n \"metadata\": {},\n \"rate_limit_overrides\": {\n \"metadata\": 20,\n \"data\": 10,\n \"search\": 10,\n \"upload\": 5,\n \"compute\": 5\n },\n \"default_llm_credentials\": {},\n \"nsfw_check_enabled\": true,\n \"nsfw_fail_closed\": true\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.mixpeek.com/v1/organizations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"organization_name\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"billing_email\": \"jsmith@example.com\",\n \"notifications_email\": \"jsmith@example.com\",\n \"metadata\": {},\n \"rate_limit_overrides\": {\n \"metadata\": 20,\n \"data\": 10,\n \"search\": 10,\n \"upload\": 5,\n \"compute\": 5\n },\n \"default_llm_credentials\": {},\n \"nsfw_check_enabled\": true,\n \"nsfw_fail_closed\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/organizations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"organization_name\": \"<string>\",\n \"logo_url\": \"<string>\",\n \"billing_email\": \"jsmith@example.com\",\n \"notifications_email\": \"jsmith@example.com\",\n \"metadata\": {},\n \"rate_limit_overrides\": {\n \"metadata\": 20,\n \"data\": 10,\n \"search\": 10,\n \"upload\": 5,\n \"compute\": 5\n },\n \"default_llm_credentials\": {},\n \"nsfw_check_enabled\": true,\n \"nsfw_fail_closed\": true\n}"
response = http.request(request)
puts response.read_body{
"account_type": "pro",
"created_at": "2025-01-01T00:00:00Z",
"credit_count": 250000,
"logo_url": "https://www.google.com/s2/favicons?domain=acme.com&sz=128",
"organization_id": "org_demo123",
"organization_name": "Acme Corporation"
}{
"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.
Body
Partial update payload for organization metadata.
Updated display name for the organization.
Updated organization logo URL (e.g., custom logo to override auto-generated logo).
Updated billing contact email.
Set the opt-in single address that receives alert/system notifications (None leaves it unchanged via exclude_unset).
Replace metadata with provided dictionary when set.
Per-org rate-limit overrides (merged on top of tier defaults).
Show child attributes
Show child attributes
Map of provider names to secret names for org-wide LLM credentials.
Show child attributes
Show child attributes
Toggle NSFW upload classification + hard-reject for this organization. Applies only to SHARED-plane tenants (infrastructure is None). None leaves the current setting unchanged.
Toggle fail-closed behaviour for the NSFW gate (reject uploads when the classifier is unavailable instead of allowing them). None leaves the current setting unchanged.
Response
Successful Response
Response model for organization endpoints.
SECURITY: Does NOT expose internal_id to prevent leakage of high-entropy secrets. Only organization_id (public identifier) is included in API responses.
Account tier (2026-07 pricing overhaul).
Current tiers (CC-required, tier minimum is a billing floor): BUILD: $25/mo min — 100K objects/mo (managed) / 1M vectors (MVS) SCALE: $250/mo min — 1M objects/mo (managed) / 25M vectors (MVS) ENTERPRISE: Custom — dedicated compute, SLA
LEGACY tiers — still stored on unmigrated orgs; resolvable until the Phase-4 migration completes (do NOT remove before then — org records in Mongo carry these strings): FREE (→ Build or read-only), PRO (→ Build), TEAM (→ Scale)
build, scale, enterprise, free, pro, team Rate limits by operation type (requests per minute).
The rate limiting system uses 5 categories aligned with actual resource consumption:
Categories: metadata: Infrastructure and configuration operations (namespaces, collections, retrievers, taxonomies, clusters CRUD). Zero-credit operations with highest rate limits.
data: Data operations (objects, documents CRUD). Low-credit operations with high rate limits. search: Search and retrieval operations (retriever/taxonomy execution). Medium-credit operations with moderate rate limits. upload: File upload operations (credit-intensive: 1 credit/MB). Variable-credit operations with lower rate limits. compute: Compute operations (cluster execution, batch processing). High-credit operations (10 credits/min video) with lowest rate limits.
Rate Limit Strategy: Higher limits for low-cost operations (metadata, data) Lower limits for high-cost operations (upload, compute) This aligns API throttling with actual infrastructure costs
Examples: - Creating a namespace: Uses 'metadata' category (fast, cheap) - Uploading a file: Uses 'upload' category (slow, expensive per MB) - Executing a retriever: Uses 'search' category (moderate cost) - Running batch processing: Uses 'compute' category (very expensive)
Show child attributes
Show child attributes
Show child attributes
Show child attributes
True when this workspace must pick a plan before it can create namespaces or run billable work. When gated, write endpoints return 403 PlanRequiredError linking to https://studio.mixpeek.com/signup/plan where the workspace picks one.
True when this org is Mixpeek-internal (team/dogfood/ops), derived server-side at read time. Analytics consumers should exclude internal orgs from customer metrics.
Was this page helpful?

