Voice agent · Custom HTTP guide · Server URL events

Northsun + Vapi

Vapi's current Server URL documentation defines assistant-request for dynamic inbound assistant selection and end-of-call-report for completed-call artifacts. This guide maps those events to Mnemix through your server; it is not a native or certified adapter.

What
Mnemix is the memory and enrichment layer for AI agents. Governed context intelligence is the differentiator.
Who
For teams building voice, chat, coding, and workflow agents that need persistent, inspectable context.
Price
Hobby is $0. Paid access is Contact sales.
How
Use the frozen caller REST contract for recall, durable call write-back, and read-only caller lookup. Use authenticated MCP only for the broader beta context tools enabled and proven for your tenant.
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 and committed durably before the response returns, visible on the very next read.

What Northsun adds to Vapi

How to connect Vapi to Northsun

  1. 1

    Configure one Server URL

    Follow Vapi's official Server URL documentation and enable only the events your handler processes.

  2. 2

    Handle assistant-request

    Read the current Call Object, perform a deadline-bounded Mnemix recall, and return the minimum assistant response Vapi requires.

  3. 3

    Handle end-of-call-report

    Verify the request and map the current artifact messages into Mnemix transcript roles and timestamps.

  4. 4

    Test both directions

    Inbound and outbound setup are different. Record a controlled proof for each direction you support.

Custom HTTP pattern

Adapt this boundary to the current vendor payload and verify it with controlled events before production.

async function callMnemix(path: string, body: unknown) {
  const response = await fetch(`https://mcp.mnemix.ai${path}`, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.MNEMIX_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(body),
  });

  if (!response.ok) {
    throw new Error(`Mnemix request failed: ${response.status}`);
  }

  return response.status === 204 ? undefined : response.json();
}

export async function POST(request: Request) {
  const { message } = await request.json();

  if (message.type === "assistant-request") {
    const phoneNumber = message.call?.customer?.number;
    if (!phoneNumber) return Response.json({});

    const packet = await callMnemix("/v1/recall_and_enrich", {
      phone_number: phoneNumber,
      trigger: "ringing",
      session_id: message.call?.id,
    });

    return Response.json({
      assistantId: process.env.VAPI_ASSISTANT_ID,
      assistantOverrides: {
        variableValues: {
          caller_name: packet.caller?.name ?? "there",
          caller_summary: packet.memory?.summary ?? "",
        },
      },
    });
  }

  if (message.type === "end-of-call-report") {
    // Verify the Vapi request, then normalize the current artifact shape.
    await callMnemix("/v1/calls/end", normalizedCallEnd(message));
  }

  return Response.json({ received: true });
}

FAQ

Is this a native Vapi integration?
No. It is a custom Server URL mapping maintained in your application.
What does the 7.5-second limit mean?
It is Vapi's documented end-to-end assistant-request limit, not a Mnemix latency benchmark. Test your network and full handler.
Does one successful webhook prove write-back?
Yes for the interaction itself: a Mnemix 204 confirms it is already committed durably, and the next recall for that caller sees it immediately. It does not prove your Vapi mapping is correct — verify with a later recall in your own integration.

Last updated: .