API Documentation

This area is for authorized partners only. Please enter your access code to continue.

Incorrect access code. Please try again.

Embedded Insurance API - Auto

The Embedded Insurance (EI) API is a REST interface for surfacing personalized auto insurance offers inside your product. You submit a lead, EI returns quotes and verification results asynchronously, and your users complete the purchase on either an EI-hosted microsite or inline via the Embedded Component.

Base URL https://api.embeddedinsurance.com
All requests use JSON over HTTPS and must include Authorization: Bearer <access_token> and Content-Type: application/json. Tokens are issued by POST /oauth2/token.

How a typical integration flows

  1. Authenticate. Exchange your client credentials for a short-lived Bearer token (Authentication).
  2. Submit the lead. POST the applicant, address, and at least one vehicle to Create Lead. You get back a lead id and a PENDING status while quoting runs in the background.
  3. Surface the offer. Either render the Embedded Component in your app, or redirect the user to a microsite link from Get Quote Link / Get Quote Share Link.
  4. Stay in sync. Listen for webhook events as the lead progresses — verification results, quote completion, savings all arrive at the URL you configure during onboarding.

Everything else in these docs — Update Lead, Verification links, Lead Events — supports that core flow.

Authentication

POST https://auth.embeddedinsurance.com/oauth2/token

The EI API uses the OAuth 2.0 client credentials grant. Exchange your client_id and client_secret for a short-lived Bearer token (default expires_in is 3600 seconds), then send it in the Authorization header of every API call. Tokens can be cached and reused until they expire — there's no need to fetch a new one per request.

Your credentials are delivered via a secure one-time link during partner onboarding.

Server-side only. Never put your client credentials in browser code, mobile apps, or public repos. The Embedded Component and any other front-end usage should call your own backend, which proxies to EI using server-held credentials.
Request Body (x-www-form-urlencoded)
FieldTypeDescription
client_id string required Your partner client ID
client_secret string required Your partner client secret
grant_type string required Always client_credentials
Response
200Returns access_token, token_type, and expires_in
401Invalid credentials
Request
POST https://auth.embeddedinsurance.com/oauth2/token
Content-Type: application/x-www-form-urlencoded

client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=client_credentials
Response
{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5...",
  "token_type": "Bearer",
  "expires_in": 3600
}
Using the Token
Authorization: Bearer <access_token>

Embedded Component

A drop-in React widget that surfaces a personalized auto insurance offer directly inside your application — on a dashboard, account page, or post-purchase screen — without sending the customer to a separate site for the initial offer.

Distributed as @ei-tech/embedded-component on npm. You wire it up by giving it a leadId and two async callbacks — getContent and getUrl — that proxy to your backend. The component takes care of polling, rendering the right offer variant, and handing off to the EI microsite when the customer clicks through.

When to use what. Reach for the Embedded Component when you want to keep the customer inside your app for the initial offer impression. Use Get Quote Link or Get Quote Share Link when a hard redirect to the EI quoting microsite is the right experience — typically once the customer has shown intent.
Credentials stay on your server. The browser only talks to your two proxy routes; your EI client_id and client_secret never leave your backend.
How it works
  1. Mount. The component immediately calls getContent(leadId), which hits a route on your backend (e.g. GET /api/embedded-content/:leadId).
  2. Proxy. Your backend authenticates with EI via POST /oauth2/token, then forwards the request to GET /auto/v1/leads/:id/embedded-content and returns the JSON.
  3. Render. The component picks the variant from layout — one of none, content, content-cta, image-content, or image-content-cta — and renders the corresponding offer.
  4. Poll while pending. If the response sets "continuePolling": true, the component re-runs getContent every pollingInterval ms (default 5000), up to maxPollingAttempts iterations (default 50), until polling is turned off or the cap is hit.
  5. Hand off. When the customer clicks the CTA, the component calls getUrl(leadId); your backend proxies POST /auto/v1/leads/:id/get-link and the component opens the returned single-use URL in a new tab.
Embedded Component Your Backend EI API GET /api/auto-quote POST /oauth2/token access_token (Bearer) GET /auto/v1/leads/:id/ embedded-content content payload content payload Render offer If the response includes "continuePolling": true, the component re-runs getContent every pollingInterval ms (default 5s) until polling stops.
Component props
PropTypeDescription
leadIdstringrequiredThe EI lead ID returned by Create Lead
getContent(leadId) => Promise<Content>requiredAsync fetch of the content payload from your backend proxy
getUrl(leadId) => Promise<string>requiredAsync fetch of the one-time microsite URL when the customer clicks the CTA
theme'dark' | 'light'optionalVisual theme. Defaults to dark
pollingIntervalnumberoptionalMilliseconds between content polls. Defaults to 5000
maxPollingAttemptsnumberoptionalCap on poll iterations. Defaults to 50
Content payload

The JSON your backend returns from GET /auto/v1/leads/:id/embedded-content is what the component renders. The layout field chooses the variant; the rest of the fields populate that variant. EI controls the copy and imagery server-side, so partners typically don't need to inspect the payload — just forward it through.

layoutRendersRequired fields
noneNothing-
contentHeading + subheading + footermainHeading, subHeading, footerText
content-ctaText with a CTA buttonAbove + buttonText
image-contentImage + textmainHeading, subHeading, footerText, imageUrl, imageAlt
image-content-ctaImage + text + CTAAll of the above + buttonText

CTA layouts also accept these optional fields for fine-grained control: ctaHeadline, buttonAriaLabel, buttonDisabled, buttonLoading, buttonBackgroundColor, buttonTextColor. Every payload — regardless of layout — can include continuePolling (boolean) to control the polling loop described above.

Install
npm install @ei-tech/embedded-component

Requires React 18 or higher. Import the bundled stylesheet once in your app entry: import '@ei-tech/embedded-component/styles';

1. Server-side proxy (two routes)
// Express example - keep this on your backend

async function getEIToken() {
  const r = await fetch('https://auth.embeddedinsurance.com/oauth2/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams({
      client_id: process.env.EI_CLIENT_ID,
      client_secret: process.env.EI_CLIENT_SECRET,
      grant_type: 'client_credentials'
    })
  });
  return (await r.json()).access_token;
}

// Drives getContent - proxies the embedded-content payload
app.get('/api/embedded-content/:leadId', async (req, res) => {
  const token = await getEIToken();
  const r = await fetch(
    `https://api.embeddedinsurance.com/auto/v1/leads/${req.params.leadId}/embedded-content`,
    { headers: { Authorization: `Bearer ${token}` } }
  );
  res.json(await r.json());
});

// Drives getUrl - proxies the one-time microsite link
app.get('/api/quote-link/:leadId', async (req, res) => {
  const token = await getEIToken();
  const r = await fetch(
    `https://api.embeddedinsurance.com/auto/v1/leads/${req.params.leadId}/get-link`,
    {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ partnerBrand: process.env.EI_PARTNER_BRAND })
    }
  );
  const { url } = await r.json();
  res.json(url);
});
2. Render the component
import { EmbeddedInsurance, Content } from '@ei-tech/embedded-component';

const getContent = async (leadId: string): Promise<Content> => {
  const r = await fetch(`/api/embedded-content/${leadId}`);
  if (!r.ok) throw new Error('Failed to load content');
  return r.json();
};

const getUrl = async (leadId: string): Promise<string> => {
  const r = await fetch(`/api/quote-link/${leadId}`);
  if (!r.ok) throw new Error('Failed to get link');
  return r.json();
};

export function Dashboard({ leadId }: { leadId: string }) {
  return (
    <EmbeddedInsurance
      leadId={leadId}
      getContent={getContent}
      getUrl={getUrl}
      theme="dark"
    />
  );
}
Example content payload
{
  "layout": "image-content-cta",
  "mainHeading": "Your Quote is Ready!",
  "subHeading": "Click to view your personalized insurance details.",
  "buttonText": "View Now",
  "imageUrl": "https://cdn.example.com/quote.svg",
  "imageAlt": "Insurance Quote",
  "footerText": "Insurance by Embedded Insurance Agency, LLC.",
  "continuePolling": false
}

Create Lead

POST /auto/v1/leads

Submit a new auto insurance lead to EI. At a minimum you need to send the primary applicant's contact details, address, and one vehicle. EI returns a lead id immediately; quoting then runs asynchronously and progress is delivered to your webhook endpoint.

Test vs. production data. EI treats every submission as production data by default. To send a lead that should not be quoted or routed to a carrier, set "isTest": true at the root of the request body. The same base URL and credentials are used for both — the flag is the only switch.
Applicant (required)
FieldTypeDescription
firstNamestringrequired
lastNamestringrequired
dateOfBirthstringrequiredFormat: YYYY-MM-DD
addressobjectrequiredaddress1, city, state (2-letter), zip (5-digit). address2 optional.
phoneNumberstringrequiredE.164 format: +1XXXXXXXXXX
emailstringrequiredApplicant's email address. Each applicant within a lead must have a distinct email.
genderstringoptionalMale · Female · Non-Binary
maritalStatusstringoptionalSingle · Married · Divorced · Widowed · Separated · Domestic Partner
residenceOwnershipTypestringoptionalOwn · Rent · Other
monthsAtAddressintegeroptional
priorAddressobjectoptionalSame structure as address
licenseNumberstringoptional
licenseStatestringoptional2-letter state abbreviation
yearsLicensedintegeroptional
educationLevelstringoptionalHighSchool · BachelorsDegree · MastersDegree · and more
incomearrayoptionalArray of income objects: employmentType, employerName, jobTitle, monthsAtEmployer, annualIncome
Co-applicants (optional)

Object with numeric string keys "1""9". Each shares the same optional fields as applicant, plus:

FieldTypeDescription
relationshipToApplicantstringoptionalSpouse · Parent · Child · Relative · Cohabitant · Other
Vehicles (required - at least one)

Object with numeric string keys "1""9". Vehicle 1 is required.

FieldTypeDescription
makestringrequired
modelstringrequired
yearstringrequired4-digit year as string
vinstringoptional17-character VIN
trimstringoptional
estimatedAnnualMileageintegeroptional
isFinancedbooleanoptional
lienobjectoptionallienHolder, monthlyPayment, originalAmount, payoffAmount, remainingTerm
Root fields
FieldTypeDescription
orgIdstringrequiredYour organization ID provided by EI
isTestbooleanoptionalSet true for test requests
partnerExternalIdstringoptionalYour internal reference ID for this lead
partnerDataobjectoptionalArbitrary key-value metadata to pass through
insuranceGradestringoptionalSingle letter AI representing your lead-quality grading. EI works with each partner during onboarding to define the meaning of each grade — separate documentation is provided. Safe to omit if you don't yet have a grading model.
Response
200Lead accepted. Returns the lead id and a status of PENDING.
400Validation error or duplicate lead
401Missing or invalid Bearer token
Lead status lifecycle
StatusMeaning
PENDINGThe lead has been accepted and is being processed. Quoting, verification, and any downstream work happens in the background — listen for webhook events to follow progress.
COMPLETEDAll asynchronous processing for the lead has finished. The lead's quotes (if any) and verification results are final.
Request
POST /auto/v1/leads
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "applicant": {
    "firstName": "John",
    "lastName": "Doe",
    "dateOfBirth": "1980-01-15",
    "address": {
      "address1": "123 Main St",
      "city": "Boston",
      "state": "MA",
      "zip": "02108"
    },
    "phoneNumber": "+16175551234",
    "email": "john.doe@example.com",
    "gender": "Male",
    "maritalStatus": "Married"
  },
  "coapplicants": {
    "1": {
      "firstName": "Jane",
      "lastName": "Doe",
      "dateOfBirth": "1982-06-20",
      "relationshipToApplicant": "Spouse"
    }
  },
  "vehicles": {
    "1": {
      "vin": "1HGCM82633A123456",
      "make": "Toyota",
      "model": "Camry",
      "year": "2020"
    }
  },
  "orgId": "your-org-id",
  "insuranceGrade": "A"
}
Response
{
  "id": "bea82fae-e1b7-5bc5-810b-c38694e66aef",
  "status": "PENDING"
}

Get Lead

GET /auto/v1/leads/:id

Fetch the latest snapshot of a lead — its current lifecycle status plus any quotes that have been generated so far. Polling this endpoint is supported but webhooks are the recommended way to stay in sync; use Get Lead for ad-hoc reads (e.g. an internal admin view or a recovery path).

Path Parameters
FieldTypeDescription
idstring (UUID)requiredThe lead ID returned by Create Lead
Response
200The lead object with its current status and any available quotes
404Lead not found for the supplied ID
Request
GET /auto/v1/leads/bea82fae-e1b7-5bc5-810b-c38694e66aef
Authorization: Bearer <access_token>
Response
{
  "id": "bea82fae-e1b7-5bc5-810b-c38694e66aef",
  "status": "PENDING",
  "partnerExternalId": "your-ref-123"
}

Update Lead

POST /auto/v1/leads/:id

Re-submit a lead with corrected or expanded information and trigger a fresh quote. Send only the fields you want to change — anything you omit is left untouched. When the new quote is ready you'll receive a quote webhook.

The body's id must match the path's :id. This is a deliberate belt-and-braces check to avoid accidentally updating the wrong lead when wiring this endpoint up.
Path Parameters
FieldType
idstring (UUID)required
Request Body
FieldTypeDescription
idstring (UUID)requiredLead ID (must match path param)
addressobjectoptionalUpdated address
driversobjectoptionalKeyed "1""9", updated driver info
vehiclesobjectoptionalKeyed "1""9", updated vehicle info
Response
200Updated lead with refreshed quotes
400Validation error
Request
POST /auto/v1/leads/bea82fae-e1b7-5bc5-810b-c38694e66aef
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "id": "bea82fae-e1b7-5bc5-810b-c38694e66aef",
  "address": {
    "address1": "456 New Ave",
    "city": "Boston",
    "state": "MA",
    "zip": "02109"
  },
  "vehicles": {
    "1": {
      "vin": "1HGCM82633A123456",
      "make": "Toyota",
      "model": "Camry",
      "year": "2020"
    }
  }
}

Get Quote Content

GET /auto/v1/leads/:id/embedded-content

Returns the content payload used to render the inline offer inside the Embedded Component. Your backend proxies this endpoint and forwards the JSON straight to the component's getContent callback. The layout field on the response selects which variant the component renders; see the Content payload table for the full set of layouts and fields. Set continuePolling: true on the response while quoting is still in flight — the component will poll this endpoint again until you return false.

Path Parameters
FieldTypeDescription
idstring (UUID)requiredThe lead ID returned by Create Lead
Response
200Content payload — passed through to the Embedded Component
Request
GET /auto/v1/leads/bea82fae-e1b7-5bc5-810b-c38694e66aef/embedded-content
Authorization: Bearer <access_token>
Response
{
  "layout": "image-content-cta",
  "mainHeading": "Your Quote is Ready!",
  "subHeading": "Click to view your personalized insurance details.",
  "buttonText": "View Now",
  "imageUrl": "https://cdn.example.com/quote.svg",
  "imageAlt": "Insurance Quote",
  "footerText": "Insurance by Embedded Insurance Agency, LLC.",
  "continuePolling": false
}

Create Lead Event

POST /auto/v1/leads/:id/events

Record a partner-side lifecycle event against a lead — the inverse of the webhook flow. Use this to tell EI about state changes that happen on your side (for example, the applicant successfully authenticating in your app). The supported event types are intentionally narrow today; new types are added as EI and partners agree on what's useful to signal.

Path Parameters
FieldType
idstring (UUID)required
Request Body
FieldTypeDescription
type string required Event type. Supported values:
APPLICANT_AUTHENTICATED
Request
POST /auto/v1/leads/bea82fae-e1b7-5bc5-810b-c38694e66aef/events
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "type": "APPLICANT_AUTHENTICATED"
}
Response
{
  "ok": true,
  "eventId": "evt_123456789"
}

Common Errors

These status codes are returned consistently across the API. Endpoint-specific errors are documented inside each endpoint's section.

400The request body failed validation or was malformed
401The Bearer token is missing, expired, or invalid
403The credentials are valid but not permitted to perform this action
404The lead, quote, or other resource doesn't exist for your partner
500Unexpected server error — safe to retry with backoff

Error responses use a JSON body with a machine-readable error code and a human-readable message. Always log the message — it usually pinpoints exactly which field caused the failure.

Example Error
{
  "error": "invalid_request",
  "message": "Missing required field: applicant.firstName"
}

Webhooks - Overview

EI delivers lifecycle events for your leads to an HTTPS URL you provide during onboarding. Each event arrives as an HTTP POST with a JSON body, signed so you can confirm it came from EI. Webhooks are the recommended way to track quoting and verification progress — Get Lead is for ad-hoc reads, not polling loops.

Headers (every event)
HeaderValue
Content-Typeapplication/json
X-Webhook-SignatureHex-encoded HMAC-SHA256 of the raw request body, signed with the webhook secret EI shared with you during onboarding. See Verifying Signatures.
Common envelope

All event bodies share these fields:

FieldTypeDescription
idstringUnique event ID
leadIdstringThe lead this event relates to
partnerCodestringYour EI partner code
partnerExternalIdstringOptional - the ID you supplied via Create Lead
eventTypestringOne of verification · quote · needs_insurance
eventTimestringISO 8601 timestamp
idempotencyKeystringStable identifier for this logical event. Retries of the same event re-use the same key — store the first one you see and treat duplicates as a no-op.
Acknowledge receipt by responding with any 2xx status within a few seconds. Anything else (non-2xx, timeout, connection error) is treated as a delivery failure and may be retried by EI, so make your handler idempotent — store idempotencyKey the first time you process an event and short-circuit on duplicates.
Minimal handler
// Express - keep the raw body so the signature check works
app.post('/webhooks/ei',
  express.raw({ type: 'application/json' }),
  (req, res) => {
    const sig  = req.headers['x-webhook-signature'];
    const body = req.body.toString('utf8');

    if (!verifyWebhookSignature(process.env.EI_WEBHOOK_SECRET, sig, body)) {
      return res.status(401).end();
    }

    const event = JSON.parse(body);
    // dedupe on event.idempotencyKey, then handle by event.eventType
    res.sendStatus(200);
  }
);

Verifying Signatures

Every webhook is signed with HMAC-SHA256 over the raw request body, using a secret EI shares with you during onboarding. Reject any request that doesn't verify — without this check, anyone who knows your URL can forge events.

  1. Read the X-Webhook-Signature header.
  2. Compute HMAC-SHA256(secret, rawBody) as a hex string.
  3. Compare the two using a constant-time equality check.
Use the raw request body - re-serializing parsed JSON will change byte ordering and break the check.
Node.js
import crypto from 'node:crypto';

const createWebhookSignature = (secret, body) => {
  const hmac = crypto.createHmac('sha256', secret);
  hmac.update(body);
  return hmac.digest('hex');
};

export const verifyWebhookSignature = (secret, signature, body) => {
  if (!signature) return false;
  const expected = createWebhookSignature(secret, body);
  try {
    return crypto.timingSafeEqual(
      Buffer.from(signature, 'hex'),
      Buffer.from(expected,  'hex'),
    );
  } catch {
    return false;
  }
};

Verification Events

POST eventType: verification

Delivered once verification finishes for a lead — either successfully (status completed) or with a structured failure reason (status failed). The payload tells you what coverage we found and includes references to any uploaded documents (ID cards, declarations pages).

Status values
completed failed
Completed - fields
FieldTypeDescription
insuranceVerification.idstringVerification record ID
insuranceVerification.sourcestringid-card · third-party
policyInfo.carrierstringVerified carrier name (optional)
policyInfo.policyTypestringAlways auto
policyInfo.policyNumberstringOptional
policyInfo.vehicles[]arrayvin, year, make, model - all optional
policyInfo.namedInsureds[]arrayfirstName, lastName, isPrimary
media[]arraydocumentType (insurance-id-card · declarations), url, description, contentType, size, createdAt, expiresAt
verificationConfidencenumberOptional - confidence score from 0.00 to 1.00
Failed - failure reasons
_tagDescription
NoActiveAutoPoliciesFoundNo active auto policies were found for the insured
NoVehicleMatchesFoundNo auto policies with matching vehicles were found
RetrieveErrorAn error occurred while retrieving verification data
Media URLs are short-lived. Each entry in media[] is a pre-signed link with an expiresAt. If you need to retain the asset, download it to your own storage before the link expires — refetching the event later won't refresh the URL.
Completed
{
  "id": "evt_abc123",
  "leadId": "lead_987654321",
  "partnerExternalId": "partner_app_456",
  "partnerCode": "ACME",
  "eventType": "verification",
  "eventTime": "2024-01-15T10:30:00.000Z",
  "status": "completed",
  "idempotencyKey": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "insuranceVerification": {
    "id": "verification_123",
    "source": "id-card",
    "policyInfo": {
      "carrier": "Progressive",
      "policyType": "auto",
      "policyNumber": "POL123456789",
      "vehicles": [
        { "vin": "1HGBH41JXMN109186", "year": "2023", "make": "Honda", "model": "Accord" }
      ],
      "namedInsureds": [
        { "firstName": "Jane", "lastName": "Doe", "isPrimary": true }
      ]
    },
    "media": [
      {
        "documentType": "insurance-id-card",
        "url": "https://storage.googleapis.com/ei-media/insurance-cards/id-card-123.jpg",
        "description": "Insurance identification card",
        "contentType": "image/jpeg",
        "size": 512000,
        "createdAt": "2024-01-15T10:25:00.000Z",
        "expiresAt": "2024-01-22T10:25:00.000Z"
      }
    ],
    "verificationConfidence": 0.95
  }
}
Failed
{
  "id": "evt_def456",
  "leadId": "lead_987654321",
  "partnerCode": "ACME",
  "eventType": "verification",
  "eventTime": "2024-01-15T10:35:00.000Z",
  "status": "failed",
  "idempotencyKey": "f6e5d4c3-b2a1-0987-fedc-ba9876543210",
  "insuranceVerification": {
    "id": "verification_124",
    "source": "third-party",
    "failureReasons": [
      { "_tag": "NoActiveAutoPoliciesFound", "message": "No active auto policies found" }
    ]
  }
}

Quote Events

POST eventType: quote · status: completed

Delivered when a quote is successfully generated for a lead.

Fields
FieldTypeDescription
quote.idstringQuote ID
quote.carrierstringInsurance carrier the quote is with
quote.totalPremiumCentsintegerTotal premium in cents (optional)
quote.savingsAmountCentsintegerSavings vs current policy in cents
quote.savingsMonthlyCentsintegerMonthly savings in cents
quote.savingsAnnualCentsintegerAnnual savings in cents (rounded to nearest $10)
quote.currentPaymentMonthlyCentsintegerCurrent monthly payment in cents
quote.newPaymentMonthlyCentsintegerNew monthly payment in cents

The savings and current-payment fields (savingsAmountCents, savingsMonthlyCents, savingsAnnualCents, currentPaymentMonthlyCents, newPaymentMonthlyCents) are only populated when EI can compare the new quote against prior coverage — i.e. when the lead has both a quote and a successful verification result. For "cold" quotes (no prior policy on file) you'll get just totalPremiumCents; don't render savings UI unconditionally.

With prior insurance
{
  "id": "evt_ghi789",
  "leadId": "lead_987654321",
  "partnerExternalId": "partner_app_456",
  "partnerCode": "ACME",
  "eventType": "quote",
  "eventTime": "2024-01-15T11:15:00.000Z",
  "status": "completed",
  "idempotencyKey": "12345678-abcd-ef01-2345-6789abcdef01",
  "quote": {
    "id": "quote_456",
    "carrier": "Geico",
    "totalPremiumCents": 120000,
    "savingsAmountCents": 30000,
    "savingsMonthlyCents": 2500,
    "savingsAnnualCents": 30000,
    "currentPaymentMonthlyCents": 12500,
    "newPaymentMonthlyCents": 10000
  }
}
Cold quote
{
  "id": "evt_jkl012",
  "leadId": "lead_987654321",
  "partnerCode": "ACME",
  "eventType": "quote",
  "eventTime": "2024-01-15T11:15:00.000Z",
  "status": "completed",
  "idempotencyKey": "abcdef01-2345-6789-abcd-ef0123456789",
  "quote": {
    "id": "quote_457",
    "carrier": "Allstate",
    "totalPremiumCents": 150000
  }
}

Needs Insurance Event

POST eventType: needs_insurance

Delivered when a user signals — inside the insurance verification app — that they need a new auto policy rather than verifying an existing one. Treat this as a hand-off: the user has effectively opted into being quoted, so this is the right moment to kick off your quoting flow.

Fields
FieldTypeDescription
sourcestringAlways insurance_verification_app

All other fields come from the common envelope.

Event
{
  "id": "evt_mno345",
  "leadId": "lead_987654321",
  "partnerExternalId": "partner_app_456",
  "partnerCode": "ACME",
  "eventType": "needs_insurance",
  "source": "insurance_verification_app",
  "eventTime": "2024-01-15T09:00:00.000Z",
  "idempotencyKey": "11112222-3333-4444-5555-666677778888"
}

Get Health

GET /auto/v1/health

Lightweight liveness probe for the API. No authentication required, no side effects — safe to hit from uptime monitors, synthetic checks, or as a pre-flight from your backend before the first authenticated call after a deploy.

Response
200API is healthy
5xxService degraded or unavailable
Request
GET https://api.embeddedinsurance.com/auto/v1/health
Response
{
  "status": "ok"
}