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.
Authorization: Bearer <access_token> and Content-Type: application/json. Tokens are issued by POST /oauth2/token.
How a typical integration flows
- Authenticate. Exchange your client credentials for a short-lived Bearer token (Authentication).
- Submit the lead. POST the applicant, address, and at least one vehicle to Create Lead. You get back a lead
idand aPENDINGstatus while quoting runs in the background. - 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.
- 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
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.
| Field | Type | Description | |
|---|---|---|---|
| client_id | string | required | Your partner client ID |
| client_secret | string | required | Your partner client secret |
| grant_type | string | required | Always client_credentials |
access_token, token_type, and expires_inPOST 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
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5...",
"token_type": "Bearer",
"expires_in": 3600
}
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.
client_id and client_secret never leave your backend.- Mount. The component immediately calls
getContent(leadId), which hits a route on your backend (e.g.GET /api/embedded-content/:leadId). - 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.
- Render. The component picks the variant from
layout— one ofnone,content,content-cta,image-content, orimage-content-cta— and renders the corresponding offer. - Poll while pending. If the response sets
"continuePolling": true, the component re-runsgetContenteverypollingIntervalms (default5000), up tomaxPollingAttemptsiterations (default50), until polling is turned off or the cap is hit. - 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.
| Prop | Type | Description | |
|---|---|---|---|
| leadId | string | required | The EI lead ID returned by Create Lead |
| getContent | (leadId) => Promise<Content> | required | Async fetch of the content payload from your backend proxy |
| getUrl | (leadId) => Promise<string> | required | Async fetch of the one-time microsite URL when the customer clicks the CTA |
| theme | 'dark' | 'light' | optional | Visual theme. Defaults to dark |
| pollingInterval | number | optional | Milliseconds between content polls. Defaults to 5000 |
| maxPollingAttempts | number | optional | Cap on poll iterations. Defaults to 50 |
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.
| layout | Renders | Required fields |
|---|---|---|
| none | Nothing | - |
| content | Heading + subheading + footer | mainHeading, subHeading, footerText |
| content-cta | Text with a CTA button | Above + buttonText |
| image-content | Image + text | mainHeading, subHeading, footerText, imageUrl, imageAlt |
| image-content-cta | Image + text + CTA | All 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.
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';
// 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);
});
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"
/>
);
}
{
"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
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.
"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.
| Field | Type | Description | |
|---|---|---|---|
| firstName | string | required | |
| lastName | string | required | |
| dateOfBirth | string | required | Format: YYYY-MM-DD |
| address | object | required | address1, city, state (2-letter), zip (5-digit). address2 optional. |
| phoneNumber | string | required | E.164 format: +1XXXXXXXXXX |
| string | required | Applicant's email address. Each applicant within a lead must have a distinct email. | |
| gender | string | optional | Male · Female · Non-Binary |
| maritalStatus | string | optional | Single · Married · Divorced · Widowed · Separated · Domestic Partner |
| residenceOwnershipType | string | optional | Own · Rent · Other |
| monthsAtAddress | integer | optional | |
| priorAddress | object | optional | Same structure as address |
| licenseNumber | string | optional | |
| licenseState | string | optional | 2-letter state abbreviation |
| yearsLicensed | integer | optional | |
| educationLevel | string | optional | HighSchool · BachelorsDegree · MastersDegree · and more |
| income | array | optional | Array of income objects: employmentType, employerName, jobTitle, monthsAtEmployer, annualIncome |
Object with numeric string keys "1"–"9". Each shares the same optional fields as applicant, plus:
| Field | Type | Description | |
|---|---|---|---|
| relationshipToApplicant | string | optional | Spouse · Parent · Child · Relative · Cohabitant · Other |
Object with numeric string keys "1"–"9". Vehicle 1 is required.
| Field | Type | Description | |
|---|---|---|---|
| make | string | required | |
| model | string | required | |
| year | string | required | 4-digit year as string |
| vin | string | optional | 17-character VIN |
| trim | string | optional | |
| estimatedAnnualMileage | integer | optional | |
| isFinanced | boolean | optional | |
| lien | object | optional | lienHolder, monthlyPayment, originalAmount, payoffAmount, remainingTerm |
| Field | Type | Description | |
|---|---|---|---|
| orgId | string | required | Your organization ID provided by EI |
| isTest | boolean | optional | Set true for test requests |
| partnerExternalId | string | optional | Your internal reference ID for this lead |
| partnerData | object | optional | Arbitrary key-value metadata to pass through |
| insuranceGrade | string | optional | Single letter A–I 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. |
id and a status of PENDING.| Status | Meaning |
|---|---|
| PENDING | The 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. |
| COMPLETED | All asynchronous processing for the lead has finished. The lead's quotes (if any) and verification results are final. |
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"
}
{
"id": "bea82fae-e1b7-5bc5-810b-c38694e66aef",
"status": "PENDING"
}
Get Lead
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).
| Field | Type | Description | |
|---|---|---|---|
| id | string (UUID) | required | The lead ID returned by Create Lead |
GET /auto/v1/leads/bea82fae-e1b7-5bc5-810b-c38694e66aef
Authorization: Bearer <access_token>
{
"id": "bea82fae-e1b7-5bc5-810b-c38694e66aef",
"status": "PENDING",
"partnerExternalId": "your-ref-123"
}
Update Lead
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.
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.| Field | Type | |
|---|---|---|
| id | string (UUID) | required |
| Field | Type | Description | |
|---|---|---|---|
| id | string (UUID) | required | Lead ID (must match path param) |
| address | object | optional | Updated address |
| drivers | object | optional | Keyed "1"–"9", updated driver info |
| vehicles | object | optional | Keyed "1"–"9", updated vehicle info |
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 Link
Returns a single-use URL that directs the applicant to the Embedded Insurance quoting microsite, pre-populated with their lead data.
| Field | Type | |
|---|---|---|
| id | string (UUID) | required |
| Field | Type | Description | |
|---|---|---|---|
| partnerBrand | string | required | Your partner brand identifier provided by EI |
url - a one-time redirect linkPOST /auto/v1/leads/bea82fae-e1b7-5bc5-810b-c38694e66aef/get-link
Authorization: Bearer <access_token>
Content-Type: application/json
{
"partnerBrand": "your-brand"
}
{
"url": "https://quote.embeddedinsurance.com/..."
}
Get Quote 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.
| Field | Type | Description | |
|---|---|---|---|
| id | string (UUID) | required | The lead ID returned by Create Lead |
GET /auto/v1/leads/bea82fae-e1b7-5bc5-810b-c38694e66aef/embedded-content
Authorization: Bearer <access_token>
{
"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
}
Get Verification Link
Returns a single-use link to the EI verification microsite, where the applicant can confirm their existing coverage so EI can quote against it.
| Field | Type | |
|---|---|---|
| id | string (UUID) | required |
| Field | Type | Description | |
|---|---|---|---|
| partnerBrand | string | required | Your partner brand identifier |
| returnUrl | string | optional | Where to send the applicant after verification finishes |
| partnerExternalId | string | optional | Your internal reference — echoed back on the resulting verification webhook |
url — a one-time verification linkPOST /auto/v1/leads/bea82fae-e1b7-5bc5-810b-c38694e66aef/verify/get-link
Authorization: Bearer <access_token>
Content-Type: application/json
{
"partnerBrand": "your-brand",
"returnUrl": "https://yoursite.com/thank-you",
"partnerExternalId": "your-ref-123"
}
{
"url": "https://verify.embeddedinsurance.com/..."
}
Create Lead Event
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.
| Field | Type | |
|---|---|---|
| id | string (UUID) | required |
| Field | Type | Description | |
|---|---|---|---|
| type | string | required |
Event type. Supported values:
APPLICANT_AUTHENTICATED
|
POST /auto/v1/leads/bea82fae-e1b7-5bc5-810b-c38694e66aef/events
Authorization: Bearer <access_token>
Content-Type: application/json
{
"type": "APPLICANT_AUTHENTICATED"
}
{
"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.
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.
{
"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.
| Header | Value |
|---|---|
| Content-Type | application/json |
| X-Webhook-Signature | Hex-encoded HMAC-SHA256 of the raw request body, signed with the webhook secret EI shared with you during onboarding. See Verifying Signatures. |
All event bodies share these fields:
| Field | Type | Description |
|---|---|---|
| id | string | Unique event ID |
| leadId | string | The lead this event relates to |
| partnerCode | string | Your EI partner code |
| partnerExternalId | string | Optional - the ID you supplied via Create Lead |
| eventType | string | One of verification · quote · needs_insurance |
| eventTime | string | ISO 8601 timestamp |
| idempotencyKey | string | Stable 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. |
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.// 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.
- Read the
X-Webhook-Signatureheader. - Compute
HMAC-SHA256(secret, rawBody)as a hex string. - Compare the two using a constant-time equality check.
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
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).
| Field | Type | Description |
|---|---|---|
| insuranceVerification.id | string | Verification record ID |
| insuranceVerification.source | string | id-card · third-party |
| policyInfo.carrier | string | Verified carrier name (optional) |
| policyInfo.policyType | string | Always auto |
| policyInfo.policyNumber | string | Optional |
| policyInfo.vehicles[] | array | vin, year, make, model - all optional |
| policyInfo.namedInsureds[] | array | firstName, lastName, isPrimary |
| media[] | array | documentType (insurance-id-card · declarations), url, description, contentType, size, createdAt, expiresAt |
| verificationConfidence | number | Optional - confidence score from 0.00 to 1.00 |
| _tag | Description |
|---|---|
| NoActiveAutoPoliciesFound | No active auto policies were found for the insured |
| NoVehicleMatchesFound | No auto policies with matching vehicles were found |
| RetrieveError | An error occurred while retrieving verification data |
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.{
"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
}
}
{
"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
Delivered when a quote is successfully generated for a lead.
| Field | Type | Description |
|---|---|---|
| quote.id | string | Quote ID |
| quote.carrier | string | Insurance carrier the quote is with |
| quote.totalPremiumCents | integer | Total premium in cents (optional) |
| quote.savingsAmountCents | integer | Savings vs current policy in cents |
| quote.savingsMonthlyCents | integer | Monthly savings in cents |
| quote.savingsAnnualCents | integer | Annual savings in cents (rounded to nearest $10) |
| quote.currentPaymentMonthlyCents | integer | Current monthly payment in cents |
| quote.newPaymentMonthlyCents | integer | New 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.
{
"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
}
}
{
"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
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.
| Field | Type | Description |
|---|---|---|
| source | string | Always insurance_verification_app |
All other fields come from the common envelope.
{
"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
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.
GET https://api.embeddedinsurance.com/auto/v1/health
{
"status": "ok"
}