Skip to content

One connection from every carrier to every agency system.

Relay moves policy, document and commission data from carriers into the systems agencies already use. Checked, readable, and delivered in seconds instead of overnight.

Free for agencies and software partners. Carriers pay per active connection.

Carriers & MGAs

Send the files you already make. Relay checks them and delivers to every agency system you appoint.

  • Live with pilot agencies in your first week
  • Runs alongside your current download
  • 25 live agency connections free

Agencies

See every policy change, document and commission statement from your carriers, in plain English.

  • Know the moment a carrier goes quiet
  • Approve who can send you data
  • Free for agencies, always

Developers

One API for carrier data, with a Plaid-style Link flow your agency customers already understand.

  • Sandbox keys the moment you sign up
  • Webhooks, pull feed or AL3 — your choice
  • Every partner gets the same API, including our own
for agencies and software partners, always
$0for agencies and software partners, always
live agency connections free on Launch
25live agency connections free on Launch
ways to deliver: webhooks, pull feed and AL3 mailbox
3ways to deliver: webhooks, pull feed and AL3 mailbox
API for every agency system
1API for every agency system

See exactly what arrives.

Every transaction becomes one readable record: what changed, which documents came with it, and where it was delivered.

RWL RenewalPA-1002934Relay Mutual · Personal auto

Renewal for Avery Testwell, effective Nov 1, 2026. Premium up $214.00; a second vehicle was added.

What changed from the prior term
FieldPrior termThis term
Term premium$1,272.00$1,486.00
Collision deductible, vehicle 1$500$1,000
Vehicles12

Delivered to

  • Agency system webhookDelivered and accepted by the agency system
  • Partner pull feedAvailable at seq 18233
  • AL3 mailboxQueued for the next hourly batch

How it works

A carrier sends data once. Relay checks it, turns it into one readable policy object, and routes it by agency code to every system that agency has authorized.

  1. 1Carriers sendAPI, the AL3 file they already export, or an upload.
  2. 2Relay validates, normalizes and routesOne policy object, routed by agency code.
  3. 3Agency systems receiveSigned webhooks, a pull feed, or an AL3 mailbox.

Two calls on each side

Carriers push transactions with one authenticated request. Partners receive a signed, thin webhook and fetch the full object over the API, so personal data stays out of webhook logs.

Carrier: push a renewal

curl https://sandbox.emeraldrelay.com/v1/ingest/transactions \
  -H "Authorization: Bearer rk_test_…" \
  -H "Idempotency-Key: renewal-PA-1002934-2026" \
  -H "Content-Type: application/json" \
  -d '{
    "transactions": [{
      "carrier": { "name": "Relay Mutual", "naic": "99901" },
      "agency_code": { "code": "TEST-0001" },
      "transaction": { "type": "RWL", "processed_date": "2026-10-20",
                       "effective_date": "2026-11-01" },
      "policy": { "number": "PA-1002934", "lob": "AUTOP",
                  "term": { "effective": "2026-11-01", "expiration": "2027-05-01" },
                  "premium": { "written": "1486.00", "change": "214.00" } },
      "insureds": [{ "name": { "full": "Avery Testwell" } }]
    }]
  }'

Partner: handle the webhook

import { Relay, verifyWebhook } from "@emerald-relay/node";

const relay = new Relay({ clientId: process.env.RELAY_CLIENT_ID, secret: process.env.RELAY_SECRET });

export async function POST(req: Request) {
  // Verify the raw body; re-serialized JSON won't match the signature.
  const event = verifyWebhook(await req.text(), req.headers, process.env.RELAY_WEBHOOK_SECRET!);
  const accessToken = await tokenForInstall(event.install_id);

  if (event.type === "policy.transaction.created") {
    // Thin event: fetch the full policy object over the API.
    const txn = await relay.policyTransactions.get(accessToken, event.data.id);
    await upsertPolicy(txn);
    await relay.events.ack(accessToken, event.id, { result: "APPLIED" });
  }
  return new Response(null, { status: 204 });
}

Security we can state plainly

Insurance data includes people's personal information. These are the controls in place today.

  • Encryption in transit (TLS) and at rest, with a separate data key per organization
  • Field-level encryption for sensitive fields such as dates of birth and license numbers
  • Two-factor authentication required for owners and admins
  • An audit log of every sign-in, key change and data access by staff
  • Automated tests that check one tenant can never read another tenant's data
  • SOC 2: not certified yet. Our current status is on the security page.

Start in the sandbox today.