curl --request POST \
--url https://api.mixpeek.com/v1/taxonomies/{taxonomy_id}/analytics/paths \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Namespace: <api-key>' \
--data '
{
"collection_id": "<string>",
"taxonomy_id": "<string>",
"from_step": "<string>",
"to_step": "<string>",
"max_path_length": 10,
"min_support": 5,
"max_window_days": 123,
"filters": {}
}
'import requests
url = "https://api.mixpeek.com/v1/taxonomies/{taxonomy_id}/analytics/paths"
payload = {
"collection_id": "<string>",
"taxonomy_id": "<string>",
"from_step": "<string>",
"to_step": "<string>",
"max_path_length": 10,
"min_support": 5,
"max_window_days": 123,
"filters": {}
}
headers = {
"Authorization": "Bearer <token>",
"X-Namespace": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'X-Namespace': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
collection_id: '<string>',
taxonomy_id: '<string>',
from_step: '<string>',
to_step: '<string>',
max_path_length: 10,
min_support: 5,
max_window_days: 123,
filters: {}
})
};
fetch('https://api.mixpeek.com/v1/taxonomies/{taxonomy_id}/analytics/paths', 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_id}/analytics/paths",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'collection_id' => '<string>',
'taxonomy_id' => '<string>',
'from_step' => '<string>',
'to_step' => '<string>',
'max_path_length' => 10,
'min_support' => 5,
'max_window_days' => 123,
'filters' => [
]
]),
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_id}/analytics/paths"
payload := strings.NewReader("{\n \"collection_id\": \"<string>\",\n \"taxonomy_id\": \"<string>\",\n \"from_step\": \"<string>\",\n \"to_step\": \"<string>\",\n \"max_path_length\": 10,\n \"min_support\": 5,\n \"max_window_days\": 123,\n \"filters\": {}\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.mixpeek.com/v1/taxonomies/{taxonomy_id}/analytics/paths")
.header("Authorization", "Bearer <token>")
.header("X-Namespace", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"collection_id\": \"<string>\",\n \"taxonomy_id\": \"<string>\",\n \"from_step\": \"<string>\",\n \"to_step\": \"<string>\",\n \"max_path_length\": 10,\n \"min_support\": 5,\n \"max_window_days\": 123,\n \"filters\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/taxonomies/{taxonomy_id}/analytics/paths")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["X-Namespace"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"collection_id\": \"<string>\",\n \"taxonomy_id\": \"<string>\",\n \"from_step\": \"<string>\",\n \"to_step\": \"<string>\",\n \"max_path_length\": 10,\n \"min_support\": 5,\n \"max_window_days\": 123,\n \"filters\": {}\n}"
response = http.request(request)
puts response.read_body{
"from_step": "<string>",
"to_step": "<string>",
"total_sequences": 123,
"completed_sequences": 123,
"completion_rate": 0.5,
"paths": [
{
"path": [
"inquiry",
"followup",
"closed_won"
],
"count": 1,
"percentage": 50,
"avg_duration_sec": 123
}
]
}{
"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
}Analyze multi-step transition paths
Discover the most common multi-step paths documents take between two taxonomy steps.
Unlike the /transitions endpoint which only analyzes direct A→B transitions,
this endpoint reveals the intermediate steps documents actually take.
Use Cases
Email Thread Analysis:
- Question: What paths do emails take from “inquiry” to “closed_won”?
- Discover: Some go inquiry → followup → proposal → closed_won
- Discover: Others skip steps: inquiry → proposal → closed_won
- Discover: Fast track: inquiry → closed_won
Content Editorial Paths:
- Question: Common paths from “draft” to “published”?
- Discover: draft → review → edit → review → published
- Discover: draft → review → published (expedited)
- Discover: Paths that loop back (draft → review → draft → review)
Compliance Resolution Paths:
- Question: How do violations get resolved?
- Discover: violation → investigated → remediated → resolved
- Discover: violation → false_positive → closed
- Discover: Escalation paths: violation → escalated → legal_review → resolved
Requirements
- Taxonomy must have
step_analyticsconfigured - Collection must contain documents with timestamp and sequence_id fields
Returns
Completion Metrics:
total_sequences: Sequences starting at from_stepcompleted_sequences: Number reaching to_stepcompletion_rate: Percentage that completed
Paths (sorted by frequency):
path: Ordered sequence of stepscount: Number of sequences following this pathpercentage: Percentage of completing sequencesavg_duration_sec: Average time for this path
Example Request
{
"collection_id": "col_emails",
"taxonomy_id": "tax_sales_stages",
"from_step": "inquiry",
"to_step": "closed_won",
"max_path_length": 10,
"min_support": 5
}
Example Response
{
"from_step": "inquiry",
"to_step": "closed_won",
"total_sequences": 1000,
"completed_sequences": 350,
"completion_rate": 0.35,
"paths": [
{
"path": ["inquiry", "followup", "proposal", "closed_won"],
"count": 120,
"percentage": 34.3,
"avg_duration_sec": 604800.0
},
{
"path": ["inquiry", "proposal", "closed_won"],
"count": 90,
"percentage": 25.7,
"avg_duration_sec": 432000.0
},
{
"path": ["inquiry", "closed_won"],
"count": 70,
"percentage": 20.0,
"avg_duration_sec": 172800.0
}
]
}
Path Interpretation
Length Analysis:
- Shorter paths indicate efficient progression
- Longer paths may indicate complexity or bottlenecks
- Loops (repeated steps) indicate rework or revisions
Duration Analysis:
- Compare avg_duration_sec across paths
- Shorter paths may not always be faster
- Identify optimization opportunities
Frequency Analysis:
- High-percentage paths are “happy paths”
- Low-percentage paths may be edge cases or exceptions
- Missing expected paths indicate drop-off points
curl --request POST \
--url https://api.mixpeek.com/v1/taxonomies/{taxonomy_id}/analytics/paths \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Namespace: <api-key>' \
--data '
{
"collection_id": "<string>",
"taxonomy_id": "<string>",
"from_step": "<string>",
"to_step": "<string>",
"max_path_length": 10,
"min_support": 5,
"max_window_days": 123,
"filters": {}
}
'import requests
url = "https://api.mixpeek.com/v1/taxonomies/{taxonomy_id}/analytics/paths"
payload = {
"collection_id": "<string>",
"taxonomy_id": "<string>",
"from_step": "<string>",
"to_step": "<string>",
"max_path_length": 10,
"min_support": 5,
"max_window_days": 123,
"filters": {}
}
headers = {
"Authorization": "Bearer <token>",
"X-Namespace": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'X-Namespace': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
collection_id: '<string>',
taxonomy_id: '<string>',
from_step: '<string>',
to_step: '<string>',
max_path_length: 10,
min_support: 5,
max_window_days: 123,
filters: {}
})
};
fetch('https://api.mixpeek.com/v1/taxonomies/{taxonomy_id}/analytics/paths', 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_id}/analytics/paths",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'collection_id' => '<string>',
'taxonomy_id' => '<string>',
'from_step' => '<string>',
'to_step' => '<string>',
'max_path_length' => 10,
'min_support' => 5,
'max_window_days' => 123,
'filters' => [
]
]),
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_id}/analytics/paths"
payload := strings.NewReader("{\n \"collection_id\": \"<string>\",\n \"taxonomy_id\": \"<string>\",\n \"from_step\": \"<string>\",\n \"to_step\": \"<string>\",\n \"max_path_length\": 10,\n \"min_support\": 5,\n \"max_window_days\": 123,\n \"filters\": {}\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.mixpeek.com/v1/taxonomies/{taxonomy_id}/analytics/paths")
.header("Authorization", "Bearer <token>")
.header("X-Namespace", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"collection_id\": \"<string>\",\n \"taxonomy_id\": \"<string>\",\n \"from_step\": \"<string>\",\n \"to_step\": \"<string>\",\n \"max_path_length\": 10,\n \"min_support\": 5,\n \"max_window_days\": 123,\n \"filters\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/taxonomies/{taxonomy_id}/analytics/paths")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["X-Namespace"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"collection_id\": \"<string>\",\n \"taxonomy_id\": \"<string>\",\n \"from_step\": \"<string>\",\n \"to_step\": \"<string>\",\n \"max_path_length\": 10,\n \"min_support\": 5,\n \"max_window_days\": 123,\n \"filters\": {}\n}"
response = http.request(request)
puts response.read_body{
"from_step": "<string>",
"to_step": "<string>",
"total_sequences": 123,
"completed_sequences": 123,
"completion_rate": 0.5,
"paths": [
{
"path": [
"inquiry",
"followup",
"closed_won"
],
"count": 1,
"percentage": 50,
"avg_duration_sec": 123
}
]
}{
"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
Body
API request model for multi-step path analysis.
Discovers the most common sequences of intermediate steps documents take when progressing from from_step to to_step.
Unlike the transitions endpoint which only analyzes direct A→B progressions, this endpoint reveals the actual paths taken (e.g., A → X → Y → B).
Example:
json { "collection_id": "col_emails", "taxonomy_id": "tax_sales_stages", "from_step": "inquiry", "to_step": "closed_won", "max_path_length": 10, "min_support": 5 }
Response includes: - Most common paths sorted by frequency - Count and percentage for each path - Average duration per path
Collection to analyze
Taxonomy ID
Starting step
Ending step
Maximum number of steps in a path
2 <= x <= 20Minimum sequences required to include a path
x >= 1Maximum duration for path completion (in days)
Optional event filters
Response
Successful Response
API response model for multi-step path analysis.
Contains discovered transition paths with frequency and duration statistics.
Example Response:
json { "from_step": "inquiry", "to_step": "closed_won", "total_sequences": 1000, "completed_sequences": 350, "completion_rate": 0.35, "paths": [ { "path": ["inquiry", "followup", "proposal", "closed_won"], "count": 120, "percentage": 34.3, "avg_duration_sec": 604800.0 }, { "path": ["inquiry", "proposal", "closed_won"], "count": 90, "percentage": 25.7, "avg_duration_sec": 432000.0 }, { "path": ["inquiry", "closed_won"], "count": 70, "percentage": 20.0, "avg_duration_sec": 172800.0 } ] }
Total sequences that started at from_step
Number of sequences that reached to_step
Percentage that completed the path
0 <= x <= 1List of paths sorted by frequency (most common first)
100Show child attributes
Show child attributes
Was this page helpful?

