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
  1. Voice platformYour applicationcall-start (ringing)
  2. Your applicationNorthsunPOST /v1/recall_and_enrich
  3. NorthsunYour application200 · caller + memory + enrichment · timing_ms
  4. Your applicationVoice platformagent’s first sentence — already knowing
  5. Voice platformYour applicationcall-end (hangup)
  6. Your applicationNorthsunPOST /v1/calls/end (transcript, outcome)
  7. NorthsunYour application204 · committed to the database
  1. 01Ringphone in
  2. 02Twilio Lookupline signals
  3. 03Trestleidentity signals
  4. 04RecallNorthsun
  5. 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.

jsonPOST /v1/recall_and_enrich · illustrative
{
  "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.

caller

The profile: who this number is to this tenant. Tenant-scoped, never pooled.

memory

Prior-call history, newest first. Ordered, inspectable, predictable — not a black-box ranking.

enrichment

What Trestle and Twilio Lookup can add for this number, when available.

json200 response · illustrative
// 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.

  1. hangup
  2. POST /v1/calls/end
  3. interaction committed to the database
  4. 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.

jsontiming_ms · illustrative
// 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 shipped

Memory 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.