Trace format
SellTraces normalizes source-specific conversations into a shared trace shape before ingest. The public API accepts normalized JSON traces throughPOST /api/ingest.
Minimal accepted shape
Each trace must include a source, source id, creation time, and messages.POST /api/ingest.
Supported sources
The current normalized source values are:| Source | Meaning |
|---|---|
claude_export | Claude web export ZIP |
chatgpt_export | ChatGPT web export ZIP |
claude_code_jsonl | Claude Code local JSONL |
cursor_sqlite | Cursor SQLite state |
codex_jsonl | Codex CLI session data |
gemini_cli | Gemini CLI local traces |
opencode | OpenCode local traces |
local_trace_index | Local trace index database |
Extended fields
The ingest package also supports richer V2 trace metadata when a source can provide it:schemaVersion,conversationId,sessionId,parentTraceIdprovider,client,agent,modelVersionsystemPrompt,toolsAvailable,contentBlocksenvironmentwith cwd, git, OS, shell, permission, and sandbox fields- timing and usage details
outcomeandtrajectorydetails for coding-agent sessionsconsent,license,piiScrub, andoriginalHashprovenance fields- quality, domain, language, difficulty, and task metadata
Message roles
Messages use one of:systemuserassistanttool
content is the plain text used for token counts, search, dedupe, and generated OpenAPI validation. Rich sources may also include structured contentBlocks.
Deduplication fields
source plus sourceId provides source-level idempotency. originalHash provides content-level dedupe. If originalHash is absent, the server computes a hash from normalized role/content text.
Within one ingest batch, duplicate source keys or duplicate content hashes are rejected before DB insert. Across persisted traces, duplicates refresh nullable metadata on the canonical trace instead of creating another trace row.