Voice agent · Custom HTTP guide · Inbound webhook + signed call events

Northsun + Retell AI

Retell documents an inbound webhook that can supply string dynamic variables before an inbound call connects, plus signed call-event webhooks including call_analyzed. This guide maps those capabilities to Mnemix through your server; no native adapter is implied.

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 Retell AI

How to connect Retell AI to Northsun

  1. 1

    Configure the inbound webhook

    Follow Retell's current phone-number configuration and preserve its documented 10-second timeout and retry behavior in your design.

  2. 2

    Return string variables

    Call Mnemix with from_number and return only string-valued dynamic_variables used by the agent.

  3. 3

    Configure signed call events

    Enable the event you need, verify x-retell-signature, and normalize the current Call Object into Mnemix's calls/end schema.

  4. 4

    Test failure fallbacks

    Prove how the call behaves when Mnemix returns partial enrichment, a timeout, or a retryable server error.

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) {
  // Verify x-retell-signature before trusting this body.
  const payload = await request.json();

  if (payload.event === "call_inbound") {
    const phoneNumber = payload.call_inbound?.from_number;
    const packet = await callMnemix("/v1/recall_and_enrich", {
      phone_number: phoneNumber,
      trigger: "ringing",
    });

    return Response.json({
      call_inbound: {
        dynamic_variables: {
          caller_name: String(packet.caller?.name ?? "there"),
          caller_summary: String(packet.memory?.summary ?? ""),
        },
      },
    });
  }

  if (payload.event === "call_analyzed") {
    await callMnemix("/v1/calls/end", normalizedCallEnd(payload.call));
  }

  return new Response(null, { status: 204 });
}

FAQ

Is this a native Retell integration?
No. It is a custom HTTP mapping using Retell's documented inbound and call-event webhooks.
Must dynamic variables be strings?
Yes. Retell's current documentation requires string values for dynamic variables.
How is the webhook authenticated?
Verify Retell's x-retell-signature with the current official verification procedure before processing the body.

Last updated: .