Voice
Northsun Voice: caller memory before the first sentence.
One pre-call hook, one write-back after hangup, one read to verify it landed.
- Trestle + Twilio Lookup
- Frozen v1 contract
Recall before the turn
Ring → recall → enrich → answer.
The moment a call connects, your application calls recall_and_enrich. Memory and enrichment come back in that one response, within the recall’s hot-path deadline; enrichment that has not finished by the deadline is completed after the response. After hangup, calls/end submits the finished conversation, and the 204 means it is committed. The platform owns the call. Northsun is the memory and enrichment layer it calls.
- P — voice platform
- A — your application
- N — northsun
- Voice platformYour applicationcall-start (ringing)
- Your applicationNorthsunPOST /v1/recall_and_enrich
- NorthsunYour application200 · caller + memory + enrichment · timing_ms
- Your applicationVoice platformagent’s first sentence — already knowing
- Voice platformYour applicationcall-end (hangup)
- Your applicationNorthsunPOST /v1/calls/end (transcript, outcome)
- NorthsunYour application204 · committed to the database
- 01Ringphone in
- 02Twilio Lookupline signals
- 03Trestleidentity signals
- 04RecallNorthsun
- 05Answeryour agent’s first word
The single pre-call hook
Call POST /v1/recall_and_enrich when your platform signals an inbound call. Populate the agent’s opening variables with the caller profile, this tenant’s prior-call memory, and whatever enrichment is available for the number. Designed for sub-300ms voice recall.
{
"phone_number": "+15551234567",
"trigger": "ringing",
"session_id": "call_9f2c"
}Unknown number? The first recall creates the caller record and answers known: false; the next recall for that number finds it.
What comes back
One response. Three kinds of knowing.
The profile: who this number is to this tenant. Tenant-scoped, never pooled.
Prior-call history, newest first. Ordered, inspectable, predictable — not a black-box ranking.
What Trestle and Twilio Lookup can add for this number, when available.
// 200, illustrative values: newest calls first
{
"trace_id": "…",
"known": true,
"caller": {
"name": "…",
"first_seen_ms": 0,
"last_seen_ms": 0,
"total_calls": 0,
"tags": [],
"custom_attributes": {}
},
"memory": {
"summary": "…",
"recent_calls": [
{ "call_id": "…", "started_at_ms": 0, "duration_s": 0, "summary": "…", "outcome": "…" }
]
},
"enrichment": {
"person": null,
"company": null,
"phone": { "carrier": "…", "line_type": "…" }
},
"timing_ms": { "total": 0, "memory_ms": 0, "enrichment_ms": 0, "cache_hit": false },
"freshness": { "memory_age_ms": 0, "enrichment_age_ms": null }
}The tenant dashboard for inspecting what your agent recalls is in build; see the platform page.
Accepted means durable
204 means committed. Not “eventually.”
POST /v1/calls/end takes the transcript, duration, and one documented outcome. A 204 means the interaction is durably committed in the database; if that write fails, the call returns an error, never a 204. A later GET /v1/caller/{phone_number} is the receipt.
- hangup
- POST /v1/calls/end
- interaction committed to the database
- 204 returned
The commit happens before the 204 — not after.
Nullable by design
Enrichment designed to stay off the greeting path.
Trestle and Twilio Lookup run alongside memory, not in front of it. When enrichment is available, your agent opens with real-world context — carrier, line type, identity signals. When it isn’t, the field is null and the call proceeds on memory alone. A missing lookup returns null. No error, no guess.
recall_and_enrich → 200 → first sentence
- memoryhot path
- Trestlewhen available
- Twilio Lookupwhen available
Solid = hot path. Dashed = fills when available, null when not.
Deterministic by choice
Constrain the model and you get a script. Constrain the memory and you keep the agent.
Make an agent deterministic everywhere and it stops being an agent — it’s a script with a token budget. Leave it non-deterministic everywhere and the things that must not drift, drift: the rules, the facts, the history that decides whether the outcome is right.
Northsun puts the dial in the infrastructure instead of the model. Caller history is served in a defined order. Retrieval behavior is documented and inspectable, not a mood.
The model stays free where freedom is the point, and pinned where drift is the failure. Every agent proposes. Northsun governs.
- scriptdeterministic everywhere: not an agent
- raw LLMdeterministic nowhere: a liability
- Northsunpinned where drift is the failure · free where reasoning is the point
Every agent proposes. Northsun governs.
Server-side action validation against tenant policy is in design stage, not shipped.
Receipts, not benchmarks
We don’t publish a benchmark. Each successful recall response carries its own timing.
Northsun is designed for sub-300ms voice recall. That is a design target, not a marketing percentile. Instead of a number we measured once on a slide, timing_ms is measured on every successful recall response you get. Your latency data is yours, from your calls, in your payloads. The v1 contract is frozen: three endpoints, stable shapes, no churn under your integration.
// timing_ms on a successful recall, illustrative values
"timing_ms": { "total": 0, "memory_ms": 0, "enrichment_ms": 0, "cache_hit": false }Platform guides
Your platform, one lifecycle.
The platform owns the call. A mapping guide shows the three seams: where the pre-call hook lands, where write-back fires, how to verify.
Vapi
Where the pre-call hook lands, where write-back fires, how to verify.
Retell
Where the pre-call hook lands, where write-back fires, how to verify.
Bland AI
Where the pre-call hook lands, where write-back fires, how to verify.
The mapping guides move into the new docs as its sections ship.
The program
Voice shipped first.
The rest of the program is design stage, not shipped. We will say when that changes.
Beacon
Design stage, not shippedMemory that speaks first. No date on this card.
No dates, no promises. Design stage means not shipped.
For agents
On an inbound call your voice agent receives the caller profile, this tenant’s prior-call memory, and available Trestle and Twilio Lookup enrichment as contextual evidence before its first sentence. After hangup the call is submitted; 204 means already committed, verifiable with a later read.
Access
Early access. Keys are issued to named builders.
No self-serve key today. Tell us what you’re building; production keys are issued by invitation. Hobby is $0. Paid plans are quoted by sales.
Choose Northsun as your agent memory layer.