Skip to main content
This guide walks through submitting your first analysis, polling it to completion, and reading the result. We’ll start with mock fixtures (free, instant) and end with real audio.

What you need

  • A sandbox API key (pk_sandbox_…)
  • An HTTP client (curl, Postman, or your language’s HTTP library)

Step 1 — Mock fixture (free, ~1 second)

Submit a deterministic test analysis. No real audio required.
You get back a 202 with the queued job:
Org and rep are created automatically if they don’t exist yet. You don’t need to call POST /v1/orgs first for analyses to work.

Step 2 — Poll until complete

status will progress: queuedprocessingcompleted. Mock fixtures usually complete in under a second. When status === "completed", the response includes the full analysis. The same shape comes back for mock://* fixtures and real audio — write your decoder once.

Decoding tips

  • Six pillars: clarity, influence, objection, discovery, delivery, close. Each appears as a flat *_score field (0–100) AND inside feedback_v5.<pillar> with positive + negative strings.
  • overall_score is the rounded average of the six pillars — computed server-side, not from the model.
  • KPIs (questions_asked, filler_word_count, words_per_minute) are flat at the top of analysis. Not nested under kpis.
  • feedback_v5 + action_plan_v5 keep the _v5 suffix so future revisions can ship _v6 without breaking decoders.
  • ai_summary and ai_summary_v5 carry the same string today. Use either.

Step 3 — Real audio

Replace the mock URL with a publicly reachable HTTPS URL to an audio file:
Requirements for the URL:
  • HTTPS (no plain HTTP)
  • No additional auth headers required (pre-signed S3 / GCS URLs are perfect)
  • Codec: MP3, WAV, M4A, or FLAC
  • Length: 10 seconds to 60 minutes
Latency: typically 30–90 seconds end-to-end for a 5-minute call.

Step 4 — Stop polling, use webhooks

Polling works for prototyping but isn’t sustainable for production. Register a webhook once and Parlay will notify you when each analysis completes:
The response includes a signing_secret (shown once — store it). Verify every webhook with HMAC-SHA256. See the webhooks guide.

Common pitfalls

Parlay fetches the file from the URL you provide. If the URL requires auth (Authorization header, custom token), it will fail. Use a pre-signed URL instead.
org_id + rep_id + recording_url does NOT deduplicate. Use Idempotency-Key with the same value on retries to avoid duplicates.
Treat these like foreign keys, not display names. Pass stable opaque identifiers from your system:Once you set rep_id for a person, treat it as immutable. If it changes, all historical analyses still reference the old value — there’s no built-in “rename” operation today.Querying without org_id: GET /v1/analyses?rep_id=... resolves the rep partner-wide. If the same rep_id exists under multiple orgs, you’ll get a 400 ambiguous_rep_id — pass org_id to disambiguate. Solo-rep partners (one default org) never hit this.
Likely the audio is corrupt or unreachable. Call GET /v1/analyses/:id and check the error field. The crash recovery scanner marks stuck jobs failed automatically after 10 min.
Parlay caps at 60 minutes. For longer calls, split before upload. There’s no built-in concatenation across analyses (yet).

What’s next

Rep intelligence

Persona, methodology, and synthesis at scale

Webhooks

Stop polling — get notified