persona_assign— which of 5 sales archetypes does this rep most resemble?methodology_assign— what primary + secondary methodology do they use?synthesis— coaching summary with strengths, gaps, action plan, score trends
/intel-jobs/:job_id endpoint until complete, and writes a result that’s queryable via dedicated GET endpoints (/persona, /methodology, /synthesis/latest).
When to run each
| Job | Cadence | When in the rep’s lifecycle |
|---|---|---|
persona_assign | Once on onboarding, then quarterly | After 5+ analyses exist for the rep |
methodology_assign | Once on onboarding, then quarterly | After 5+ analyses exist for the rep |
synthesis | Weekly or on-demand | Anytime the rep has 3+ recent calls |
The analysis_ids vs recording_urls decision
Both async jobs accept either an explicit list of analysis UUIDs or a list of recording URLs. Pick based on what you have:
analysis_ids— much faster (~15–30s). The analyses are already complete; the job only does the meta-step. Use this when the rep has historical analyses already.recording_urls— slower (potentially several minutes). Each URL is run through the analysis pipeline first (with 30-day URL caching), then the meta-step runs. Use this for fresh onboarding when no analyses exist yet.
Example: assign a persona from existing analyses
{ job_id, status: "queued", created_at }.
Polling the job
status === "completed", result contains the assignment:
Reading the assignment later
/persona/assign writes to persona_assignments. To read the latest at any time:
/persona/history.
Manual override
If a manager knows the rep better than the model:source: "manual". The previous AI assignment is preserved in history but no longer the “current” one.
Methodology — same shape, different output
Replace/persona/ with /methodology/ and the response shape becomes { primary, secondary }:
secondary may be null.
Synthesis — the coaching report
Synthesis takes eitherlookback_count (newest N analyses) or analysis_ids:
/synthesis/latest. History at /synthesis.
Webhooks for these jobs
Subscribe to:persona.assigned— whenpersona_assigncompletesmethodology.assigned— whenmethodology_assigncompletesprofile.synthesized— whensynthesiscompletes
{ org_id, rep_id, job_id, result }. See the webhooks guide.
Doing this from MCP
assign_rep_persona, polls, then generate_rep_synthesis, polls, and renders both for you.
Cost + latency reference
| Job | Path | Latency | Cost |
|---|---|---|---|
persona_assign | analysis_ids | 15–30s | ~$0.01 |
persona_assign | recording_urls | 30s × N + 15–30s | ~0.01 |
methodology_assign | analysis_ids | 15–30s | ~$0.01 |
methodology_assign | recording_urls | 30s × N + 15–30s | ~0.01 |
synthesis | analysis_ids / lookback_count | 20–40s | ~$0.02 |

