Just API · Quotes API
Examples use
API reference

Quotes API

One POST prices a shopper for Just Pay-Per-Mile and Just Unlimited. Each quote comes back with a price, payment plans and a link that takes the shopper to just.insure to buy. A product Just can't offer comes back as a decline, with a code you can branch on.

How it fits together

  1. Your server calls POST /v1/quotes with the shopper, any other drivers, the vehicle and the Just package you want priced.
  2. Just answers 200 with quotes[] for the products it can offer and declines[] for the rest. Either list can be empty.
  3. You show the prices. The shopper clicks a quote's clickToBuyUrl, lands on just.insure with that quote open, and buys there.
Base URL
Endpoints
POST /v1/quotes   # every live product, one call
YOUR PLATFORM JUST PARTNER QUOTE API SHOPPER ON JUST.INSURE Your server POST /v1/quotes x-api-key quotes[] + declines[] prices each product typically well under a second Your results page show prices just.insure, quote open shopper clicks clickToBuyUrl Signed in, or asked to sign in. Final price, then buy.
Your part ends when the shopper clicks through. Whether the link signs the shopper in depends on who they are; see clickToBuyUrl sign-in.
!

RC1 is indicative; the final price comes later. An RC1 quote is priced from what you send. Just runs its driving-history and credit checks on just.insure before the shopper buys, When the shopper's answers are accurate, the final price should be very close to the RC1 quote; differences come from the checks finding something the request didn't include.

Quick start#

Send a JSON body with your key in the x-api-key header. The example asks for BASIC_FULL_COVER for one Arizona driver and one vehicle, identified by a partial VIN.

  1. Get your staging key from your Just partnership contact.
  2. Copy the request on the right, in curl, Node or Python.
  3. Check the response: one entry in quotes per product Just can offer, each with a price, paymentPlans and a clickToBuyUrl. Anything Just can't offer is in declines. See the quote object for every field, and errors if the call fails.
POST/v1/quotes

Environments#

Use staging to build and test. Every production call that reaches pricing creates a real quote at Just, and a customer record for an email Just hasn't seen before, so only send real shoppers there.

EnvironmentBase URLUse for
StagingIntegration and testing. Prices are realistic but not binding.
ProductionLive shoppers only.
PropertyValue
MethodsPOST /v1/quotes only. Requests are application/json; a 200 is application/json and an error is application/problem+json.
Latency and timeoutA typical call takes around 300 ms (p90). Still set a client timeout; 30 seconds is the upper bound. In the rare case pricing takes too long, Just answers 504 dependency-timeout, which is safe to retry.
Body sizeUp to 64 KiB. Up to 9 additional drivers, 10 vehicles and 50 events in each history list.
Rate limitsNone enforced.
IdempotencySend an Idempotency-Key header on every call: a unique value per quote attempt, a V4 UUID is recommended, up to 255 characters. Reuse the same key when you retry that attempt. In v1 Just records the key but does not deduplicate yet: every call that reaches pricing creates new quotes, each with a new id and clickToBuyUrl, so use the newest response. A later release will replay the first response for a repeated key within 24 hours; sending the key now means your retries work unchanged when that ships. A retry doesn't duplicate the shopper meanwhile: Just reuses the customer with the same email. Retry only on network failures and 5xx.
SupportSend Just the Request-Id response header of the call, whatever its status, and the quote's id for a question about a quote.

Authentication#

Send your API key on every request in the x-api-key header. Just issues one key per partner for staging and one for production. Keys don't expire; ask Just to rotate one if it leaks.

The key is your identity. Just attributes every quote to the partner the key belongs to, and nothing in the request body can change that.

StatusWhenBody
401The key is missing or isn't a Just key. Rejected by Just's API gateway.The gateway's own JSON, not a problem.
403The key is a Just key but isn't enabled for this API, or your access is paused. Both cases get the same answer.application/problem+json, type forbidden.

Keep keys on your servers; never call the API from a browser or an app.

Request headers#

HeaderValue
x-api-keyRequiredYour API key for the environment.
Content-TypeRequiredapplication/json. Anything else is a 415.
Idempotency-KeyOptionalA unique value per quote attempt, up to 255 characters; a V4 UUID is recommended. Reuse it when you retry that attempt; see idempotency. A longer key is a 400 INVALID_LENGTH at path Idempotency-Key.
Headers
POST /v1/quotes HTTP/1.1
Host: 
Content-Type: application/json
x-api-key: 
Idempotency-Key: 5f2b8c1e-7d3a-4e9b-a6c2-0f1d8e7b3a94
Response
{
  "code": 401,
  "message": "UNAUTHENTICATED: Method doesn't allow unregistered callers (callers without established identity). Please use API Key or other form of API consumer identity to call this API."
}

Request IDs#

Every response carries a Request-Id header that Just generates for the call: req_ followed by a 26-character ULID, for example req_01M504WQC04TFF59TDWH9EDD1R. It is on every 200, 4xx and 5xx from the API. The gateway's 401 is the one exception: it is answered before the request reaches Just's API.

Log it with every call, whatever the status. It is the id Just finds a call by, so send it with any support question, together with the quote's id when the question is about a quote.

In the headerOn every response. Read it from the header for a 200: the body of a 200 has no request id.
In a problemAn error body repeats it as requestId, the same value as the header, so a stored error can still be traced.
One per callEach call gets its own, a retry included. Just generates it; there is no field or header to set your own. Treat it as an opaque string.
Response headers · 200
HTTP/1.1 200 OK
Content-Type: application/json
Request-Id: req_01M504WQC04TFF59TDWH9EDD1R
Response · 502, header and body agree
HTTP/1.1 502 Bad Gateway
Content-Type: application/problem+json
Request-Id: req_01M504X6TYH4QX4FR84G98PBSK

{
  "type": "https://docs.just.insure/quotes/errors#dependency-failure",
  "title": "Bad Gateway",
  "status": 502,
  "detail": "A service Just depends on failed. It is safe to retry.",
  "requestId": "req_01M504X6TYH4QX4FR84G98PBSK"
}

Testing#

Test on staging. Start from the quick start request and use the request builder below to try each outcome. Every quote you get back is an RC1 quote; see how RC1 quotes work. Please don't send test traffic to production; it creates real customer records.

Just emails the shopper only when you send notifyShopper: true, on staging as in production. Use an inbox you control to see that email. Addresses at example.com are never emailed.

Test emails

The email decides how clickToBuyUrl signs in (see clickToBuyUrl sign-in), so pick it for what you want to see:

What you want to testWhich email to send
One-click sign-in. The clickToBuyUrl signs the shopper straight in to just.insure with the quote open.An address Just has never seen, so use a new one every run: shopper+run-001@example.com on the first run, shopper+run-002@example.com on the next, and so on.
Sign-in required. The clickToBuyUrl opens just.insure and asks the shopper to sign in by email first, then shows the quote. This is what a returning shopper gets.An address you've already sent in an earlier run, for example shopper+run-001@example.com again.
Just's quote email. Just emails the shopper the quote.An inbox you can read, with a new tag each run, and notifyShopper: true in the request: for example yourname+jpq-001@yourcompany.com.

Addresses at example.com are never emailed, so they're safe for repeat runs.

Addresses that quote

stateline1cityzipCode
AZ302 W Almeria RdPhoenix85003
NV123 Main StLas Vegas89101
IN789 Main StIndianapolis46204

Vehicles

Send asValueVehicle
vin1GC0K9CG0BF2139092011 Chevrolet Silverado
partialVin19XFA1F5*A2010 Honda Civic

Request builder

Pick a scenario and the request on the right updates, with the answer Just gives. A 400 lists every problem at once. Declines that need no pricing stop at the first that applies, in the order in eligibility.

Shopper and vehicle
Mistakes in the request (400)
API key problems
200 Two quotes
POST/v1/quotes · builder

Products and states#

By default every call prices both products, Pay-Per-Mile first. Send products to price only some of them, in your order. Both are 90-day terms that renew; the rate at renewal reflects how safely the customer drives.

ProductproductHow the customer paysPayment plans returned
Just Pay-Per-MilePAY_PER_MILEA daily rate plus a rate per mile driven.Every 14 days
Just UnlimitedUNLIMITEDA fixed daily rate, unlimited miles.Every 14 days (default) or every 30 days

The state comes from policyholder.address.state, and Just also checks that it covers policyholder.address.zipCode.

StateStatus
Arizona AZLive
Nevada NVLive
Indiana INLive
Any other state200 with a UNSUPPORTED_STATE decline for every product. No record is created. New states are announced in the changelog.

Packages#

Just sells three packages per state, and you choose one with package. Coverages can't be mixed and matched, and Just doesn't adjust the package to limits you send; each quote lists what it covers in package.coverages. Limits below are US dollars.

ArizonaMINIMUM_LIABILITYBASIC_FULL_COVERREGULAR_FULL_COVER
Bodily Injury25,000 / 50,00025,000 / 50,00050,000 / 100,000
Property Damage15,00015,00050,000
Collision and ComprehensiveNot included1,000 deductible500 deductible
GlassNot includedIncludedIncluded
Uninsured / Underinsured Motorist BINot in the RC1 quote. The customer can add it on just.insure.

Bodily Injury is per person / per accident. Property Damage is per accident. The tables show Just's current packages; always display what each quote's package.coverages says, which is what the shopper buys.

Package mapping guide#

Most partners sell tiers of their own. Map each tier to one Just package once, in your integration, using its shape:

Your tierSend package
Liability only, no Collision or Comprehensive, any Bodily Injury limitMINIMUM_LIABILITY
Collision and Comprehensive, Bodily Injury below 50,000 / 100,000BASIC_FULL_COVER
Collision and Comprehensive, Bodily Injury 50,000 / 100,000 or higherREGULAR_FULL_COVER

Example: Minimum, Better, Best and Customize tiers

Partner tierSend package
Minimum (25 / 50, 1,000 deductibles)BASIC_FULL_COVER
Better, BestREGULAR_FULL_COVER
CustomizeThe rows of the general table above, from the shopper's choices.
i

The quote is the package, not your tier. Limits and deductibles come from the Just package and can differ from your tier's. Show the shopper package.name and package.coverages next to the price. A liability-only tier with high limits is still quoted at Just's Minimum Liability limits.

How RC1 quotes work#

At Just an RC1 quote is called a quick quote; you'll see that term in Just's emails, support replies and on just.insure. It means the same thing. RC1 quotes are priced from what you send. Missing or malformed input is a 400 that lists every problem, never a silent guess.

Start date, term and mileage#

RuleDetailIf not met
Start datepolicyStartDate, today to 60 days ahead in the policyholder's time zone. Leave it out to start today. Show each quote's own policyStartDate: it's the date Just priced.400 POLICY_START_DATE_IN_PAST, POLICY_START_DATE_TOO_FAR_AHEAD
Full cover starts todayBASIC_FULL_COVER and REGULAR_FULL_COVER start today; MINIMUM_LIABILITY can start any day in the window.Decline FUTURE_START_FULL_COVER_NOT_SUPPORTED
TermAlways 90 days, in term.days. There is no term field in the request.—
ExpiryA quote and its clickToBuyUrl work until expiresAt, 30 days after pricing.Request a new quote
MileageestimatedMonthlyMileage, whole miles a month, at least 1. Used for Pay-Per-Mile.400 OUT_OF_RANGE, INVALID_TYPE

Eligibility is a quote#

There is no separate eligibility call. A quote means Just can offer the product; a decline means it can't, and says why. Just answers in this order:

1 · API key 401 gateway · 403 forbidden 2 · Validate the body 400 invalid-request, every problem 3 · Vehicles, state, start date decline every product, no record 4 · Price each product, in order decline this product, or every product 200 · quotes[] + declines[]
Steps 1 and 2 fail the request. Steps 3 and 4 never do: a shopper Just can't insure is a 200 with declines. A failure on Just's side at any step is a 5xx, never a decline.

Records and email#

Every call that reaches pricing (step 4) creates records at Just, even if you never show the price: a customer for an email Just hasn't seen before, or the existing customer for a known email, plus an application and a quote per product. Calls declined at step 3 create nothing.

Just emails the shopper only when you send notifyShopper: true. Then Just sends its usual quote email under its usual rules: an address at example.com is never emailed, and a shopper isn't emailed twice for the same quote. Leave it out, or send false, when your own page shows the prices and the consent to contact the shopper sits with you.

Endpoint

Create quotes#

POST/v1/quotes

Prices the shopper for each requested product, in order. Returns quotes, one quote object per product Just can offer, and declines, one decline per product it can't. A decline for one product never removes the other product's quote. Always read product rather than assuming two entries.

Returns

StatusMeaning
200Just evaluated the shopper. Body is { quotes[], declines[] }; both lists may be non-empty, and either may be empty. The call's id is in the Request-Id header.
400The request has problems, all listed in errors. See field problem codes.
401API key missing or not a Just key. From the gateway.
403API key not enabled for this API.
413 415Body over 64 KiB, or not application/json.
500 502 504Just couldn't complete the quote. Safe to retry with backoff.
POST/v1/quotes
Response
{
  "quotes": [
    {
      "id": "qq_01jaxk3m9v3t7q8r2w4y6z0abc",
      "object": "quote",
      "product": "PAY_PER_MILE",
      "expiresAt": "2026-11-14T06:59:59Z",
      "policyStartDate": "2026-10-15",
      "term": { "days": 90 },
      "package": {
        "type": "BASIC_FULL_COVER",
        "name": "Basic Full Cover",
        "coverages": [
          {
            "type": "BODILY_INJURY",
            "perPerson": { "amount": 2500000, "currency": "usd" },
            "perAccident": { "amount": 5000000, "currency": "usd" }
          },
          { "type": "PROPERTY_DAMAGE", "perAccident": { "amount": 1500000, "currency": "usd" } },
          { "type": "COLLISION", "deductible": { "amount": 100000, "currency": "usd" } },
          { "type": "COMPREHENSIVE", "deductible": { "amount": 100000, "currency": "usd" } },
          { "type": "GLASS" }
        ]
      },
      "price": {
        "type": "PAY_PER_MILE",
        "perDay": { "amount": 187, "currency": "usd" },
        "perMile": { "amount": 5, "currency": "usd" },
        "estimatedMonthlyMileage": 800,
        "estimatedMonthlyCost": { "amount": 9610, "currency": "usd" },
        "estimatedTermCost": { "amount": 28830, "currency": "usd" }
      },
      "paymentPlans": [
        {
          "default": true,
          "interval": "day",
          "intervalCount": 14,
          "dueToday": {
            "downPayment": { "amount": 4508, "currency": "usd" },
            "fees": [{ "type": "AUTO_THEFT_FEE", "name": "Automobile Theft Authority Fee", "amount": { "amount": 50, "currency": "usd" } }],
            "securityDeposit": { "amount": 5000, "currency": "usd" },
            "total": { "amount": 9558, "currency": "usd" }
          },
          "installment": { "amount": 4508, "currency": "usd" }
        }
      ],
      "clickToBuyUrl": "https://staging.just.insure/authenticate?code=pq7f3c9a2e41b8d605&redirectUri=https%3A%2F%2Fstaging.just.insure%2Fquote%2Fapplication",
      "warnings": []
    },
    {
      "id": "qq_01jaxk3m9w5b2c8d4e6f7g9h0j",
      "object": "quote",
      "product": "UNLIMITED",
      "expiresAt": "2026-11-14T06:59:59Z",
      "policyStartDate": "2026-10-15",
      "term": { "days": 90 },
      "package": {
        "type": "BASIC_FULL_COVER",
        "name": "Basic Full Cover",
        "coverages": [
          {
            "type": "BODILY_INJURY",
            "perPerson": { "amount": 2500000, "currency": "usd" },
            "perAccident": { "amount": 5000000, "currency": "usd" }
          },
          { "type": "PROPERTY_DAMAGE", "perAccident": { "amount": 1500000, "currency": "usd" } },
          { "type": "COLLISION", "deductible": { "amount": 100000, "currency": "usd" } },
          { "type": "COMPREHENSIVE", "deductible": { "amount": 100000, "currency": "usd" } },
          { "type": "GLASS" }
        ]
      },
      "price": {
        "type": "UNLIMITED",
        "perDay": { "amount": 312, "currency": "usd" },
        "termPremium": { "amount": 28080, "currency": "usd" }
      },
      "paymentPlans": [
        {
          "default": true,
          "interval": "day",
          "intervalCount": 14,
          "dueToday": {
            "downPayment": { "amount": 4368, "currency": "usd" },
            "fees": [{ "type": "AUTO_THEFT_FEE", "name": "Automobile Theft Authority Fee", "amount": { "amount": 50, "currency": "usd" } }],
            "securityDeposit": { "amount": 2808, "currency": "usd" },
            "total": { "amount": 7226, "currency": "usd" }
          },
          "installment": { "amount": 4368, "currency": "usd" }
        },
        {
          "default": false,
          "interval": "day",
          "intervalCount": 30,
          "dueToday": {
            "downPayment": { "amount": 9360, "currency": "usd" },
            "fees": [{ "type": "AUTO_THEFT_FEE", "name": "Automobile Theft Authority Fee", "amount": { "amount": 50, "currency": "usd" } }],
            "securityDeposit": { "amount": 2808, "currency": "usd" },
            "total": { "amount": 12218, "currency": "usd" }
          },
          "installment": { "amount": 9360, "currency": "usd" }
        }
      ],
      "clickToBuyUrl": "https://staging.just.insure/authenticate?code=pq0b6e8d1f73a2c94e&redirectUri=https%3A%2F%2Fstaging.just.insure%2Fquote%2Fapplication",
      "warnings": []
    }
  ],
  "declines": []
}

Request body#

Field names are camelCase and case-sensitive; enum values are UPPER_SNAKE_CASE. Dates are ISO 8601 calendar dates, YYYY-MM-DD only (no time, no other ISO 8601 forms such as 19910412); timestamps in responses are ISO 8601 in UTC. Money is { "amount": <integer cents>, "currency": "usd" }. Types are strict: "800" where a number is expected is a 400, not converted. Unknown fields are ignored.

Required is a 400 MISSING_FIELD if missing. Optional can be left out. Nullable also accepts null; any other field sent as null is INVALID_TYPE.

packageenumRequired

The Just package to price. See packages and the mapping guide.

MINIMUM_LIABILITYBASIC_FULL_COVERREGULAR_FULL_COVER
policyholderobjectRequired

The person buying the policy, who is also its main driver: name, date of birth, contact details, address, credit band and driving history. Fields.

additionalDriversarray of objects, 0–9Optional

Other drivers, not the policyholder. Fields.

vehiclesarray of objects, 1–10Required

One vehicle per request for now. Quotes for several vehicles are planned for a future version; until then, more than one vehicle is a MULTIPLE_VEHICLES_NOT_SUPPORTED decline. Fields.

productsarray of enumOptional

Which products to price, in this order. At least one, no repeats. Defaults to every live product: ["PAY_PER_MILE", "UNLIMITED"]. quotes and declines cover exactly these products.

PAY_PER_MILEUNLIMITED
policyStartDatedateOptional

From today to 60 days ahead, in the policyholder's time zone. Defaults to today. Full cover must start today. See start date rules.

notifyShopperbooleanOptional

Defaults to false: Just doesn't email the shopper. true sends Just's quote email. See records and email.

policyholder#

firstName, lastNamestring, not emptyRequired

The policyholder's name.

dateOfBirthdateRequired

A real calendar date, for example "1991-04-12".

genderenumRequired
MALEFEMALE
emailstring, emailRequired

Identifies the customer at Just. A new email creates a guest customer; a known email reuses that customer. Decides how clickToBuyUrl signs in.

emailVerifiedbooleanOptional

Defaults to false. Send true only when you have verified that the shopper controls email, for example with a code you sent there. Just honours it only for partners it has agreed to trust; then a shopper who has quoted with Just before, but never held a policy, also gets a one-click link. Ask your Just contact whether your account is trusted.

phonestring, E.164Optional Nullable

For example "+16025550143".

addressobjectRequired
Child attributes
statestringRequired

Two uppercase letters. Picks the state's products and packages. A state Just doesn't sell in is an UNSUPPORTED_STATE decline.

AZNVIN
zipCodestringRequired

12345 or 12345-6789; only the first five digits are used. A ZIP outside Just's area is an UNSUPPORTED_STATE decline at this path. A ZIP in a different state from state is a 400 INVALID_VALUE.

line1, line2, citystringOptional Nullable

Prefill the shopper's address on just.insure. Send line1 and city when you have them.

creditScoreinteger, 300–850One of

The shopper's self-reported credit score. Send it when you have the exact score.

creditScoreBandenumOne of

The shopper's self-reported credit band, when you don't have the exact score.

EXCELLENTGOODAVERAGEPOOR

Send exactly one of creditScore or creditScoreBand. Neither is a 400 CREDIT_SCORE_REQUIRED, both is CREDIT_SCORE_AMBIGUOUS, at policyholder.

priorInsuranceobjectOptional

The shopper's cover before this policy.

Child attributes
statusenumOptional

Left out, the shopper is rated as INSURED. NEVER_INSURED is rated like a lapse in cover.

INSUREDLAPSEDNEVER_INSURED
carrierstring, up to 255Optional Nullable

The previous insurer's name.

reasonForLapseenumOptional Nullable

Used only when status is LAPSED. Values in reference values.

homeOwnership, maritalStatus, education, employmentStatusenumOptional

Saved on the shopper's application. Send them when you have them. Values in reference values.

licenceobjectOptional

The policyholder's driver licence; prefills the application.

Child attributes
statestringRequired

Issuing state, two uppercase letters.

numberstring, not emptyRequired
historyobjectOptional

The policyholder's accidents, claims and violations. When sent, all three lists are required; send [] for none. Up to 50 events each.

Child attributes
accidents[]occurredOn, isAtFault, isAnyoneInjured, amountOfLoss

occurredOn is a date, isAtFault and isAnyoneInjured booleans, amountOfLoss Money. All required.

claims[]occurredOn, amountOfLoss

Non-accident claims, such as theft. Both required.

violations[]occurredOn, acdCode or severity

occurredOn, a date, is required, plus exactly one of acdCode or severity. Both, or neither, is a 400 VIOLATION_IDENTIFIER_AMBIGUOUS or VIOLATION_IDENTIFIER_REQUIRED at policyholder.history.violations[j].

acdCode, string: the violation's AAMVA ACD code, for example "S11", in any letter case. Prefer it when you know the exact violation: Just prices that violation. It must be a code Just rates in the policyholder's state, listed in ACD violation codes; any other is INVALID_ENUM_VALUE at policyholder.history.violations[j].acdCode.

severity, enum: the fallback when you don't know the code. Just rates it as a generic major or minor violation. Use this guide, which follows how Just classes the ACD codes:

SendForACD codes
MAJORDriving under the influence of alcohol or drugs, including refusing a test and underage drinking and driving; alcohol in the vehicle; hit and run or leaving an accident scene; racing; fleeing or evading police; using a vehicle in a felony; vehicular assault, homicide or manslaughter; a violation causing a fatal accident; a licence disqualification for serious violations.A04, A08, A10, A11, A12, A20–A23, A26, A31, A35, A60, A61, B01–B08, B13, S95, U01, U03, U05–U08, U31, W30
MINOREverything else: speeding, signals and signs, lanes and turns, following too closely, equipment and documents, and similar moving violations.Every other code in ACD violation codes

When in doubt, or for reckless or careless driving, send the acdCode rather than guessing a severity.

MINORMAJOR

additionalDrivers#

Other people who drive the vehicle, up to 9; leave it out or send [] when the policyholder is the only driver. The policyholder is never listed here. Any driver outside the insurable age range declines every product with DRIVER_NOT_ELIGIBLE, at policyholder or additionalDrivers[i].

relationshipenumRequired

Relationship to the policyholder.

SPOUSECHILDSIBLINGPARENTEMPLOYEEOTHER_RELATEDNON_RELATED
firstName, lastNamestring, not emptyRequired
dateOfBirthdateRequired

A real calendar date, for example "1992-09-30".

genderenumRequired
MALEFEMALE
licenceobjectOptional

Same fields as policyholder.licence.

historyobjectOptional

Same fields and rules as policyholder.history; violation problems are at additionalDrivers[i].history.violations[j].

vehicles#

Identify each vehicle by exactly one of vin or partialVin, and give its monthly mileage. A vehicle with neither is VEHICLE_IDENTIFIER_REQUIRED; with both, it's VEHICLE_IDENTIFIER_AMBIGUOUS. Year, make and model aren't accepted in v1; a vehicle sent only that way is VEHICLE_IDENTIFIER_REQUIRED.

IdentifierFieldsExample
Full VINvin{ "vin": "1GC0K9CG0BF213909", "estimatedMonthlyMileage": 600 }
Partial VINpartialVin{ "partialVin": "19XFA1F5*A", "estimatedMonthlyMileage": 800 }
vinstring

17 letters or digits. A VIN that doesn't decode to a vehicle Just knows is a VEHICLE_NOT_FOUND decline.

partialVinstring

The first 8 VIN characters, * in place of the check digit, then the 10th (model year) character: 19XFA1F5*A.

estimatedMonthlyMileageinteger, at least 1Required

Miles a month, echoed in the Pay-Per-Mile price. See mileage.

A vehicle Just doesn't insure is a VEHICLE_NOT_INSURABLE decline.

Request body · every field

The quote object#

A 200 returns quotes and declines; the call's id is in the Request-Id header, not the body. Every amount is Money in integer cents, never fractional. Response objects can gain fields and enums can gain values at any time; ignore what you don't know (see compatibility).

idstring

Just's id for this quote: qq_ followed by 26 lowercase letters and digits, for example qq_01jaxk3m9v3t7q8r2w4y6z0abc. Each quote has its own; a new call creates new quotes with new ids. Store it with the price you show, and send it to Just, with the call's Request-Id, in any question about the quote. Compare it as a whole string; don't parse it.

objectstring

Always "quote". Says what kind of object this is, so a stored or logged object explains itself. The qq_ prefix of id says the same.

productenum

Which product this quote is for.

PAY_PER_MILEUNLIMITED
expiresAtdate-time, UTC

When the price expires, 30 days after the quote. clickToBuyUrl stops working then. May carry milliseconds, for example 2026-11-14T06:59:59.999Z.

policyStartDatedate

The start date Just priced, in the policyholder's time zone.

termobject

days: the length of the term. 90.

packageobject

type is the package priced, the one you asked for. name is its display name, for example "Basic Full Cover". coverages lists what it covers; see below.

priceobject

The rate, shaped by product. See price.

paymentPlansarray of objects

How the term is billed. See payment plans.

clickToBuyUrlstring, URL

Opens this quote on just.insure. A credential; see sign-in.

warningsarray of objects

Notes about the quote. See declines and warnings.

price#

price.type matches product and decides the shape.

PAY_PER_MILEMeaning
perDayDaily rate.
perMileRate per mile driven.
estimatedMonthlyMileageThe mileage the estimates use, as you sent it. An integer, not Money.
estimatedMonthlyCostEstimated cost of 30 days at that mileage.
estimatedTermCostEstimated cost of the term: estimatedMonthlyCost × 3 for 90 days.
UNLIMITEDMeaning
perDayDaily rate.
termPremiumCost of the term: perDay × term.days.

paymentPlans#

Every plan is Scheduled Pay: the customer pays the first bill to start, then Just bills the same amount every cycle. Pay-Per-Mile bills every 14 days, at the estimate from estimatedMonthlyMileage; Just adjusts later bills up or down using the odometer readings the customer provides. Unlimited bills every 14 days (the default) or every 30 days. Show the plan with default: true first.

defaultboolean

The plan to show first. One per quote.

interval, intervalCountenum, integer

The billing cycle: every intervalCount intervals. Just expresses cycles in days: every 14 days is day × 14, every 30 days is day × 30 (not a calendar month).

dayweekmonth
dueTodayobject

What the customer pays to start. Show total as the price to start.

Child attributes
downPaymentMoney

The first bill: the first cycle's charge, the same amount as installment.

feesarray of objects

Fees charged on the first bill, one entry per fee; [] when there are none. Each has type (a stable code), name (for display) and amount (Money). Today the only fee is Arizona's AUTO_THEFT_FEE, "Automobile Theft Authority Fee", 50 cents per vehicle; other states have no fees.

securityDepositMoney

Refundable, and not premium.

totalMoney

downPayment + the sum of fees + securityDeposit.

installmentMoney

Each regular bill: one full cycle's charge, the same every cycle. For Pay-Per-Mile it's an estimate at estimatedMonthlyMileage; Just adjusts later bills using the customer's odometer readings, so installment is an estimate.

Every bill is a number of days × the daily rate:

Daily ratePay-Per-Mile: perDay + perMile × ⌈estimatedMonthlyMileage ÷ 30⌉, the miles a day rounded up. Unlimited: perDay.
First and regular billsCycle days × daily rate: downPayment and installment.

In the example on the right, Pay-Per-Mile's daily rate is 187 + 5 × ⌈800 ÷ 30⌉ = 187 + 5 × 27 = 322 cents. A 14-day bill is 4,508. In cents:

Pay-Per-Mile, 14 daysUnlimited, 14 daysUnlimited, 30 days
Daily rate322312312
First bill (downPayment)4,5084,3689,360
installment4,5084,3689,360
fees (Arizona), first bill only505050
securityDeposit, refundable5,0002,8082,808
dueToday.total9,5587,22612,218

Pay-Per-Mile bills start from the estimate and are adjusted using the customer's odometer readings. Fees and the security deposit are on top of the bills. The example is in Arizona, so each plan includes the 50-cent Automobile Theft Authority Fee.

package.coverages#

One entry per coverage in the package. A limit or deductible that doesn't apply is left out; GLASS, for example, has none.

typeenum

Values in reference values. A state that sells Uninsured and Underinsured Motorist BI as one cover returns UNINSURED_UNDERINSURED_MOTORIST_BI; otherwise they are separate entries.

perPerson, perAccidentMoney

Limits. Bodily Injury has both; Property Damage has perAccident.

deductibleMoney

For Collision and Comprehensive.

clickToBuyUrl sign-in#

Link the shopper to clickToBuyUrl from the price you show. It opens this quote on just.insure with the product and package selected. Whether it also signs the shopper in depends on who the email belongs to:

Shopper, by policyholder.emailThe link
New to JustSigns in with one click
Has quoted with Just before, never held a policy, and you sent emailVerified: true as a partner Just trustsSigns in with one click
Has quoted with Just before, never held a policy, otherwiseOpens the quote after the shopper signs in by email
Holds or has held a Just policyOpens the quote after the shopper signs in by email, always
Single useA one-click link signs in once. After that, the same link asks the shopper to sign in by email.
Expires with the quoteThe link works until the quote's expiresAt, 30 days at most.
A credentialDon't log it, cache it across shoppers or show it to anyone but this shopper. Each quote has its own link.
OpaqueBoth kinds of link are plain URLs. Don't parse them or build your own; their shape can change.

If Just can't create a one-click link, you still get a working link that asks the shopper to sign in. The quote is never dropped over the link.

Declines and warnings#

A decline says Just can't offer a product to this shopper. It's an answer, not an error: the call is still 200, and retrying the same request gives the same decline. Show no Just price for that product.

productenum

The product declined. Every requested product appears in either quotes or declines.

codeenum

Why. Branch on this. See decline codes.

messagestring

For people, in English. It can change; don't parse it.

pathstringOptional

The request field the decline is about, for example policyholder.address.zipCode or additionalDrivers[0].

warnings#

Each quote carries warnings: { code, message? }. A warning never stops you showing the quote. The list is empty today. VEHICLE_ASSUMED is reserved for a quote priced on a vehicle Just matched approximately; accept codes you don't know.

200 · one quote, one decline
{
  "quotes": [
    {
      "id": "qq_01jaxk3mb0n4p6r8s2t5v7x9zc",
      "object": "quote",
      "product": "PAY_PER_MILE",
      "expiresAt": "2026-11-14T06:59:59Z",
      "policyStartDate": "2026-10-15",
      "term": { "days": 90 },
      "package": {
        "type": "MINIMUM_LIABILITY",
        "name": "Minimum Liability",
        "coverages": [
          {
            "type": "BODILY_INJURY",
            "perPerson": { "amount": 2500000, "currency": "usd" },
            "perAccident": { "amount": 5000000, "currency": "usd" }
          },
          { "type": "PROPERTY_DAMAGE", "perAccident": { "amount": 1500000, "currency": "usd" } }
        ]
      },
      "price": {
        "type": "PAY_PER_MILE",
        "perDay": { "amount": 98, "currency": "usd" },
        "perMile": { "amount": 3, "currency": "usd" },
        "estimatedMonthlyMileage": 500,
        "estimatedMonthlyCost": { "amount": 4440, "currency": "usd" },
        "estimatedTermCost": { "amount": 13320, "currency": "usd" }
      },
      "paymentPlans": [
        {
          "default": true,
          "interval": "day",
          "intervalCount": 14,
          "dueToday": {
            "downPayment": { "amount": 2086, "currency": "usd" },
            "fees": [{ "type": "AUTO_THEFT_FEE", "name": "Automobile Theft Authority Fee", "amount": { "amount": 50, "currency": "usd" } }],
            "securityDeposit": { "amount": 5000, "currency": "usd" },
            "total": { "amount": 7136, "currency": "usd" }
          },
          "installment": { "amount": 2086, "currency": "usd" }
        }
      ],
      "clickToBuyUrl": "https://staging.just.insure/quote/application?quote=qq_01jaxk3mb0n4p6r8s2t5v7x9zc&utm_source=partner",
      "warnings": []
    }
  ],
  "declines": [
    {
      "product": "UNLIMITED",
      "code": "UNDERWRITING_DECLINED",
      "message": "Unlimited cannot be offered to this shopper."
    }
  ]
}

Decline codes#

The code of a decline. Every product means each requested product gets the same decline.

codeCategoryScopepathMeaningWhat to do
UNSUPPORTED_STATEEligibilityEvery productpolicyholder.address.stateJust doesn't sell in this state.Fine to call: hide Just for this shopper, or skip the call for other states.
UNSUPPORTED_STATEEligibilityEvery productpolicyholder.address.zipCodeThe ZIP is outside the area Just covers, or not one Just recognises.Check the ZIP.
UNSUPPORTED_STATEEligibilityThat productpolicyholder.address.stateThis product isn't sold in the state.Show the other product.
MULTIPLE_VEHICLES_NOT_SUPPORTEDEligibilityEvery productvehiclesMore than one vehicle.Fine to call: hide Just for this shopper, or skip the call for multi-vehicle households.
FUTURE_START_FULL_COVER_NOT_SUPPORTEDEligibilityEvery productpolicyStartDateA full-cover package with a start after today.Start today, or quote MINIMUM_LIABILITY.
VEHICLE_NOT_FOUNDEligibilityEvery productvehicles[0]The VIN or partial VIN doesn't decode to a vehicle Just knows.Check the VIN or partial VIN for typos and resend; if it's correct, Just can't quote this vehicle.
VEHICLE_NOT_INSURABLEEligibilityEvery productvehicles[0]Just doesn't insure this vehicle.Not quotable.
DRIVER_NOT_ELIGIBLEEligibilityEvery productpolicyholder or additionalDrivers[i]A driver is outside the insurable age range.Not quotable with that driver.
PACKAGE_NOT_AVAILABLEEligibilityThat productpackageThis product doesn't offer the package for this shopper.Try another package if your tiers allow.
UNDERWRITING_DECLINEDUnderwritingThat productnoneJust declined the risk, for example too many claims or violations.Not quotable.

New codes may be added. Treat a code you don't know as a decline for that product.

Compatibility policy#

The version is in the URL. Within /v1, Just only makes changes that don't break a client that follows the two rules below.

Can change at any time in v1New optional request fields. New response fields. New enum values, in responses and in decline, warning and field problem codes. Prices and eligibility.
Only in a new versionRemoving or renaming a field. Making an optional field required. Changing a field's type, unit or meaning. A new version runs alongside /v1 for at least 6 months.
✓

Your two rules. Ignore response fields you don't know, and handle enum values you don't know. If you validate responses against Just's schema, it allows both: objects are open and response enums list their known values as examples.

Reference values#

Every enum in the contract. Request enums are closed: anything else is INVALID_ENUM_VALUE. Response enums are open: expect values not listed here.

Shared

Product: request products[], response product

PAY_PER_MILEUNLIMITED

Package: request package, response package.type

MINIMUM_LIABILITYBASIC_FULL_COVERREGULAR_FULL_COVER

Money.currency

usd

Request

additionalDrivers[].relationship

SPOUSECHILDSIBLINGPARENTEMPLOYEEOTHER_RELATEDNON_RELATED

policyholder.gender, additionalDrivers[].gender

MALEFEMALE

policyholder.history.violations[].severity, additionalDrivers[].history.violations[].severity

MINORMAJOR

policyholder.history.violations[].acdCode, additionalDrivers[].history.violations[].acdCode

An AAMVA ACD code from the policyholder's state list, in any letter case. See ACD violation codes.

policyholder.creditScoreBand

EXCELLENTGOODAVERAGEPOOR

policyholder.homeOwnership

OWNRENTOTHER

policyholder.maritalStatus

SINGLEMARRIEDDIVORCEDWIDOWED

policyholder.education

LESS_THAN_HIGH_SCHOOLHIGH_SCHOOLVOCATIONALASSOCIATEBACHELORSMASTERSDOCTORATE

policyholder.employmentStatus

EMPLOYEDUNEMPLOYEDRETIREDOTHER

policyholder.priorInsurance.status

INSUREDLAPSEDNEVER_INSURED

policyholder.priorInsurance.reasonForLapse

MILITARY_DEPLOYMENTDID_NOT_OWN_OR_OPERATE_VEHICLEDOMESTIC_VIOLENCENATURAL_DISASTERSERIOUS_ILLNESS_OR_INJURYDEATH_OF_IMMEDIATE_FAMILY_MEMBERDIVORCE_OR_SEPARATIONINVOLUNTARY_JOB_LOSSIDENTITY_THEFTPRIOR_POLICY_CANCELLED_BY_INSURERINCARCERATIONLIVING_OUTSIDE_UNITED_STATESOTHER

Response

package.coverages[].type

BODILY_INJURYPROPERTY_DAMAGECOLLISIONCOMPREHENSIVEGLASSUNINSURED_MOTORIST_BIUNDERINSURED_MOTORIST_BIUNINSURED_UNDERINSURED_MOTORIST_BIUNINSURED_MOTORIST_PDMEDICAL_PAYMENTS

price.type

PAY_PER_MILEUNLIMITED

paymentPlans[].interval

dayweekmonth

declines[].code

UNSUPPORTED_STATEMULTIPLE_VEHICLES_NOT_SUPPORTEDFUTURE_START_FULL_COVER_NOT_SUPPORTEDVEHICLE_NOT_FOUNDVEHICLE_NOT_INSURABLEDRIVER_NOT_ELIGIBLEPACKAGE_NOT_AVAILABLEUNDERWRITING_DECLINED

quotes[].warnings[].code

VEHICLE_ASSUMED

Error type names and field problem codes are listed on the errors page.

ACD violation codes#

The AAMVA ACD codes Just rates, for policyholder.history.violations[].acdCode and additionalDrivers[].history.violations[].acdCode. Codes are case-insensitive. Just publishes the list per state. Today Arizona and Indiana accept the same 142 codes below, and Nevada accepts codes from the same list. A state's list can change, and lists can differ between states in future. A code that isn't on the policyholder's state list is INVALID_ENUM_VALUE; when you don't know the code, send severity instead.

142 codes
CodeDescription
A04Driving under the influence of alcohol with BAC at or over .04
A08Driving under the influence of alcohol with BAC at or over .08
A10Driving under the influence of alcohol with BAC at or over .10
A11Driving under the influence of alcohol with BAC at or over ___(detail field required)
A12Refused to submit to test for alcohol - Loss resulted
A20Driving under the influence of alcohol or drugs
A21Driving under the influence of alcohol
A22Driving under the influence of drugs
A23Driving under the influence of alcohol and drugs
A25Driving while impaired
A26Drinking alcohol while operating a vehicle
A31Illegal possession of alcohol
A35Possession of open alcohol container
A60—
A61Underage Administrative Per Se - drinking and driving at .02 or higher BAC
B01Hit and run - failure to stop and render aid after accident
B02Hit and run - failure to stop and render aid after accident - FATAL accident
B03Hit and run - failure to stop and render aid after accident - Personal injury accident
B04Hit and run - failure to stop and render aid after accident - Property damage accident
B05Leaving accident scene before police arrive
B06Leaving accident scene before police arrive - FATAL accident
B07Leaving accident scene before police arrive - Personal injury accident
B08Leaving accident scene before police arrive - Property damage accident
B13—
B20Driving while license withdrawn
B22Driving while license cancelled
B23Driving while license denied
B24Driving while license disqualified
B25Driving while license revoked
B26Driving while license suspended
B61Failed to file accident report
B91Failed to file future proof of financial responsibility
D06Misrepresentation of identity or other facts on application for driver license
D16Show or use improperly - Loss of Driver License
D29Violate restrictions of driver license (includes DL, CDL, and Instruction Permit)
D70Driver's view obstructed
E31Failure to obtain or display farm vehicle plates when required
E54Failure to use headlight dimmer as required
E55Failure to use lights as required
F03—
F06—
F22—
F34Stopping, standing, or parking: obstructing or impeding traffic
F35—
M04Failure to obey flagger
M08Failure to obey police or peace officer
M12Failure to obey safety zone
M16Failure to obey traffic signal or light
M19Failure to obey yield sign
M30Following improperly
M32Following emergency vehicle unlawfully
M33Following fire equipment unlawfully
M34Following too closely
M40Improper lane or location
M41Failure to keep in proper lane
M42Improper or erratic (unsafe) lane changes
M44Improper lane or location - crossover
M45Improper lane or location - crosswalk
M46Improper lane or location - entrance/exit ramp or way
M48Improper lane or location - in occupied lane
M49Improper lane or location - in HOV or restricted lane
M50Improper lane or location - limited access highway
M51Improper lane or location - median
M56Improper lane or location - on fire hose
M57Improper lane or location - oncoming traffic lane
M58Improper lane or location - road shoulder, ditch or sidewalk
M60Improper lane or location - slower vehicle lane
M61Improper lane or location - straddling center line(s)
M62Improper lane or location - traveling in turn (or center) lane
M70Improper passing
M71Passing in violation of posted sign or pavement marking
M73Passing on wrong side
M74Passing on hill or curve
M75Passing school bus displaying warning not to pass
M76Passing where prohibited
M77Passing with insufficient distance or visibility
M80Inattentive, careless, or negligent driving
M81Careless driving
M82Inattentive driving
M83Negligent driving
M84Reckless driving
N01Failure to yield right of way
N03Failure to yield right of way to cyclist
N04Failure to yield right of way to emergency vehicle (i.e. ambulance, fire equipment, police)
N05Failure to yield right of way to funeral pocession, procession or parade
N06Failure to yield right of way to other vehicle
N08Failure to yield right of way to pedestrian (includes handicapped or blind)
N20Failure to yield right of way at crosswalk
N22Failure to yield right of way at stop sign
N23Failure to yield right of way at traffic sign
N24Failure to yield right of way at traffic signal
N25Failure to yield right of way at unsigned intersection
N26Failure to yield right of way at yield sign
N31Failure to yield right of way W when turning
N40Failure to use or improper signal
N43Failure to signal lane change or turn
N44Giving wrong signal
N50Improper turn
N51Improper method of turning
N52Improper position for turning
N53Making improper left turn
N54Making improper right turn
N55Making improper turn around (not U turn)
N56Making improper U turn
N60Driving wrong way
N61Driving wrong way at rotary intersection
N62Driving wrong way on divided highway
N63Driving wrong way on one way street or road
N70Driving on wrong side
N71Driving on wrong side of divided highway
N72Driving on wrong side of undivided street or road
N82Improper backing
N83Improper start from parked position
S0101-05>Speed limit (detail optional)
S0606-10>Speed limit (detail optional)
S1111-15>Speed Limit (detail optional)
S14Speeding - 11-14 MPH over limit
S15Speeding 15 mph or more above speed limit (detail optional)
S1616-20>Speed limit (detail optional)
S2121-25>Speed limit (detail optional)
S2626-30>Speed limit (detail optional)
S3131-35 > Speed limit (detail optional)
S3636-40>Speed limit (detail optional)
S4141+ >Speed limit (detail optional)
S5101-10>Speed limit (detail optional)
S6111-20>Speed limit (detail optional)
S7121-30>Speed limit (detail optional)
S8131-40>Speed limit (detail optional)
S9141+>Speed limit (detail optional)
S94Prima Facie speed violation or driving too fast for conditions
S95Speed contest (racing) on road open to traffic
S96Speed less than minimum
S97Operating at erratic or suddenly changing speeds
S99Speeding in a school zone
U01Fleeing or evading police or roadblock
U03Using a motor vehicle in connection with a felony (not traffic offense)
U05Using a motor vehicle to aid and abet a felon
U06Vehicular assault
U07Vehicular homicide
U08Vehicular manslaughter
U31Violation resulting in fatal accident
W3060 day disqualification due to 2 serious violations in 3 years

Changelog#

15 October 2026 · v1

First release of the Quotes API: POST /v1/quotes returns RC1 quotes for Just Pay-Per-Mile and Just Unlimited in Arizona, Nevada and Indiana, with per-product declines, amounts in integer cents, RFC 9457 errors and a single-use clickToBuyUrl. A vehicle is identified by vin or partialVin.

Request shape: policyholder holds the policyholder's own driver details (name, date of birth, gender, licence, history); additionalDrivers lists any other drivers.

Planned: identify a vehicle by year, make and model; quote several vehicles in one request.

Questions go to your Just partnership contact. Include the Request-Id response header of the call, and the quote's id for a question about a quote, so Just can find it.