curl --request POST \
--url https://api.mixpeek.com/v1/manifest/lint \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form manifest_file='@example-file'import requests
url = "https://api.mixpeek.com/v1/manifest/lint"
files = { "manifest_file": ("example-file", open("example-file", "rb")) }
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('manifest_file', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.mixpeek.com/v1/manifest/lint', 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/manifest/lint",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"manifest_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$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/manifest/lint"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"manifest_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.mixpeek.com/v1/manifest/lint")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"manifest_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/manifest/lint")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"manifest_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"results": [
{
"code": "UNUSED_COLLECTION",
"location": "collections[2]",
"message": "Collection 'orphan_data' is not referenced by any retriever",
"severity": "warning",
"suggestion": "Add a retriever that uses this collection or remove it"
}
],
"summary": {
"error": 0,
"info": 0,
"warning": 1
},
"valid": true
}{
"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
}Lint Manifest
Lint a YAML manifest for best practices and potential issues.
Goes beyond basic validation to provide actionable suggestions for improving your manifest configuration. This endpoint is designed for AI agents and developers who want to optimize their Mixpeek setup.
Lint Rules:
UNUSED_EXTRACTOR: Feature extractor defined but not used by any collectionUNUSED_COLLECTION: Collection not referenced by any retrieverMISSING_INPUT_SCHEMA: Retriever uses templates but has no input_schemaMISSING_CACHE_CONFIG: Retriever without caching (especially with LLM stages)SUBOPTIMAL_STAGE_ORDER: Filter stages after expensive operationsDUPLICATE_FEATURE_URI: Same feature searched multiple timesMISSING_DESCRIPTION: Resources without descriptionsNO_SEARCH_STAGE: Retriever with no search stagesEXTRACTOR_NOT_IN_NAMESPACE: Collection uses extractor not in namespaceMISSING_SECRET: Secret reference not configured
Severity Levels:
error: Must be fixed before applyingwarning: Best practice violation, should be fixedinfo: Suggestion for improvement
Example:
curl -X POST /v1/manifest/lint \
-H "Authorization: Bearer $API_KEY" \
-F "manifest_file=@mixpeek.yaml"
Response includes actionable suggestions:
{
"valid": true,
"results": [
{
"code": "MISSING_CACHE_CONFIG",
"severity": "warning",
"message": "Retriever 'product_search' has no cache configuration",
"location": "retrievers[0]",
"suggestion": "Add cache_config to improve performance",
"fix_example": "cache_config:\n enabled: true\n ttl_seconds: 3600"
}
],
"summary": {"error": 0, "warning": 1, "info": 0}
}
curl --request POST \
--url https://api.mixpeek.com/v1/manifest/lint \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form manifest_file='@example-file'import requests
url = "https://api.mixpeek.com/v1/manifest/lint"
files = { "manifest_file": ("example-file", open("example-file", "rb")) }
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('manifest_file', '<string>');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.mixpeek.com/v1/manifest/lint', 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/manifest/lint",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"manifest_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$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/manifest/lint"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"manifest_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.mixpeek.com/v1/manifest/lint")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"manifest_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/manifest/lint")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"manifest_file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"results": [
{
"code": "UNUSED_COLLECTION",
"location": "collections[2]",
"message": "Collection 'orphan_data' is not referenced by any retriever",
"severity": "warning",
"suggestion": "Add a retriever that uses this collection or remove it"
}
],
"summary": {
"error": 0,
"info": 0,
"warning": 1
},
"valid": true
}{
"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.
Query Parameters
Rule codes to skip (e.g., MISSING_DESCRIPTION)
Body
YAML manifest file
Response
Successful Response
Response from the lint endpoint.
Example: { "valid": true, "results": [...], "summary": {"error": 0, "warning": 2, "info": 3} }
Was this page helpful?

