{"openapi":"3.1.0","info":{"title":"ShopInsure Agent Quote API","version":"1.0.0","description":"Florida home insurance shopping with local coverage and policy support from Greene Insurance. Request carrier prices for a consenting customer, then let them continue with Jenna. No developer account, API key, CAPTCHA, or assistant allowlist. Private per-quote tokens are issued automatically. Do not invent facts or treat a price as bound coverage. Existing guest limits apply, including three carrier checks per source network per hour; honor Retry-After."},"servers":[{"url":"https://shopinsure.ai"}],"security":[],"paths":{"/carriers.json":{"get":{"operationId":"listQuotingMarkets","summary":"Read the verified Florida quoting panel, count and review date","security":[],"description":"Public dated catalog, with no customer information or authentication. A listed market does not guarantee eligibility or a returned rate. Count includes insurance brands and Amwins market access.","responses":{"200":{"description":"Catalog scope, availability caveat, reviewedAt, marketCount and markets with descriptions, official sources and per-market quoteTypes. Current online forms are HO3 and DP3; HO6 is not connected.","content":{"application/json":{"schema":{"type":"object","required":["reviewedAt","marketCount","markets"],"properties":{"reviewedAt":{"type":"string","format":"date"},"marketCount":{"type":"integer"},"quoteTypes":{"type":"array","items":{"enum":["HO3","DP3"]}},"markets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"kind":{"enum":["insurance_brand","market_access"]},"description":{"type":"string"},"descriptionSource":{"type":"string","format":"uri"},"quoteTypes":{"type":"array","items":{"enum":["HO3","DP3"]}},"url":{"type":"string","format":"uri"}}}}}}}}}}}},"/api/agent/quotes/prepare":{"post":{"operationId":"prepareHomeQuote","summary":"Send known answers; receive only missing questions and a pricing review","security":[],"description":"Use customerConsent:true only when the customer authorized sharing their details. Reuse draftToken for additions/corrections. One applicant supplies DOB; ownershipName preserves all owners. Omit unknown facts. No carrier request is made here. Keep the encrypted draftToken private; it expires after 24 hours.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Preparation"}}}},"responses":{"200":{"description":"needs_information or ready_to_submit, questions, review, assumptions, draftToken, expiresAt. Show review and assumptions to the customer before submitting.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Draft"}}}},"400":{"description":"Invalid JSON."},"401":{"description":"Use the automatic quoteToken for this quote."},"404":{"description":"Quote unavailable or moved to the customer's account."},"409":{"description":"Draft was already submitted with different details, or review changed. Read the error before creating another request."},"410":{"description":"The private draft or continuation link expired."},"413":{"description":"Request exceeds 64 KiB."},"415":{"description":"Use application/json."},"422":{"description":"Missing information or customer confirmation. Response identifies fields to correct."},"429":{"description":"Rate limited. Wait for Retry-After and retry the same draft/token.","headers":{"Retry-After":{"schema":{"type":"integer"}}}},"502":{"description":"Carrier response unavailable or uncertain. If manualReviewRequired is true, do not create another submission."},"503":{"description":"Temporarily unavailable. Retry the same draft/token after Retry-After."}}}},"/api/agent/quotes":{"get":{"operationId":"discoverQuoteApi","summary":"Read API instructions","security":[],"responses":{"200":{"description":"Discovery metadata."}}},"post":{"operationId":"requestHomePrices","summary":"Request prices for a customer-confirmed draft","security":[],"description":"Only submit after the customer reviews the details and assumptions and asks for prices. Repeated submissions of the same draft recover the same quote rather than re-rating it. Persist quoteToken immediately. If submission is uncertain, poll the returned quote instead of creating a new draft.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["draftToken","customerConfirmed"],"properties":{"draftToken":{"type":"string","maxLength":48000},"customerConfirmed":{"const":true}}}}}},"responses":{"200":{"description":"Quote receipt, automatic quoteToken, quoteId, expiry and status URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"202":{"description":"Submission still processing. Poll the same quote."},"400":{"description":"Invalid JSON."},"401":{"description":"Use the automatic quoteToken for this quote."},"404":{"description":"Quote unavailable or moved to the customer's account."},"409":{"description":"Draft was already submitted with different details, or review changed. Read the error before creating another request."},"410":{"description":"The private draft or continuation link expired."},"413":{"description":"Request exceeds 64 KiB."},"415":{"description":"Use application/json."},"422":{"description":"Missing information or customer confirmation. Response identifies fields to correct."},"429":{"description":"Rate limited. Wait for Retry-After and retry the same draft/token.","headers":{"Retry-After":{"schema":{"type":"integer"}}}},"502":{"description":"Carrier response unavailable or uncertain. If manualReviewRequired is true, do not create another submission."},"503":{"description":"Temporarily unavailable. Retry the same draft/token after Retry-After."}}}},"/api/agent/quotes/{quoteId}":{"get":{"operationId":"getHomePrices","summary":"Read this customer's carrier prices","security":[{"quoteToken":[]}],"parameters":[{"in":"path","name":"quoteId","required":true,"schema":{"type":"string","format":"uuid"}}],"description":"Use Authorization: Bearer <quoteToken>, received automatically on submission. Poll no faster than Retry-After (normally five seconds). Never send tokens in query strings. Prices still need agency review and exclude full coverage terms. Null premiums and no_rate do not mean a confirmed underwriting decline.","responses":{"200":{"description":"processing, complete, or error, with returned rates and manualReviewRequired where applicable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"202":{"description":"Submission in progress."},"400":{"description":"Invalid JSON."},"401":{"description":"Use the automatic quoteToken for this quote."},"404":{"description":"Quote unavailable or moved to the customer's account."},"409":{"description":"Draft was already submitted with different details, or review changed. Read the error before creating another request."},"410":{"description":"The private draft or continuation link expired."},"413":{"description":"Request exceeds 64 KiB."},"415":{"description":"Use application/json."},"422":{"description":"Missing information or customer confirmation. Response identifies fields to correct."},"429":{"description":"Rate limited. Wait for Retry-After and retry the same draft/token.","headers":{"Retry-After":{"schema":{"type":"integer"}}}},"502":{"description":"Carrier response unavailable or uncertain. If manualReviewRequired is true, do not create another submission."},"503":{"description":"Temporarily unavailable. Retry the same draft/token after Retry-After."}}}},"/api/agent/quotes/{quoteId}/continue":{"post":{"operationId":"continueChosenPrice","summary":"Create a private customer link for their chosen price","security":[{"quoteToken":[]}],"parameters":[{"in":"path","name":"quoteId","required":true,"schema":{"type":"string","format":"uuid"}}],"description":"Use only the rateId your customer chose. Give the returned link privately to that customer. It lasts 30 minutes; a newly generated link replaces the previous one. The customer signs in to keep the quote and decides when to contact Jenna. Generating this link sends no email and binds no coverage. Agent access ends when the quote moves into the customer's account.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["rateId"],"properties":{"rateId":{"type":"string","minLength":1,"maxLength":160}}}}}},"responses":{"200":{"description":"Private continueUrl and expiresAt.","content":{"application/json":{"schema":{"type":"object","properties":{"continueUrl":{"type":"string","format":"uri"},"expiresAt":{"type":"string","format":"date-time"}}}}}},"400":{"description":"Invalid JSON."},"401":{"description":"Use the automatic quoteToken for this quote."},"404":{"description":"Quote unavailable or moved to the customer's account."},"409":{"description":"Draft was already submitted with different details, or review changed. Read the error before creating another request."},"410":{"description":"The private draft or continuation link expired."},"413":{"description":"Request exceeds 64 KiB."},"415":{"description":"Use application/json."},"422":{"description":"Missing information or customer confirmation. Response identifies fields to correct."},"429":{"description":"Rate limited. Wait for Retry-After and retry the same draft/token.","headers":{"Retry-After":{"schema":{"type":"integer"}}}},"502":{"description":"Carrier response unavailable or uncertain. If manualReviewRequired is true, do not create another submission."},"503":{"description":"Temporarily unavailable. Retry the same draft/token after Retry-After."}}}}},"components":{"securitySchemes":{"quoteToken":{"type":"http","scheme":"bearer","description":"Automatically issued for one quote; not a developer API key. No registration. Expires in seven days or when the customer claims the quote."}},"schemas":{"Preparation":{"type":"object","additionalProperties":false,"required":["customerConsent"],"properties":{"customerConsent":{"const":true},"agentName":{"type":"string","maxLength":120,"description":"Optional self-reported assistant name; never used for authorization."},"draftToken":{"type":"string","maxLength":48000,"description":"Reuse when adding or correcting answers."},"applicant":{"type":"object","additionalProperties":false,"description":"One person's details. Include their firstName and lastName each time dateOfBirth is supplied. Preserve hyphens and Unicode names.","properties":{"firstName":{"type":"string","minLength":1,"maxLength":500},"lastName":{"type":"string","minLength":1,"maxLength":500},"dateOfBirth":{"type":"string","format":"date"},"email":{"type":"string","format":"email"},"phone":{"type":"string","description":"US ten-digit phone number."}}},"answers":{"type":"object","additionalProperties":false,"properties":{"quoteType":{"type":"string","minLength":1,"maxLength":500,"enum":["ho3","dp3"]},"phoneType":{"type":"string","minLength":1,"maxLength":500,"enum":["Mobile","Home","Business"]},"currentHomeAddress":{"type":"string","minLength":1,"maxLength":500},"propertyAddress":{"type":"string","minLength":1,"maxLength":500},"effectiveDate":{"type":"string","minLength":1,"maxLength":500,"format":"date"},"purchaseStatus":{"type":"string","minLength":1,"maxLength":500,"enum":["Owned","Buying"]},"ownership":{"type":"string","minLength":1,"maxLength":500,"enum":["Individual","Trust","Estate","LLC"]},"ownershipName":{"type":"string","minLength":1,"maxLength":500,"description":"All owners exactly as supplied, including joint or hyphenated names."},"occupancy":{"type":"string","minLength":1,"maxLength":500,"enum":["Owner","Tenant","Vacant"]},"usage":{"type":"string","minLength":1,"maxLength":500,"enum":["Primary","Rental","Seasonal","Secondary","Vacant"]},"currentCarrier":{"type":"string","minLength":1,"maxLength":500},"currentPremium":{"type":"string","minLength":1,"maxLength":500},"shoppingGoal":{"type":"string","minLength":1,"maxLength":500},"dwellingA":{"type":"string","minLength":1,"maxLength":500},"roofYear":{"type":"string","minLength":1,"maxLength":500},"roofMaterial":{"type":"string","minLength":1,"maxLength":500,"enum":["3-Tab Shingle","Metal","Tile","Flat","Architectural"]},"roofShape":{"type":"string","minLength":1,"maxLength":500,"enum":["Gable","Hip","Other","Flat"]},"squareFeet":{"type":"string","minLength":1,"maxLength":500},"yearBuilt":{"type":"string","minLength":1,"maxLength":500},"protectionClass":{"type":"string","minLength":1,"maxLength":500,"enum":["8 or less","9","10"]},"constructionType":{"type":"string","minLength":1,"maxLength":500,"enum":["Frame","Masonry","Masonry Veneer","Superior"]},"exteriorWallFinish":{"type":"string","minLength":1,"maxLength":500,"enum":["Hardie or fiber-cement siding","Stucco","Vinyl, aluminum, or wood siding","Brick or stone veneer","Not sure"]},"dwellingType":{"type":"string","minLength":1,"maxLength":500,"enum":["Single Family","Duplex","Triplex","Quadplex","Row or Town House","Modular Home"]},"houseNumber":{"type":"string","minLength":1,"maxLength":500},"street":{"type":"string","minLength":1,"maxLength":500},"city":{"type":"string","minLength":1,"maxLength":500},"county":{"type":"string","minLength":1,"maxLength":500},"state":{"type":"string","minLength":1,"maxLength":500,"enum":["FL"]},"zipCode":{"type":"string","minLength":1,"maxLength":500}}}}},"Draft":{"type":"object","properties":{"status":{"enum":["needs_information","ready_to_submit"]},"draftToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"questions":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"question":{"type":"string"}}}},"review":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"label":{"type":"string"},"value":{"type":"string"},"source":{"type":"string"}}}},"assumptions":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"}}}}}},"Quote":{"type":"object","properties":{"quoteId":{"type":"string","format":"uuid"},"quoteToken":{"type":"string"},"status":{"enum":["processing","complete","error"]},"manualReviewRequired":{"type":"boolean"},"statusUrl":{"type":"string","format":"uri"},"expiresAt":{"type":"string","format":"date-time"},"nextRateCheckAt":{"type":["string","null"],"format":"date-time","description":"Optional follow-up time for a completed quote with a blank carrier result. Read the same status URL at this time to collect a possible late price; do not submit another quote. Returned prices can be selected immediately. Follow-up checks expire after three minutes."},"rates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"carrier":{"type":"string"},"annualPremium":{"type":["number","null"]},"status":{"type":"string"},"formType":{"type":"string"}}}}}}}}}