curl --request GET \
--url https://api.usenexio.com/api/v1/conversation-instances/{instance_slug}/conversations/{conversation_id}/export \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.usenexio.com/api/v1/conversation-instances/{instance_slug}/conversations/{conversation_id}/export"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.usenexio.com/api/v1/conversation-instances/{instance_slug}/conversations/{conversation_id}/export', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"export_version": "<string>",
"generated_at": "2023-11-07T05:31:56Z",
"conversation": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"org_id": "<string>",
"environment": "<string>",
"instance_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"end_user": "<string>",
"title": "<string>",
"status": "active",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"messages": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"role": "user",
"turn_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"config_version_hash": "<string>",
"parent_message_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"content": [
{}
],
"created_at": "2023-11-07T05:31:56Z"
}
],
"config_versions": [
{
"hash": "<string>",
"released_version": "<string>"
}
],
"tool_events": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"turn_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tool_name": "<string>",
"execution": "<string>",
"outcome": "<string>",
"duration_ms": 123,
"created_at": "2023-11-07T05:31:56Z"
}
],
"guardrail_events": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"turn_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"config_version_hash": "<string>",
"rule_id": "<string>",
"decision": "<string>",
"created_at": "2023-11-07T05:31:56Z"
}
],
"annotations": [
{
"triage": {
"status": "<string>",
"owner": "<string>",
"reply": "<string>",
"revision": 123
},
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"conversation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"instance_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"turn_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rating": "good",
"source": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"end_user": "<string>",
"target": {},
"comment": "<string>",
"reason": "<string>",
"submitter_user_id": "<string>",
"submitter_id": "<string>",
"feedback_key": "<string>"
}
]
}{
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}{
"code": "unauthorized",
"message": "Missing or invalid API key"
}{
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}{
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}{
"code": "rate_limited",
"message": "Rate limit exceeded"
}{
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}{
"code": "auth_unavailable",
"message": "API key authentication is temporarily unavailable"
}{
"code": "request_timeout",
"message": "Request timed out"
}Export a conversation
Download a complete conversation, with every branch, tool event, guardrail decision, and annotation, as one JSON document.
curl --request GET \
--url https://api.usenexio.com/api/v1/conversation-instances/{instance_slug}/conversations/{conversation_id}/export \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.usenexio.com/api/v1/conversation-instances/{instance_slug}/conversations/{conversation_id}/export"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.usenexio.com/api/v1/conversation-instances/{instance_slug}/conversations/{conversation_id}/export', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"export_version": "<string>",
"generated_at": "2023-11-07T05:31:56Z",
"conversation": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"org_id": "<string>",
"environment": "<string>",
"instance_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"end_user": "<string>",
"title": "<string>",
"status": "active",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"messages": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"role": "user",
"turn_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"config_version_hash": "<string>",
"parent_message_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"content": [
{}
],
"created_at": "2023-11-07T05:31:56Z"
}
],
"config_versions": [
{
"hash": "<string>",
"released_version": "<string>"
}
],
"tool_events": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"turn_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tool_name": "<string>",
"execution": "<string>",
"outcome": "<string>",
"duration_ms": 123,
"created_at": "2023-11-07T05:31:56Z"
}
],
"guardrail_events": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"turn_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"config_version_hash": "<string>",
"rule_id": "<string>",
"decision": "<string>",
"created_at": "2023-11-07T05:31:56Z"
}
],
"annotations": [
{
"triage": {
"status": "<string>",
"owner": "<string>",
"reply": "<string>",
"revision": 123
},
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"conversation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"instance_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"turn_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rating": "good",
"source": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"end_user": "<string>",
"target": {},
"comment": "<string>",
"reason": "<string>",
"submitter_user_id": "<string>",
"submitter_id": "<string>",
"feedback_key": "<string>"
}
]
}{
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}{
"code": "unauthorized",
"message": "Missing or invalid API key"
}{
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}{
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}{
"code": "rate_limited",
"message": "Rate limit exceeded"
}{
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}{
"code": "auth_unavailable",
"message": "API key authentication is temporarily unavailable"
}{
"code": "request_timeout",
"message": "Request timed out"
}Authorizations
Send the key as Authorization: Bearer <key>. Two kinds of key exist.
Organization keys are issued in the portal (Settings, then API keys),
each bound to one environment, shaped nx_<environment slug>_<64 hex>. They carry
no capabilities and pass every capability check, with one exception:
routes under /api/v1/records, /api/v1/engines/{id}/opportunities,
/api/v1/graph and /api/v1/catalog/documents accept an
organization key only when its environment is live, and refuse any
other with 403 scoped_key_required. Revocation takes effect within 60
seconds.
Scoped keys are issued by Nexio on request, shaped
nxsk_v1_<24 hex key id>_<43 character secret>. Each is bound to one
org, one environment, a set of engines and a set of capabilities. A
malformed, unknown or revoked nxsk_ key fails with 401 and is never
retried as an organization key. Revocation takes effect on the next
request. A scoped key without a route's capability gets 403
insufficient_capability; a scoped key not bound to the engine gets 403
engine_binding_forbidden.
Key-grantable capabilities: engines:read, runs:write, runs:read,
runs:defensibility:read, runs:test, catalog:read,
catalog:documents:read, webhooks:manage, conversations:use,
conversations:export, records:read, records:opportunities:run,
actions:write, actions:read, graph:read, records:analyze.
Routes that accept organization keys only (every scoped key gets 403
insufficient_capability): environment management, engine create,
update, configuration and publish, and conversation instance
authoring. Each operation description names the capability a scoped
key needs.
Path Parameters
Conversation instance identifier slug (e.g. platform-assistant).
Query Parameters
The asserted end-user identity the conversation must belong to.
Response
The complete export document.
Export document contract version. Currently "1".
Hide child attributes
Hide child attributes
active, archived The complete transcript in insertion order. An export is
an audit artifact, so it keeps EVERY version of a revised
message, not only the branch the conversation serves;
parent_message_id records how the versions relate.
Hide child attributes
Hide child attributes
user, assistant The message this one follows on its branch; null when it starts the conversation.
In the order they were recorded, oldest first.
In the order they were recorded, oldest first.
Every non-retracted annotation on the conversation, API and portal submitted, newest first.
Hide child attributes
Hide child attributes
How the platform team is handling this feedback: status,
owner, reply and revision. Read-only and always present. A
new annotation reads {"status": "new", "owner": "", "reply": "", "revision": 0}.
good, bad, neutral Capture surface, e.g. api or portal.
The conversation's end user; omitted when unset.
Optional JSON sub-target inside the turn; omitted when unset.
Optional free-text comment; omitted when unset.
Optional structured reason token; omitted when unset.
Portal (WorkOS) submitter; omitted for API submissions.
Consumer-side submitter identifier; omitted when unset.
Replay-safe logical signal key; omitted when unset.