Server definition
- Hash
- sha256:3703d9f889d9ba5a1c2187041318fadd36d09672319f4594fd3ecebf62c90d6c
- What it is
- What a remote MCP server returned when asked what it offers: 12 tools
The blob, as servednamed by its sha256
{
"instructions": "How to use this connector, in this order:\n1. next_question: call it until ready_to_quote is true, sending back the collected it returns each time and each answer under answer_as.key.\n2. start_quote: once, with that collected. It returns a quote_id.\n3. get_quote: with that quote_id, after poll_after_seconds, until more_carriers_pending is false. If start_quote answers quote_in_progress, never call start_quote again: the rating running is the one you started, and get_quote reads it.\nEvery refusal carries next_step, which says what to do; message is what the customer hears.\nA vehicle a business uses for its work is commercial auto, which is not quoted here: use commercial_next_question until ready_to_submit is true, then submit_commercial_application once.\nSigo Seguros is a licensed insurance agency and broker. It does not underwrite policies, does not pay claims, and is not an insurance carrier. This connector returns non-binding estimates for car insurance in the US states Sigo is licensed in. It cannot select a policy, take payment or bind coverage: a customer who wants to buy continues through the link included with each estimate.\n\nLanguage: the customer's own. Someone who writes in English is answered in English, start to finish; someone who writes in Spanish, in Spanish. Whichever it is, it goes in `locale` as well, because that is the language the estimate's notice comes back in — a disclosure the customer cannot read discloses nothing. Sigo serves these two languages and writes its notices in them, so a customer writing in a third is answered in whichever of the two they are likelier to read, and told which two those are, rather than left expecting service in a language Sigo does not have.\n\nHow Sigo is paid, because customers ask and the answer is not in the numbers: Sigo earns a commission from the carrier, and in almost every state where it sells, the customer pays a one-time broker fee for the agency's service. Whether there is one depends on the state — in Florida there is none — and `charges_broker_fee` on a quote says which case this customer is in, rather than leaving it to be assumed either way. The amounts in an estimate are the carrier's — its premium and its own charges — and Sigo's fee is not among them: it is itemised for the customer before they pay, in Sigo's own flow. No amount or percentage appears in anything this connector returns, and none can be worked out from it. An estimate is not the final cost of buying through Sigo.\n\nGathering the details is a conversation, not a form. Sigo's customers are working people, often quoting on a phone, and a wall of required fields is where they give up. `next_question` says what to ask now and what options to offer; ask that, wait for the answer, and ask it again — the order and the pace come from there rather than from judgement. What the customer already said is carried over, never asked twice. Plain language over insurance vocabulary.\n\nThe first estimates come from very little, so they are the opening and not the end. The quote is finished here: a second round — where the car is kept, the VIN, who owns it, the licence, what they do — prices the same application again, still as estimates, and then the chosen carrier's own declarations complete it. No price returned here is final: Sigo calculates the final quote in the link, after those declarations and before the customer pays. `to_final_quote` names the next call at every point, and following it is the default: it is what turns three rough numbers into the application the final quote is calculated on.\n\nThe link is the way out, not the way on. It is there for a customer who would rather finish on their own or who wants a Sigo agent to call them, and everything answered here is already on their application when they open it — so it is offered after the next step, not instead of it. Nothing in the connector promises a better price, and a carrier that has not answered is not a price: the list closes with what arrived.\n\nOne quote at a time for one customer. The carriers answer one question per person at a time, so a second quote started while the first is still being answered is refused with `quote_in_progress` rather than answered with the wrong prices. The customer hears what is happening — the earlier prices are still coming, the new question follows right after — and two asks made together are run one after the other, each labelled by its own `asked_for`, so a comparison lines up the right numbers.\n\nNobody is called from a car quote here, because a car quote takes no phone number — a fact about this channel, not about Sigo, whose agents call customers every day. A customer who asks to be called is told where to leave a number: the link on their estimate, which opens Sigo's own flow. Telling them Sigo does not call talks them out of the one thing this connector is for.\n\nCommercial auto is the one other thing this connector does, and it does not quote it. A contractor's truck, a delivery van, a tow truck or a fleet — any vehicle a business uses for its work — goes through `commercial_next_question`: a short intake, asked one question at a time in the website's own words, that ends with `submit_commercial_application` sending it to a Sigo agent, who follows up by email and quotes it with the carriers. It takes the business's name, a contact, a phone and an email for that follow-up, and never a social security number, a FEIN or a date of birth. There is no price, premium or fee to give for it, and no state or carrier to promise: any quote is subject to underwriting, eligibility and state filing. Someone who drives only for Uber, Lyft, DoorDash or Uber Eats is not commercial — its first question says so, and they go to `next_question`.\n\nEvery estimate carries a notice, and it reaches the customer as written, in the same answer as the price: it is one sentence, and the words in it — underwriting, eligibility, state filing — are the disclosure itself, not decoration on it. A summary of it is not that disclosure, which is why the field says so rather than leaving it to judgement.\n\nThe same holds for answers. A reply is read on a phone, between other things, so it is short and ends with one question or one step. Asked how to bring the price down, the answer comes from `price_levers` in the quote — what this step can actually change — and not from a list of every factor insurance prices on. What the levers do not cover is reviewed later with a Sigo agent, and saying so is a shorter and truer answer than re-quoting something that will come back the same.",
"tools": [
{
"description": "After carrier_questions: file the answers, passing answers_so_far back each time, until the set is complete.\n\nSaves what the customer answered against their application, which is what moves it towards a final quote. Send every answer under the code it came back with, and only what the customer actually said.\n\nThis does not take payment, sign anything or bind coverage. Those happen in Sigo's own flow, through the link that comes back here.\n\nThe carrier takes its questions as a set, so answers are held until every one has been given. Pass the `answers_so_far` from the previous call back in, and only the new answer needs to go in `answers`.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"answers": {
"description": "What the customer said, in their own answers. Never filled in on their behalf.",
"items": {
"additionalProperties": false,
"properties": {
"code": {
"description": "The question's code, exactly as it came back.",
"minLength": 1,
"type": "string"
},
"value": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "boolean"
}
],
"description": "What the customer answered."
}
},
"required": [
"code",
"value"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"answers_so_far": {
"description": "The `answers_so_far` from the previous call, when there was one. It carries what the customer already answered, so only the new answer needs to go in `answers`. It survives a re-quote: after start_quote with revise_of, send the same token with the new quote_id and the answers still stand, as long as the carrier is the same one. Nobody has to be asked twice.",
"type": "string"
},
"chosen_quote_id": {
"description": "The estimate the customer picked.",
"minLength": 1,
"type": "string"
},
"locale": {
"description": "The language the customer is writing in. Set it from their own messages rather than leaving the default: the estimate's notice comes back in this language, and a notice the customer cannot read discloses nothing. Sigo serves these two languages only.",
"enum": [
"es",
"en"
],
"type": "string"
},
"quote_id": {
"description": "The handle start_quote returned.",
"minLength": 1,
"type": "string"
}
},
"required": [
"quote_id",
"chosen_quote_id",
"answers",
"locale"
],
"type": "object"
},
"name": "answer_carrier_questions",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"answered": {
"description": "How many of the carrier's questions have an answer so far, counting the earlier turns.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"answers_so_far": {
"description": "Everything answered up to now, to pass back on the next call so nothing is lost. Null once the carrier has the set and there is nothing left to carry.",
"type": [
"string",
"null"
]
},
"filed": {
"description": "True once the carrier has the whole set. The carrier takes it whole or not at all, so answers are held until every required question has one.",
"type": "boolean"
},
"next_call": {
"description": "Exactly what to call next, with its arguments, when something follows here; null otherwise.",
"type": [
"string",
"null"
]
},
"next_step": {
"additionalProperties": false,
"description": "Paying and signing happen here, not in this conversation.",
"properties": {
"action": {
"const": "continue_with_sigo",
"type": "string"
},
"note": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"action",
"url",
"note"
],
"type": "object"
},
"note": {
"description": "What is done and what is still ahead, in the customer's language.",
"type": "string"
},
"quote_id": {
"description": "Present once CoverCube's answers are filed: read the confirmed price with get_quote using this quote_id, which replaces the earlier one.",
"type": [
"string",
"null"
]
},
"still_needed": {
"description": "The codes of the required questions with no answer yet. Empty when the set is complete.",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"answered",
"filed",
"still_needed",
"answers_so_far",
"note",
"next_call",
"next_step"
],
"type": "object"
}
},
{
"description": "After other_carrier_questions: file the answers, passing answers_so_far back each time, until the set is complete.\n\nSaves what the customer answered against their application. Once every required question has an answer the whole pass is filed, Sigo selects the cheapest of the other carriers, and a Sigo agent confirms the final offer with the customer. Send every answer under the code it came back with, and only what the customer actually said.\n\nThis shows no price and does not take payment, sign anything or bind coverage.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"answers": {
"description": "What the customer said, in their own answers. Never filled in on their behalf.",
"items": {
"additionalProperties": false,
"properties": {
"code": {
"description": "The question's code, exactly as it came back.",
"minLength": 1,
"type": "string"
},
"value": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "boolean"
}
],
"description": "What the customer answered."
}
},
"required": [
"code",
"value"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"answers_so_far": {
"description": "The `answers_so_far` from the previous call, when there was one: it carries what the customer already answered, so only the new answers need to go in `answers`.",
"type": "string"
},
"locale": {
"description": "The language the customer is writing in. Set it from their own messages rather than leaving the default: the estimate's notice comes back in this language, and a notice the customer cannot read discloses nothing. Sigo serves these two languages only.",
"enum": [
"es",
"en"
],
"type": "string"
},
"quote_id": {
"description": "The handle start_quote returned.",
"minLength": 1,
"type": "string"
}
},
"required": [
"quote_id",
"answers",
"locale"
],
"type": "object"
},
"name": "answer_other_carrier_questions",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"answered": {
"description": "How many of the carrier's questions have an answer so far, counting the earlier turns.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"answers_so_far": {
"description": "Everything answered up to now, to pass back on the next call so nothing is lost. Null once the carrier has the set and there is nothing left to carry.",
"type": [
"string",
"null"
]
},
"filed": {
"description": "True once the whole pass is filed and the cheapest of the other carriers is selected.",
"type": "boolean"
},
"next_step": {
"additionalProperties": false,
"description": "Paying and signing happen through the link, after an agent confirms.",
"properties": {
"action": {
"const": "continue_with_sigo",
"type": "string"
},
"note": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"action",
"url",
"note"
],
"type": "object"
},
"note": {
"description": "What is done and what is still ahead, in the customer's language.",
"type": "string"
},
"still_needed": {
"description": "The codes of the required questions with no answer yet. Empty when the set is complete.",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"answered",
"filed",
"still_needed",
"answers_so_far",
"note",
"next_step"
],
"type": "object"
}
},
{
"description": "After the three steps, when to_final_quote.next_call names it: the questions of the estimate the customer picked. Then answer_carrier_questions.\n\nOnce the customer has picked an estimate, this returns the questions that carrier asks in their state — attestations and disclosures the carrier words itself. Say `preamble` first, then ask one `ask_together` block per turn, each question exactly as it is worded; they are not Sigo's questions to reword. Send the answers with `answer_carrier_questions`.\n\n`can_answer_here` is false where that carrier does not finish online, and then a Sigo agent takes it from there. Either way the customer keeps the link: they can finish on the web at any point without losing what they have answered.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"chosen_quote_id": {
"description": "The `quote_id` of the estimate the customer picked, from the list they were shown.",
"minLength": 1,
"type": "string"
},
"locale": {
"description": "The language the customer is writing in. Set it from their own messages rather than leaving the default: the estimate's notice comes back in this language, and a notice the customer cannot read discloses nothing. Sigo serves these two languages only.",
"enum": [
"es",
"en"
],
"type": "string"
},
"quote_id": {
"description": "The handle start_quote returned.",
"minLength": 1,
"type": "string"
}
},
"required": [
"quote_id",
"chosen_quote_id",
"locale"
],
"type": "object"
},
"name": "carrier_questions",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"ask_together": {
"description": "Codes that can be put to the customer in one turn, grouped the way the carrier groups them. Ask each block as one message and send its answers together. A question with `depends_on` is in no block: it gets its own turn, after the one it hangs off. Empty when there is nothing to ask here.",
"items": {
"items": {
"type": "string"
},
"type": "array"
},
"type": "array"
},
"can_answer_here": {
"description": "False when there is nothing to ask here yet: the application is still missing details, or the carrier does not finish online in this state. Check `still_needed` to tell the two apart.",
"type": "boolean"
},
"next_step": {
"additionalProperties": false,
"description": "Where the customer finishes. Theirs at any point, not only at the end.",
"properties": {
"action": {
"const": "continue_with_sigo",
"type": "string"
},
"note": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"action",
"url",
"note"
],
"type": "object"
},
"note": {
"description": "How to put these, in the customer's language.",
"type": "string"
},
"preamble": {
"description": "Sigo's own words for the customer, to say as they are before the first question. Not one of the carrier's questions and not answered. Null when there is nothing to ask here.",
"type": [
"string",
"null"
]
},
"questions": {
"description": "In the order the platform ranked them.",
"items": {
"additionalProperties": false,
"properties": {
"answer_type": {
"description": "What kind of answer it takes, as the platform types it — `yes_no` on every question seen so far. Send a boolean for those; anything else goes as text.",
"type": "string"
},
"code": {
"description": "Send the answer back under this code.",
"type": "string"
},
"depends_on": {
"description": "The code of the question this one hangs off. Ask it only once that one is answered; null when it stands on its own.",
"type": [
"string",
"null"
]
},
"required": {
"type": "boolean"
},
"wording": {
"description": "The carrier's own words, in the customer's language. Ask it as it is written: do not reword it, do not soften it, and do not turn it around. The customer is attesting to this for the record.",
"type": "string"
},
"wording_language": {
"description": "The language `wording` is in, which is the conversation's own. A carrier with no wording in it is not answered here at all: `can_answer_here` is false and a Sigo agent takes it.",
"enum": [
"es",
"en"
],
"type": "string"
}
},
"required": [
"code",
"wording",
"wording_language",
"answer_type",
"required",
"depends_on"
],
"type": "object"
},
"type": "array"
},
"still_needed": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "What the application still lacks, when that is why the questions are not here. An empty array means nothing is missing. Null means this is not about the application at all — either the questions came back, or the carrier does not finish online here."
}
},
"required": [
"can_answer_here",
"still_needed",
"questions",
"ask_together",
"preamble",
"note",
"next_step"
],
"type": "object"
}
},
{
"description": "Commercial auto, step 1 of 2: call it until ready_to_submit is true, sending back the collected it returns each time and each answer under answer_as.key. Then submit_commercial_application.\n\nFor a vehicle a business owns or uses for its work: a contractor's pickup, a delivery van, a box truck, a tow truck, a fleet. It takes the short intake Sigo's commercial form opens with, one question at a time in the customer's language, and a Sigo agent quotes it with the carriers afterwards. There is no estimate and no price here, and none to give: say any quote is subject to underwriting, eligibility and state filing.\n\nIts first question tells a business apart from someone who drives only for Uber, Lyft, DoorDash or Uber Eats. That is personal auto: route_to_personal turns true, nothing commercial is sent, and next_question takes it from there. When it is not clear which kind of customer this is, start here.\n\nAsk `ask` as the website words it, with its options, and wait for the answer. It never asks for a social security number, a FEIN or EIN, a date of birth or a licence number; do not collect them.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"answered": {
"additionalProperties": false,
"description": "Only what the customer said this turn, under answer_as.key. Everything earlier is in `collected`.",
"properties": {
"business_name": {
"maxLength": 200,
"type": "string"
},
"business_state": {
"description": "The state the business's physical address is in: its two-letter code (TX) or its name in English or Spanish (Texas, Nuevo México).",
"maxLength": 40,
"type": "string"
},
"business_type": {
"enum": [
"contractor",
"delivery",
"rideshare",
"trucking",
"towing",
"homeServices",
"foodTruck",
"other"
],
"type": "string"
},
"business_type_other": {
"description": "Only when business_type is `other`: what the business does, in the customer's words.",
"maxLength": 200,
"type": "string"
},
"contact_name": {
"maxLength": 200,
"type": "string"
},
"email": {
"maxLength": 200,
"type": "string"
},
"filing_required": {
"enum": [
"yes",
"no",
"notSure"
],
"type": "string"
},
"for_hire": {
"type": "boolean"
},
"phone": {
"description": "A US number, as the customer gave it.",
"maxLength": 40,
"type": "string"
},
"radius": {
"enum": [
"local",
"intermediate",
"longHaul"
],
"type": "string"
},
"vehicle_count": {
"maximum": 99,
"minimum": 1,
"type": "integer"
},
"vehicle_use": {
"description": "The first question: apps only, or a business.",
"enum": [
"appDriver",
"business"
],
"type": "string"
},
"weight_class": {
"enum": [
"light",
"medium",
"heavy"
],
"type": "string"
}
},
"type": "object"
},
"collected": {
"description": "The `collected` from the previous call. Leave it out on the first question and send it on every call after that. It is not the quote flow's collected: the two do not mix.",
"type": "string"
},
"locale": {
"description": "The language the customer is writing in. Set it from their own messages: the questions come back in it, and the request is filed in it so the Sigo agent follows up in it.",
"enum": [
"es",
"en"
],
"type": "string"
}
},
"required": [
"locale"
],
"type": "object"
},
"name": "commercial_next_question",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"answer_as": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"key": {
"description": "The exact key to send this answer under in `answered` on the next call.",
"type": "string"
},
"type": {
"enum": [
"string",
"integer",
"boolean",
"enum"
],
"type": "string"
},
"values": {
"description": "For `enum`: the only values accepted. values[i] is what options[i] means.",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"key",
"type"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "How to send the answer back. Null once nothing is left to ask."
},
"ask": {
"description": "The website's own wording of the question, in the customer's language. Put it to them as it is; do not reword the options.",
"type": "string"
},
"collected": {
"description": "Everything answered so far, this turn included. Send it back on the next call.",
"type": "string"
},
"field": {
"description": "The question being asked, by name; `none` when there is nothing left to ask.",
"type": "string"
},
"next_step": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"action": {
"enum": [
"ask_customer",
"call_tool",
"wait_then_call_tool",
"hand_off",
"stop"
],
"type": "string"
},
"note": {
"description": "For you, not the customer.",
"type": "string"
},
"tool": {
"description": "The tool to call next, when there is one.",
"type": [
"string",
"null"
]
}
},
"required": [
"action",
"tool",
"note"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Present when the intake ends: what to call next."
},
"options": {
"description": "Every choice the customer may pick, when the question has a fixed set, in answer_as.values order.",
"items": {
"type": "string"
},
"type": "array"
},
"ready_to_submit": {
"description": "True when every question is answered: read the summary back, then submit_commercial_application.",
"type": "boolean"
},
"route_to_personal": {
"description": "True when the customer drives only for apps: that is personal auto, nothing commercial is sent, and next_question takes it from here.",
"type": "boolean"
},
"summary": {
"anyOf": [
{
"items": {
"additionalProperties": false,
"properties": {
"answer": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"field",
"answer"
],
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "What the customer answered, to read back before submitting. Only when ready_to_submit is true."
}
},
"required": [
"field",
"ask",
"options",
"answer_as",
"ready_to_submit",
"route_to_personal",
"collected",
"summary",
"next_step"
],
"type": "object"
}
},
{
"description": "Second-round helper, outside the three steps: turns the customer's words into the occupation code start_quote takes.\n\nTurns what the customer said they do into the carrier's own occupation codes. Call it before sending `occupation` on a driver: the catalogue is written in trade names and customers answer in their own, so the code is never something to guess at. Pick the entry that matches what they described and send its code.\n\nAn empty list means ask them another way rather than settle for the nearest thing.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"locale": {
"description": "The language the customer is writing in. Set it from their own messages rather than leaving the default: the estimate's notice comes back in this language, and a notice the customer cannot read discloses nothing. Sigo serves these two languages only.",
"enum": [
"es",
"en"
],
"type": "string"
},
"said": {
"description": "What the customer said they do, in their own words — 'chofer', 'trabajo en construcción'.",
"maxLength": 120,
"minLength": 1,
"type": "string"
}
},
"required": [
"said",
"locale"
],
"type": "object"
},
"name": "find_occupation",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"matches": {
"description": "The rater's entries that fit, best first. Pick the one that matches what the customer described and send its `code` as the driver's `occupation`.",
"items": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"code",
"label"
],
"type": "object"
},
"type": "array"
},
"note": {
"description": "What to do with this list, in the customer's language — including when it comes back empty.",
"type": "string"
}
},
"required": [
"matches",
"note"
],
"type": "object"
}
},
{
"description": "Step 3 of 3: read the quote_id start_quote returned, after poll_after_seconds, until more_carriers_pending is false. Never start_quote again to refresh a result.\n\nReads the estimates for a quote_id returned by start_quote. Carriers answer at different speeds: when more_carriers_pending is true the list is not final and poll_after_seconds says how long to wait before asking again. The list closes within a minute either way, with whatever arrived — a carrier that did not answer is not a price, and there is none to go looking for. Once it is closed, to_final_quote.next_call is what to do next. No price here is final, in any round: the final quote is calculated by Sigo in the link, after the carrier's questions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"locale": {
"default": "es",
"description": "The language the customer is writing in. Set it from their own messages rather than leaving the default: the estimate's notice comes back in this language, and a notice the customer cannot read discloses nothing. Sigo serves these two languages only.",
"enum": [
"es",
"en"
],
"type": "string"
},
"quote_id": {
"description": "The handle start_quote returned.",
"minLength": 1,
"type": "string"
}
},
"required": [
"quote_id"
],
"type": "object"
},
"name": "get_quote",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"application": {
"additionalProperties": false,
"properties": {
"complete": {
"description": "True when the application has everything RC3 needs. False while anything is missing.",
"type": "boolean"
},
"note": {
"description": "What to do about it, in the customer's language.",
"type": "string"
},
"still_needed": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "What is missing, empty when nothing is. Null on a quote issued before this was recorded, where completeness is unknown rather than proven."
}
},
"required": [
"complete",
"still_needed",
"note"
],
"type": "object"
},
"asked_for": {
"additionalProperties": false,
"description": "Label each answer with this when comparing two quotes for the same customer, so \"con deducible de 1000\" is matched to the quote that asked for it.",
"properties": {
"drivers": {
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"vehicles": {
"description": "Empty on a quote started before this field existed; then the agent's own record is the label.",
"items": {
"additionalProperties": false,
"properties": {
"coverage_type": {
"enum": [
"liability",
"full_coverage"
],
"type": "string"
},
"deductible": {
"anyOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Null for liability, or when none was given."
},
"position": {
"description": "1-based, in the order start_quote received them.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"year": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"position",
"year",
"coverage_type",
"deductible"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"vehicles",
"drivers"
],
"type": "object"
},
"carriers": {
"additionalProperties": false,
"properties": {
"answered": {
"description": "The carriers that returned a price for this quote, and the only ones that may be named.",
"items": {
"type": "string"
},
"type": "array"
},
"catalogue_is_public": {
"const": false,
"description": "Sigo publishes no list of the carriers it works with: it varies by state and by quote, and cannot be derived from this response. A carrier absent from `answered` is not thereby a carrier Sigo does not work with.",
"type": "boolean"
},
"note": {
"description": "What may be said about carriers, in the customer's language.",
"type": "string"
}
},
"required": [
"answered",
"catalogue_is_public",
"note"
],
"type": "object"
},
"contact": {
"additionalProperties": false,
"properties": {
"note": {
"description": "What to say when the customer asks to be called, in their language.",
"type": "string"
},
"phone_collected_here": {
"const": false,
"description": "No phone number reaches this connector: the input schema has no field for one.",
"type": "boolean"
},
"sigo_calls_customers": {
"const": true,
"description": "Sigo's agents do call and text customers. What cannot happen is a call arranged from here, because this channel never has a number to call.",
"type": "boolean"
},
"url": {
"description": "Where the customer leaves a phone number for a Sigo agent. Present as soon as the list is final, whether or not anything was quoted; null only while carriers are still answering. This is the only way on from here — do not offer another.",
"type": [
"string",
"null"
]
}
},
"required": [
"phone_collected_here",
"sigo_calls_customers",
"url",
"note"
],
"type": "object"
},
"cover_first": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"chosen_quote_id": {
"description": "The one estimate's quote_id, to pass to carrier_questions. Null when there is none.",
"type": [
"string",
"null"
]
},
"confirmed_price": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"currency": {
"const": "USD",
"type": "string"
},
"due_today": {
"type": "number"
},
"monthly_payment": {
"type": "number"
},
"total_for_term": {
"type": "number"
}
},
"required": [
"currency",
"due_today",
"monthly_payment",
"total_for_term"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "The carrier's confirmed amounts, once confirmed. Still subject to eligibility and state rules."
},
"more_options_offered": {
"description": "True when Sigo offers to look at the other carriers beside a confirmed price. Offer it once; other_carrier_questions is how, and only if the customer wants to compare.",
"type": "boolean"
},
"next_call": {
"description": "Exactly what to call next, with its arguments; null when nothing is.",
"type": [
"string",
"null"
]
},
"note": {
"description": "What to tell the customer and do next, in their language.",
"type": "string"
},
"poll_after_seconds": {
"anyOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "While confirming: how long to wait before get_quote again."
},
"status": {
"description": "rating: carriers still answering. questions_pending: ask carrier_questions for the one estimate shown. handed_off: the answers are in and the carrier did not confirm here; give the customer next_step's link and stop. confirming: Sigo is confirming the price, read again. confirmed: the price is in confirmed_price and the customer pays in the link. declined / not_available: that option is not the answer; other_carrier_questions follows.",
"enum": [
"rating",
"questions_pending",
"confirming",
"confirmed",
"declined",
"not_available",
"handed_off"
],
"type": "string"
}
},
"required": [
"status",
"chosen_quote_id",
"confirmed_price",
"more_options_offered",
"poll_after_seconds",
"next_call",
"note"
],
"type": "object"
},
{
"type": "null"
}
]
},
"covers": {
"additionalProperties": false,
"properties": {
"drivers": {
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"note": {
"description": "Present from two vehicles up: say it with the prices, because one amount for a household reads as an amount per car. Null for a single vehicle, where the amount can only mean one thing.",
"type": [
"string",
"null"
]
},
"vehicles": {
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
}
},
"required": [
"vehicles",
"drivers",
"note"
],
"type": "object"
},
"expires_at": {
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
"type": "string"
},
"issued_by": {
"additionalProperties": false,
"properties": {
"agency": {
"const": "Sigo",
"type": "string"
},
"charges_broker_fee": {
"description": "Whether Sigo charges this customer a broker fee, which depends on their state. True: a fee for the agency's service, on top of a commission from the carrier. False: Sigo charges them no fee at all. Either way it is not part of the amounts in this response — those are the carrier's — and cannot be derived from them: where there is one, it is itemised for the customer before purchase. An estimate is not the final cost of buying through Sigo.",
"type": "boolean"
},
"pays_claims": {
"const": false,
"type": "boolean"
},
"role": {
"const": "licensed insurance agency",
"type": "string"
},
"underwrites_policies": {
"const": false,
"type": "boolean"
}
},
"required": [
"agency",
"role",
"underwrites_policies",
"pays_claims",
"charges_broker_fee"
],
"type": "object"
},
"more_carriers_pending": {
"description": "True when more carriers may still return a price; the list is not final.",
"type": "boolean"
},
"pending_note": {
"description": "What to do while carriers are still answering, in the customer's language. Null once the list is final.",
"type": [
"string",
"null"
]
},
"personal_use_note": {
"description": "Present when the customer said the vehicle is used for work. Say it with the prices: this quote is personal auto. Null when they said nothing about it, and then the subject is not raised.",
"type": [
"string",
"null"
]
},
"poll_after_seconds": {
"anyOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "How long to wait before calling get_quote again."
},
"price_levers": {
"additionalProperties": false,
"properties": {
"available": {
"description": "The only changes worth offering, and they re-quote: empty when this quote has none, and then the honest answer is that there is nothing to adjust at this step.",
"items": {
"type": "string"
},
"type": "array"
},
"note": {
"description": "How to answer the question, in the customer's language.",
"type": "string"
}
},
"required": [
"available",
"note"
],
"type": "object"
},
"problems": {
"items": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"message": {
"description": "Customer-safe wording. Upstream carrier or configuration detail is never included.",
"type": "string"
}
},
"required": [
"code",
"message"
],
"type": "object"
},
"type": "array"
},
"quote_id": {
"description": "Pass this back to get_quote to read the result again.",
"type": "string"
},
"quoted_at": {
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
"type": "string"
},
"quotes": {
"items": {
"additionalProperties": false,
"properties": {
"carrier_name": {
"description": "The carrier that issues this policy. Sigo is the agency, not the issuer.",
"type": "string"
},
"disclaimer": {
"additionalProperties": false,
"properties": {
"show_verbatim": {
"const": true,
"description": "This text goes to the customer as it is written, in the same answer as the price. It is short enough to fit: shortening it further drops the disclosure Sigo is required to make, and a summary of it is not that disclosure. It carries no instructions to the model and none to the customer.",
"type": "boolean"
},
"text": {
"description": "The notice, in the customer's language.",
"type": "string"
}
},
"required": [
"text",
"show_verbatim"
],
"type": "object"
},
"estimate": {
"additionalProperties": false,
"properties": {
"currency": {
"const": "USD",
"type": "string"
},
"due_today": {
"description": "What the customer pays today to start the policy. Not the policy total.",
"type": "number"
},
"first_payment_note": {
"description": "What the amount due today is, in words the customer hears. It is stated for every estimate, whichever of the two numbers is larger.",
"type": "string"
},
"monthly_payment": {
"exclusiveMinimum": 0,
"type": "number"
},
"number_of_installments": {
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"term_months": {
"anyOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Policy term in months, or null when the carrier did not report one. A 6-month and a 12-month quote are not comparable on the down payment alone, so do not rank on price without it."
},
"total_for_term": {
"description": "What the payment plan adds up to over the term: the amount due today plus every instalment. Stated rather than left to be worked out — an agent asked for the six-month total produced one of its own.",
"exclusiveMinimum": 0,
"type": "number"
},
"total_note": {
"description": "What that total is and what it does not include. It travels with the number for the same reason the first payment's note does: a trailing sentence gets paraphrased away.",
"type": "string"
}
},
"required": [
"currency",
"due_today",
"first_payment_note",
"monthly_payment",
"number_of_installments",
"total_for_term",
"total_note",
"term_months"
],
"type": "object"
},
"is_binding": {
"const": false,
"type": "boolean"
},
"next_step": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"action": {
"const": "continue_with_sigo",
"type": "string"
},
"url": {
"format": "uri",
"type": "string"
}
},
"required": [
"action",
"url"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Where the customer continues with Sigo — present only once the list of prices is final. While carriers are still answering it is null, because a customer cannot choose from a list that is still filling."
},
"quote_id": {
"type": "string"
},
"quote_type": {
"const": "estimate",
"description": "Always an estimate, in every round. No price the connector returns is final: the final quote is calculated by Sigo in the link, after the carrier's questions and before the customer pays.",
"type": "string"
}
},
"required": [
"quote_id",
"carrier_name",
"estimate",
"quote_type",
"is_binding",
"disclaimer",
"next_step"
],
"type": "object"
},
"type": "array"
},
"revised_from_quote": {
"description": "True when this quote re-quoted the same customer: started with revise_of, or for a customer who already quoted today and was still at their first round. One person, one application, priced again.",
"type": "boolean"
},
"state": {
"type": [
"string",
"null"
]
},
"status": {
"enum": [
"pending",
"partial",
"ready",
"failed"
],
"type": "string"
},
"to_final_quote": {
"additionalProperties": false,
"properties": {
"available": {
"description": "True once there are prices. There is always a next step towards the final quote.",
"type": "boolean"
},
"next_call": {
"description": "Exactly what to call next, with its arguments: `next_question` with stage second_round while the application is incomplete; `carrier_questions` with `quote_id` (this quote) and `chosen_quote_id` (the `quote_id` of the estimate the customer picked) once it is. Null before there are prices.",
"type": [
"string",
"null"
]
},
"note": {
"description": "What to tell the customer, in their language.",
"type": [
"string",
"null"
]
},
"price_may_change": {
"description": "One line on what finishing can do to the price, in the customer's language. It never promises a better price, and never mentions a carrier that has not answered.",
"type": [
"string",
"null"
]
}
},
"required": [
"available",
"next_call",
"note",
"price_may_change"
],
"type": "object"
}
},
"required": [
"quote_id",
"status",
"more_carriers_pending",
"poll_after_seconds",
"pending_note",
"to_final_quote",
"cover_first",
"application",
"state",
"quoted_at",
"expires_at",
"quotes",
"problems",
"contact",
"covers",
"asked_for",
"revised_from_quote",
"price_levers",
"personal_use_note",
"carriers",
"issued_by"
],
"type": "object"
}
},
{
"description": "Before the flow, optional: where Sigo quotes. The flow itself is next_question, then start_quote once, then get_quote.\n\nThe US states Sigo Seguros is licensed to sell car insurance in, and what Sigo is. Ask this before collecting details, so a customer elsewhere is not taken through a full quote.\n\nThe state a policy is rated in comes from where the car is kept overnight, not from where the customer lives or works. Read `state_is_decided_by` before asking for a ZIP: a car kept outside these states is not quoted on a ZIP inside them, however close the customer commutes.\n\nSigo is an agency: it sells policies that carriers issue. The carrier pays it a commission, and in almost every state where it sells, the customer pays a one-time broker fee for the agency's service — in Florida there is none. Where there is one it is real and is itemised before anyone pays, in Sigo's own flow. Asked what Sigo charges — which customers ask before there is any quote — that is the answer, with no amount: saying Sigo charges nothing is false wherever it does charge, and the checkout will contradict it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"locale": {
"description": "The language the customer is writing in. Set it from their own messages rather than leaving the default: the estimate's notice comes back in this language, and a notice the customer cannot read discloses nothing. Sigo serves these two languages only.",
"enum": [
"es",
"en"
],
"type": "string"
}
},
"required": [
"locale"
],
"type": "object"
},
"name": "list_available_states",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"carriers": {
"additionalProperties": false,
"properties": {
"catalogue_is_public": {
"const": false,
"description": "Sigo publishes no list of the carriers it works with: it varies by state and by quote. Which ones answered is known only once a quote has run, and only those may be named.",
"type": "boolean"
},
"note": {
"type": "string"
}
},
"required": [
"catalogue_is_public",
"note"
],
"type": "object"
},
"how_sigo_is_paid": {
"description": "What to say when the customer asks what Sigo charges, in their language. No amount is in it.",
"type": "string"
},
"state_is_decided_by": {
"description": "Read this before asking for a ZIP. It says what decides the state a policy is rated in, in the customer's language, and it is the one thing this list does not say on its own.",
"type": "string"
},
"states": {
"items": {
"additionalProperties": false,
"properties": {
"code": {
"maxLength": 2,
"minLength": 2,
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"code",
"name"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"states",
"how_sigo_is_paid",
"state_is_decided_by",
"carriers"
],
"type": "object"
}
},
{
"description": "Step 1 of 3: call it until ready_to_quote is true, sending back the collected it returns each time and each answer under answer_as.key. Then start_quote.\n\nReturns the one question to put to the customer now, in their language, with the options to offer when the field has a fixed set. Call it before each question and again after every answer, until `ready_to_quote` is true, then call `start_quote`.\n\nSend only what the customer said this turn, in `answered`, together with the `collected` from the last call. The connector keeps the record of the conversation, so nothing is repeated and an answer given before its turn is not lost. When `ready_to_quote` turns true, `summary` is what the customer has said: read it back and let them correct it before quoting.\n\nIt exists so the order and the pace are the connector's rather than a matter of judgement: Sigo's customers are working people, often quoting on a phone, and a turn that asks for four things at once is where they give up.\n\nOnce a ZIP is given it is checked here, so a customer outside the states Sigo is licensed in is told before being walked through the rest.\n\nThere are two stretches. `stage: \"first_quote\"` is the one that ends in estimates. `stage: \"second_round\"` is for a customer who saw those estimates and wants to finish the application so the carrier can quote it for real: it asks where the car is kept, the VIN, who owns it, the licence, and a few more. The prices it leads to are still estimates; the final quote comes after the carrier's own questions, in Sigo's link. `get_quote` says when that is worth offering.\n\nA vehicle a business uses for its work is commercial auto and is not quoted here: use commercial_next_question. Someone who drives only for apps like Uber or DoorDash stays here.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"answered": {
"additionalProperties": false,
"description": "Only what the customer said this turn. Everything from earlier turns is already in `collected` and must not be repeated here.",
"properties": {
"address": {
"description": "Second round. Where the car is kept.",
"type": "string"
},
"birthdate": {
"description": "YYYY-MM-DD.",
"type": "string"
},
"coverage": {
"enum": [
"liability",
"full_coverage"
],
"type": "string"
},
"deductible": {
"description": "Only for full coverage.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"document_number_settled": {
"const": true,
"description": "Second round. Send once every driver who is not excluded has given their document's number.",
"type": "boolean"
},
"document_settled": {
"const": true,
"description": "Send once the identity document is settled, including a customer who gave none.",
"type": "boolean"
},
"document_type": {
"description": "Which of the six it is, sent with `document_settled`, so the summary can read it back. Never the number: that goes to `start_quote` only.",
"enum": [
"us_license",
"foreign_license",
"us_id",
"foreign_id",
"consular_id",
"passport"
],
"type": "string"
},
"driver_name": {
"additionalProperties": false,
"description": "The name, sent with `driver_named`, so the summary can read it back.",
"properties": {
"first_name": {
"maxLength": 25,
"type": "string"
},
"last_name": {
"maxLength": 25,
"type": "string"
}
},
"required": [
"first_name",
"last_name"
],
"type": "object"
},
"driver_named": {
"const": true,
"description": "Send once the driver's name is known.",
"type": "boolean"
},
"education": {
"description": "Second round.",
"type": "string"
},
"email": {
"type": "string"
},
"gender": {
"type": "string"
},
"has_prior_insurance": {
"type": "boolean"
},
"household_drivers": {
"description": "Second round. The others in the home by name, sent with `household_drivers_settled`; an empty list when there is nobody. Read back in the summary.",
"items": {
"maxLength": 51,
"type": "string"
},
"maxItems": 4,
"type": "array"
},
"household_drivers_settled": {
"const": true,
"description": "Second round. Send once the household has been asked about, whoever the answer added.",
"type": "boolean"
},
"license_status": {
"description": "Second round.",
"type": "string"
},
"lienholder_settled": {
"const": true,
"description": "Second round. Send once the loan holder is settled.",
"type": "boolean"
},
"marital_status": {
"description": "Sending `married` is what brings up the spouse.",
"type": "string"
},
"months_licensed": {
"description": "Second round.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"occupation": {
"description": "Second round. The code from `find_occupation`.",
"type": "string"
},
"ownership": {
"description": "Second round. Sending `financed` or `leased` is what brings up the lienholder.",
"enum": [
"owned",
"financed",
"leased"
],
"type": "string"
},
"primary_driver_settled": {
"const": true,
"description": "Send once who drives the car most is settled.",
"type": "boolean"
},
"primary_use": {
"description": "One of the rater's five.",
"type": "string"
},
"prior_coverage_settled": {
"const": true,
"description": "Second round. Send once both the months covered and the expiry are known.",
"type": "boolean"
},
"spouse_named": {
"const": true,
"description": "Send once the spouse is on the quote.",
"type": "boolean"
},
"uninsured_motorist": {
"type": "boolean"
},
"vehicle": {
"additionalProperties": false,
"description": "The car as the customer gave it, sent with `vehicle_described`. It settles nothing on its own; it is what the summary reads back.",
"properties": {
"make": {
"maxLength": 40,
"type": "string"
},
"model": {
"maxLength": 40,
"type": "string"
},
"year": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"year",
"make",
"model"
],
"type": "object"
},
"vehicle_described": {
"const": true,
"description": "Send once year, make and model are all known.",
"type": "boolean"
},
"vin": {
"description": "Second round. The VIN as the customer gave it, so the summary can read it back.",
"maxLength": 21,
"type": "string"
},
"vin_settled": {
"const": true,
"description": "Second round. Send once every vehicle has its VIN.",
"type": "boolean"
},
"zip_code": {
"description": "The ZIP code, exactly as the customer gave it.",
"type": "string"
}
},
"type": "object"
},
"collected": {
"description": "The `collected` from the previous call. Leave it out on the first question of a conversation and send it on every call after that: it carries everything answered so far, so nothing has to be repeated and nothing is lost.",
"type": "string"
},
"locale": {
"description": "The language the customer is writing in. Set it from their own messages rather than leaving the default: the estimate's notice comes back in this language, and a notice the customer cannot read discloses nothing. Sigo serves these two languages only.",
"enum": [
"es",
"en"
],
"type": "string"
},
"stage": {
"default": "first_quote",
"description": "Which stretch the conversation is in. `second_round` is for a customer who saw prices and wants to finish the application; it asks a different set, and the prices it leads to are still estimates.",
"enum": [
"first_quote",
"second_round"
],
"type": "string"
}
},
"required": [
"locale"
],
"type": "object"
},
"name": "next_question",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"answer_as": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"key": {
"description": "The exact key to send this answer under in `answered` on the next call.",
"type": "string"
},
"type": {
"description": "The value's shape. `mark` means send `true` once the matter is settled; the details themselves (a name, a VIN, a spouse) go to start_quote, not here.",
"enum": [
"string",
"integer",
"boolean",
"enum",
"mark"
],
"type": "string"
},
"values": {
"description": "For `enum`: the only values accepted, in English.",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"key",
"type"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "How to send the answer back. Null on the closing step, when there is nothing left to answer."
},
"ask": {
"description": "The question, ready to put to the customer, in their language.",
"type": "string"
},
"collected": {
"description": "Everything answered so far, this turn included. Send it back on the next call. It is the connector's record of the conversation, so nothing has to be asked twice.",
"type": "string"
},
"field": {
"description": "The question being asked, by name. Not the key to answer under: that is `answer_as.key`.",
"type": "string"
},
"options": {
"description": "Every choice the customer may pick, when the field has a fixed set.",
"items": {
"type": "string"
},
"type": "array"
},
"ready_to_quote": {
"description": "True when nothing is missing and start_quote can be called.",
"type": "boolean"
},
"summary": {
"anyOf": [
{
"items": {
"additionalProperties": false,
"properties": {
"answer": {
"type": "string"
},
"field": {
"type": "string"
}
},
"required": [
"field",
"answer"
],
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "What the customer has answered, to read back to them for confirmation. Present only once `ready_to_quote` is true; null while there are still questions to ask."
}
},
"required": [
"field",
"ask",
"options",
"answer_as",
"ready_to_quote",
"collected",
"summary"
],
"type": "object"
}
},
{
"description": "Only when get_quote's cover_first, or answer_carrier_questions, names it: after the one option shown could not be the answer (declined, not available, or an answer it does not take), or when the customer wants to compare a confirmed price. Then answer_other_carrier_questions.\n\nReturns the questions of the other carriers in the customer's state, once for all of them and minus whatever the customer already answered anywhere (pass the `answers_so_far` answer_carrier_questions handed back, when it did). Say `preamble` first, then ask one `ask_together` block per turn, each question exactly as it is worded. No price comes with these: a Sigo agent confirms the final offer through the link.\n\n`can_answer_here` is false when nobody priced the customer, and then a Sigo agent takes it from there.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"answers_so_far": {
"description": "The `answers_so_far` answer_carrier_questions handed back when the first option ended, when there was one: what the customer already answered is then not asked again.",
"type": "string"
},
"locale": {
"description": "The language the customer is writing in. Set it from their own messages rather than leaving the default: the estimate's notice comes back in this language, and a notice the customer cannot read discloses nothing. Sigo serves these two languages only.",
"enum": [
"es",
"en"
],
"type": "string"
},
"quote_id": {
"description": "The handle start_quote returned.",
"minLength": 1,
"type": "string"
}
},
"required": [
"quote_id",
"locale"
],
"type": "object"
},
"name": "other_carrier_questions",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"ask_together": {
"description": "Codes that can be put to the customer in one turn, grouped the way the carrier groups them. Ask each block as one message and send its answers together. A question with `depends_on` is in no block: it gets its own turn, after the one it hangs off. Empty when there is nothing to ask here.",
"items": {
"items": {
"type": "string"
},
"type": "array"
},
"type": "array"
},
"can_answer_here": {
"description": "False when there is nothing to ask here: nobody priced the customer, and a Sigo agent takes it.",
"type": "boolean"
},
"next_step": {
"additionalProperties": false,
"description": "Where the customer finishes. Theirs at any point, not only at the end.",
"properties": {
"action": {
"const": "continue_with_sigo",
"type": "string"
},
"note": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"action",
"url",
"note"
],
"type": "object"
},
"note": {
"description": "What to do with these questions, in the customer's language.",
"type": "string"
},
"preamble": {
"description": "Sigo's own words for the customer, to say as they are before the first question. Not one of the carrier's questions and not answered. Null when there is nothing to ask here.",
"type": [
"string",
"null"
]
},
"questions": {
"description": "In the order the platform ranked them.",
"items": {
"additionalProperties": false,
"properties": {
"answer_type": {
"description": "What kind of answer it takes, as the platform types it — `yes_no` on every question seen so far. Send a boolean for those; anything else goes as text.",
"type": "string"
},
"code": {
"description": "Send the answer back under this code.",
"type": "string"
},
"depends_on": {
"description": "The code of the question this one hangs off. Ask it only once that one is answered; null when it stands on its own.",
"type": [
"string",
"null"
]
},
"required": {
"type": "boolean"
},
"wording": {
"description": "The carrier's own words, in the customer's language. Ask it as it is written: do not reword it, do not soften it, and do not turn it around. The customer is attesting to this for the record.",
"type": "string"
},
"wording_language": {
"description": "The language `wording` is in, which is the conversation's own. A carrier with no wording in it is not answered here at all: `can_answer_here` is false and a Sigo agent takes it.",
"enum": [
"es",
"en"
],
"type": "string"
}
},
"required": [
"code",
"wording",
"wording_language",
"answer_type",
"required",
"depends_on"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"can_answer_here",
"questions",
"ask_together",
"preamble",
"note",
"next_step"
],
"type": "object"
}
},
{
"description": "Outside the three steps: for a customer who arrives with a Sigo link they already have.\n\nSays what a Sigo link points at, how far that application has got, and the one thing the customer has to do next. Call it when someone shows up with a link — from an email, a text, or their own notes — and asks for help finishing.\n\nPass only the Sigo link or code they shared. It resolves the short link, the long one and a bare code.\n\nIt reads only: it opens nothing on the customer's behalf, and asking twice changes nothing. It reports no price, carrier or personal detail, because Sigo does not send any — whoever holds a link gets this same answer, so there is nothing here that identifies its owner. Say the `message` as given rather than composing one.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"locale": {
"default": "es",
"description": "The language to write the returned `message` in: the customer's own, es or en.",
"enum": [
"es",
"en"
],
"type": "string"
},
"pasted_link": {
"description": "Only the Sigo link or code the customer shared (a sigoseguros.com link or a short code), not the rest of their message. Stray punctuation around it is fine; do not guess at a link the customer did not provide.",
"maxLength": 512,
"minLength": 1,
"type": "string"
}
},
"required": [
"pasted_link"
],
"type": "object"
},
"name": "resolve_application_link",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "What to tell the customer, already written in their language. Say this rather than composing your own: it is the only description of the application Sigo has checked, and it deliberately states no price, carrier or personal detail because none was read.",
"type": "string"
},
"next_step": {
"description": "The single next action, as a value. `message` is the wording for it.",
"type": "string"
},
"state": {
"description": "How far the application has got. Coarse on purpose.",
"enum": [
"in_progress",
"final_quote_ready",
"signature_owed",
"awaiting_binding",
"needs_agent",
"complete",
"not_found"
],
"type": "string"
},
"url": {
"description": "The link to hand back so the customer can continue, or null when nothing resolved. Use this URL rather than the one the customer pasted.",
"type": [
"string",
"null"
]
}
},
"required": [
"state",
"next_step",
"message",
"url"
],
"type": "object"
}
},
{
"description": "Step 2 of 3: call it once, with the collected next_question returned when ready_to_quote was true. It returns a quote_id for get_quote. If it answers quote_in_progress, do not call it again: read the quote_id you already have. Retrying the same call, after a timeout say, is safe: while its rating runs, the retry starts no second one and answers quote_in_progress.\n\nAsks Sigo's carriers for car insurance estimates. Carriers answer over tens of seconds, so this returns a quote_id straight away rather than waiting; read the prices with get_quote. Estimates are not binding: this does not select a policy, take payment or bind coverage. No browser is needed to get them: they come back in these tool calls, and the link in each one is where the customer continues if they want to buy.\n\nCall it once the details are gathered. Gather them a step at a time in conversation — listing every field up front reads as a form and loses people before the first answer.\n\nFor a customer who already has a quote and wants something changed, pass that quote's id as revise_of instead of starting over: the same person re-quoted, not a second one. A call for a customer who already quoted today and is still at their first round revises that quote even without revise_of — the result says revised_from_quote: true — so a forgotten id never makes a second application.\n\nThe same call carries the second round. Once the customer has answered what `next_question` asks with `stage: \"second_round\"` — address, VIN, ownership and lienholder, licence status and months held, occupation, education, prior coverage, excluded drivers, and each driver's document number in `drivers[].document.number` — send them all here with revise_of, and the carriers price the quote again on what they now know.\n\nThe address the second round asks for is where the car is kept, and it is checked against the ZIP the quote is running on. They disagree, and the answer is to correct whichever one is wrong — never to move the customer onto a ZIP in a state the car is not kept in.\n\nOne quote at a time per customer. If their previous quote is still being answered, this fails with quote_in_progress and a poll_after_seconds: say so, read the earlier quote with get_quote when that time has passed, then ask for this one again with revise_of. Two asks at once (\"the Civic and the Silverado\") are run one after the other, and each result's asked_for says which is which.\n\nApart from arguments the schema rejects, a refusal comes back with a code, a message for the customer and a next_step for you, which says what to do next and which tool, if any, to call.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"address": {
"anyOf": [
{
"maxLength": 120,
"type": "string"
},
{
"type": "null"
}
],
"description": "Second round only. The street address where the car is kept overnight — street and number; the ZIP already gave the city and the state. It is checked against that ZIP, and an address somewhere else is refused rather than quoted: this is the field that decides which state the policy is rated in. Where they work is not it."
},
"collected": {
"description": "The `collected` next_question returned once `ready_to_quote` was true. Required: it is the record that every question was put to the customer. A call without it, or with one that still has questions pending, is refused with `questions_not_finished` and creates nothing.",
"minLength": 1,
"type": "string"
},
"correction_of": {
"description": "Only when a previous call failed with `data_not_accepted`: pass the `correction_of` it returned, together with the corrected details. The quote is retried on the same record instead of starting a second one for the same person. Never invent this value.",
"type": "string"
},
"drivers": {
"items": {
"additionalProperties": false,
"properties": {
"birthdate": {
"description": "YYYY-MM-DD. Age is what carriers rate on, so it is the date itself, never one worked out from an age.",
"type": "string"
},
"document": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"number": {
"anyOf": [
{
"maxLength": 13,
"type": "string"
},
{
"type": "null"
}
],
"description": "Second round only, as on sigoseguros.com: required there for every driver who is not excluded, and dropped if sent on a first quote. A Texas licence is 7 or 8 digits, a California one 1 letter and 7 digits, a Florida one 1 letter and 12 digits; any other is up to 12 characters."
},
"type": {
"description": "Offer all six. A customer without a US licence is quotable on a foreign licence, a consular ID (matrícula) or a passport, and offering fewer reads as being turned away. None of the six is a learner permit, and the type on its own is never read as a full licence: a permit holder is recorded with the type of the document they carry and with `license_status: \"learner-permit\"`, which is what the rater prices as a permit.",
"enum": [
"us_license",
"foreign_license",
"us_id",
"foreign_id",
"consular_id",
"passport"
],
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "The driver's identity document. Optional: a customer who declines is quoted without one."
},
"education": {
"anyOf": [
{
"enum": [
"less-than-high-school",
"high-school",
"some-college",
"bachelor-degree",
"master-degree"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Second round only. Not asked for in California, which prohibits rating on it."
},
"excluded": {
"default": false,
"description": "True for a household member who is named but must not drive the car. They go on the policy as excluded rather than being left off it. Nobody prices them, so their gender and marital status are not needed — do not go back to the customer for personal details about someone who is not being rated.",
"type": "boolean"
},
"first_name": {
"description": "Up to 25 characters, which is what the carrier's form holds. A customer whose name does not fit is asked how they want it shortened — it goes on the policy, so it is their call and not a silent trim.",
"maxLength": 25,
"minLength": 1,
"type": "string"
},
"gender": {
"description": "The two values the rater maps; anything else is silently rated as male. It is a field on the carrier's rating form, so ask it as such rather than as a question about identity. Not asked for in California, which prohibits rating on it.",
"enum": [
"male",
"female"
],
"type": "string"
},
"is_primary": {
"description": "Whether this is the driver who uses the car most. Exactly one driver is, and it is the customer who says which — carriers rate on it, so choosing for them quotes a household that may not be theirs. With more than one driver and nothing said about it, ask before quoting rather than assuming the first one.",
"type": "boolean"
},
"last_name": {
"description": "Up to 25 characters, same as the first name: ask rather than shorten it for them.",
"maxLength": 25,
"minLength": 1,
"type": "string"
},
"license_status": {
"anyOf": [
{
"enum": [
"valid",
"learner-permit",
"suspended"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Whether that document is in force, and the only place a learner permit is ever recorded. Send it the moment the customer says it, first quote included: a permit holder goes down as 'learner-permit' and never as a full licence, and the rater prices them as a permit. A permit and a suspended licence are both quotable, so ask it plainly."
},
"marital_status": {
"description": "Offer all of them when asking. Carriers rate on it, and anything the rater does not recognise is silently rated as 'single', so a driver pushed into the nearest offered option is quoted on the wrong facts. Not asked for in California, which prohibits rating on it.",
"enum": [
"single",
"married",
"widowed",
"divorced",
"separated"
],
"type": "string"
},
"months_licensed": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Second round only. How many months they have held the document. Offer ranges — 1 to 4 years, 5 to 8, more than 8 — and send the middle of the one they pick, which is what the other Sigo channels send."
},
"occupation": {
"anyOf": [
{
"maxLength": 20,
"type": "string"
},
{
"type": "null"
}
],
"description": "Second round only. The rater's code, from `find_occupation` — never invented and never the customer's own words. Not asked for in California."
},
"relationship": {
"description": "How this driver relates to the main one. Leave it out for the main driver. A married customer's spouse goes on the quote as a driver with 'spouse'.",
"enum": [
"spouse",
"domestic-partner",
"child",
"parent",
"sibling",
"other-relative",
"non-relative"
],
"type": "string"
}
},
"required": [
"first_name",
"last_name",
"birthdate",
"is_primary"
],
"type": "object"
},
"maxItems": 4,
"minItems": 1,
"type": "array"
},
"email": {
"description": "Identifies the customer and is how Sigo reaches them about this quote. No phone number is collected here, so nothing can be called or texted from this channel — which is not the same as Sigo not calling: a customer who wants a call leaves their number in Sigo's own flow, through the link on their estimate, and an agent calls them.",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
},
"has_prior_insurance": {
"description": "Whether the customer currently has car insurance.",
"type": "boolean"
},
"is_homeowner": {
"default": false,
"type": "boolean"
},
"is_student": {
"default": false,
"type": "boolean"
},
"locale": {
"description": "The language the customer is writing in. Set it from their own messages rather than leaving the default: the estimate's notice comes back in this language, and a notice the customer cannot read discloses nothing. Sigo serves these two languages only.",
"enum": [
"es",
"en"
],
"type": "string"
},
"prior_coverage_expiration": {
"anyOf": [
{
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Second round only. YYYY-MM-DD, when the current policy ends. Today is accepted; a date already past is refused: confirm it with the customer, and if their coverage really did end, they have no prior insurance to send."
},
"prior_coverage_months": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Second round only, and only for a customer who has insurance now. How long they have been covered: offer 6 months, 1 year, 3 years, 4 or more."
},
"revise_of": {
"description": "When the customer wants a quote they already have run again with something changed — another deductible, another coverage, a detail they gave wrong: pass that quote's `quote_id` here, with the full details including the change. It re-quotes the same person instead of making them a second one. Never invent this value, and never use it for a different customer.",
"type": "string"
},
"uninsured_motorist": {
"description": "Whether to include uninsured-motorist protection — cover for when the other driver has no insurance. Ask it; it is the one add-on offered at this step and it changes the price.",
"type": "boolean"
},
"vehicles": {
"items": {
"additionalProperties": false,
"properties": {
"coverage_type": {
"enum": [
"liability",
"full_coverage"
],
"type": "string"
},
"deductible": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Only meaningful with full_coverage. Ignored otherwise."
},
"lienholder": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"address": {
"anyOf": [
{
"maxLength": 120,
"type": "string"
},
{
"type": "null"
}
]
},
"city": {
"anyOf": [
{
"maxLength": 60,
"type": "string"
},
{
"type": "null"
}
]
},
"loan_number": {
"anyOf": [
{
"maxLength": 40,
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"description": "The bank or finance company. Ask for this one; the rest is on the loan papers.",
"maxLength": 60,
"minLength": 1,
"type": "string"
},
"state": {
"anyOf": [
{
"pattern": "^[A-Za-z]{2}$",
"type": "string"
},
{
"type": "null"
}
]
},
"zip_code": {
"anyOf": [
{
"pattern": "^[0-9]{5}$",
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"name"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Second round only, and only for a financed or leased car: who holds the loan."
},
"make": {
"maxLength": 40,
"minLength": 1,
"type": "string"
},
"model": {
"maxLength": 40,
"minLength": 1,
"type": "string"
},
"ownership": {
"anyOf": [
{
"enum": [
"owned",
"financed",
"leased"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Second round only. Whether the car is paid off, financed or leased."
},
"primary_use": {
"description": "What the car is mostly used for, in the rater's own five: pleasure, artisan (tools and a trade), commute (driving to work), farm, business. Ask with all five — the ones that are not 'pleasure' are what a carrier prices differently. None of them means driving for a transport app; that answer goes in `used_for_rideshare`.",
"enum": [
"pleasure",
"artisan",
"commute",
"farm",
"business"
],
"type": "string"
},
"used_for_rideshare": {
"default": false,
"description": "True when the customer says they drive the vehicle for a transport or delivery app — Uber, Lyft, DiDi, Uber Eats, DoorDash, Amazon Flex and the like. Do not ask for it: set it the moment they mention it, in any wording ('manejo para Uber', 'hago entregas con la app'). Unlike every other field here it stops the quote: no estimate is produced, because a personal auto policy priced for this use is a misrepresentation the carrier can void a claim over. The customer is answered with `rideshare_needs_agent` and the link a Sigo agent reaches them through.",
"type": "boolean"
},
"used_for_work": {
"default": false,
"description": "True when the customer says the vehicle is used for their work or business — deliveries, tools, a trade. Do not ask for it: set it when they bring it up. It changes nothing about the price and adds the notice their situation needs, because this is a personal auto quote and a vehicle used for a business may need a commercial policy. Driving for a transport app is not this: it has its own field, `used_for_rideshare`, and it is not quoted here at all.",
"type": "boolean"
},
"vin": {
"anyOf": [
{
"maxLength": 21,
"type": "string"
},
{
"type": "null"
}
],
"description": "Second round only. The VIN from the customer's registration or insurance card."
},
"year": {
"maximum": 2027,
"minimum": 1981,
"type": "integer"
}
},
"required": [
"year",
"make",
"model",
"coverage_type",
"primary_use"
],
"type": "object"
},
"maxItems": 4,
"minItems": 1,
"type": "array"
},
"zip_code": {
"description": "The 5-digit ZIP code where the vehicle is kept. It determines the state.",
"pattern": "^[0-9]{5}$",
"type": "string"
}
},
"required": [
"zip_code",
"vehicles",
"drivers",
"has_prior_insurance",
"uninsured_motorist",
"email",
"collected",
"locale"
],
"type": "object"
},
"name": "start_quote",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"application": {
"additionalProperties": false,
"properties": {
"complete": {
"description": "True when the application has everything RC3 needs. False while anything is missing.",
"type": "boolean"
},
"note": {
"description": "What to do about it, in the customer's language.",
"type": "string"
},
"still_needed": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "What is missing, empty when nothing is. Null on a quote issued before this was recorded, where completeness is unknown rather than proven."
}
},
"required": [
"complete",
"still_needed",
"note"
],
"type": "object"
},
"asked_for": {
"additionalProperties": false,
"description": "Label each answer with this when comparing two quotes for the same customer, so \"con deducible de 1000\" is matched to the quote that asked for it.",
"properties": {
"drivers": {
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"vehicles": {
"description": "Empty on a quote started before this field existed; then the agent's own record is the label.",
"items": {
"additionalProperties": false,
"properties": {
"coverage_type": {
"enum": [
"liability",
"full_coverage"
],
"type": "string"
},
"deductible": {
"anyOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Null for liability, or when none was given."
},
"position": {
"description": "1-based, in the order start_quote received them.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"year": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"position",
"year",
"coverage_type",
"deductible"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"vehicles",
"drivers"
],
"type": "object"
},
"carriers": {
"additionalProperties": false,
"properties": {
"answered": {
"description": "The carriers that returned a price for this quote, and the only ones that may be named.",
"items": {
"type": "string"
},
"type": "array"
},
"catalogue_is_public": {
"const": false,
"description": "Sigo publishes no list of the carriers it works with: it varies by state and by quote, and cannot be derived from this response. A carrier absent from `answered` is not thereby a carrier Sigo does not work with.",
"type": "boolean"
},
"note": {
"description": "What may be said about carriers, in the customer's language.",
"type": "string"
}
},
"required": [
"answered",
"catalogue_is_public",
"note"
],
"type": "object"
},
"contact": {
"additionalProperties": false,
"properties": {
"note": {
"description": "What to say when the customer asks to be called, in their language.",
"type": "string"
},
"phone_collected_here": {
"const": false,
"description": "No phone number reaches this connector: the input schema has no field for one.",
"type": "boolean"
},
"sigo_calls_customers": {
"const": true,
"description": "Sigo's agents do call and text customers. What cannot happen is a call arranged from here, because this channel never has a number to call.",
"type": "boolean"
},
"url": {
"description": "Where the customer leaves a phone number for a Sigo agent. Present as soon as the list is final, whether or not anything was quoted; null only while carriers are still answering. This is the only way on from here — do not offer another.",
"type": [
"string",
"null"
]
}
},
"required": [
"phone_collected_here",
"sigo_calls_customers",
"url",
"note"
],
"type": "object"
},
"cover_first": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"chosen_quote_id": {
"description": "The one estimate's quote_id, to pass to carrier_questions. Null when there is none.",
"type": [
"string",
"null"
]
},
"confirmed_price": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"currency": {
"const": "USD",
"type": "string"
},
"due_today": {
"type": "number"
},
"monthly_payment": {
"type": "number"
},
"total_for_term": {
"type": "number"
}
},
"required": [
"currency",
"due_today",
"monthly_payment",
"total_for_term"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "The carrier's confirmed amounts, once confirmed. Still subject to eligibility and state rules."
},
"more_options_offered": {
"description": "True when Sigo offers to look at the other carriers beside a confirmed price. Offer it once; other_carrier_questions is how, and only if the customer wants to compare.",
"type": "boolean"
},
"next_call": {
"description": "Exactly what to call next, with its arguments; null when nothing is.",
"type": [
"string",
"null"
]
},
"note": {
"description": "What to tell the customer and do next, in their language.",
"type": "string"
},
"poll_after_seconds": {
"anyOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "While confirming: how long to wait before get_quote again."
},
"status": {
"description": "rating: carriers still answering. questions_pending: ask carrier_questions for the one estimate shown. handed_off: the answers are in and the carrier did not confirm here; give the customer next_step's link and stop. confirming: Sigo is confirming the price, read again. confirmed: the price is in confirmed_price and the customer pays in the link. declined / not_available: that option is not the answer; other_carrier_questions follows.",
"enum": [
"rating",
"questions_pending",
"confirming",
"confirmed",
"declined",
"not_available",
"handed_off"
],
"type": "string"
}
},
"required": [
"status",
"chosen_quote_id",
"confirmed_price",
"more_options_offered",
"poll_after_seconds",
"next_call",
"note"
],
"type": "object"
},
{
"type": "null"
}
]
},
"covers": {
"additionalProperties": false,
"properties": {
"drivers": {
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"note": {
"description": "Present from two vehicles up: say it with the prices, because one amount for a household reads as an amount per car. Null for a single vehicle, where the amount can only mean one thing.",
"type": [
"string",
"null"
]
},
"vehicles": {
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
}
},
"required": [
"vehicles",
"drivers",
"note"
],
"type": "object"
},
"expires_at": {
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
"type": "string"
},
"issued_by": {
"additionalProperties": false,
"properties": {
"agency": {
"const": "Sigo",
"type": "string"
},
"charges_broker_fee": {
"description": "Whether Sigo charges this customer a broker fee, which depends on their state. True: a fee for the agency's service, on top of a commission from the carrier. False: Sigo charges them no fee at all. Either way it is not part of the amounts in this response — those are the carrier's — and cannot be derived from them: where there is one, it is itemised for the customer before purchase. An estimate is not the final cost of buying through Sigo.",
"type": "boolean"
},
"pays_claims": {
"const": false,
"type": "boolean"
},
"role": {
"const": "licensed insurance agency",
"type": "string"
},
"underwrites_policies": {
"const": false,
"type": "boolean"
}
},
"required": [
"agency",
"role",
"underwrites_policies",
"pays_claims",
"charges_broker_fee"
],
"type": "object"
},
"more_carriers_pending": {
"description": "True when more carriers may still return a price; the list is not final.",
"type": "boolean"
},
"pending_note": {
"description": "What to do while carriers are still answering, in the customer's language. Null once the list is final.",
"type": [
"string",
"null"
]
},
"personal_use_note": {
"description": "Present when the customer said the vehicle is used for work. Say it with the prices: this quote is personal auto. Null when they said nothing about it, and then the subject is not raised.",
"type": [
"string",
"null"
]
},
"poll_after_seconds": {
"anyOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "How long to wait before calling get_quote again."
},
"price_levers": {
"additionalProperties": false,
"properties": {
"available": {
"description": "The only changes worth offering, and they re-quote: empty when this quote has none, and then the honest answer is that there is nothing to adjust at this step.",
"items": {
"type": "string"
},
"type": "array"
},
"note": {
"description": "How to answer the question, in the customer's language.",
"type": "string"
}
},
"required": [
"available",
"note"
],
"type": "object"
},
"problems": {
"items": {
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"message": {
"description": "Customer-safe wording. Upstream carrier or configuration detail is never included.",
"type": "string"
}
},
"required": [
"code",
"message"
],
"type": "object"
},
"type": "array"
},
"quote_id": {
"description": "Pass this back to get_quote to read the result again.",
"type": "string"
},
"quoted_at": {
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
"type": "string"
},
"quotes": {
"items": {
"additionalProperties": false,
"properties": {
"carrier_name": {
"description": "The carrier that issues this policy. Sigo is the agency, not the issuer.",
"type": "string"
},
"disclaimer": {
"additionalProperties": false,
"properties": {
"show_verbatim": {
"const": true,
"description": "This text goes to the customer as it is written, in the same answer as the price. It is short enough to fit: shortening it further drops the disclosure Sigo is required to make, and a summary of it is not that disclosure. It carries no instructions to the model and none to the customer.",
"type": "boolean"
},
"text": {
"description": "The notice, in the customer's language.",
"type": "string"
}
},
"required": [
"text",
"show_verbatim"
],
"type": "object"
},
"estimate": {
"additionalProperties": false,
"properties": {
"currency": {
"const": "USD",
"type": "string"
},
"due_today": {
"description": "What the customer pays today to start the policy. Not the policy total.",
"type": "number"
},
"first_payment_note": {
"description": "What the amount due today is, in words the customer hears. It is stated for every estimate, whichever of the two numbers is larger.",
"type": "string"
},
"monthly_payment": {
"exclusiveMinimum": 0,
"type": "number"
},
"number_of_installments": {
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"term_months": {
"anyOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Policy term in months, or null when the carrier did not report one. A 6-month and a 12-month quote are not comparable on the down payment alone, so do not rank on price without it."
},
"total_for_term": {
"description": "What the payment plan adds up to over the term: the amount due today plus every instalment. Stated rather than left to be worked out — an agent asked for the six-month total produced one of its own.",
"exclusiveMinimum": 0,
"type": "number"
},
"total_note": {
"description": "What that total is and what it does not include. It travels with the number for the same reason the first payment's note does: a trailing sentence gets paraphrased away.",
"type": "string"
}
},
"required": [
"currency",
"due_today",
"first_payment_note",
"monthly_payment",
"number_of_installments",
"total_for_term",
"total_note",
"term_months"
],
"type": "object"
},
"is_binding": {
"const": false,
"type": "boolean"
},
"next_step": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"action": {
"const": "continue_with_sigo",
"type": "string"
},
"url": {
"format": "uri",
"type": "string"
}
},
"required": [
"action",
"url"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Where the customer continues with Sigo — present only once the list of prices is final. While carriers are still answering it is null, because a customer cannot choose from a list that is still filling."
},
"quote_id": {
"type": "string"
},
"quote_type": {
"const": "estimate",
"description": "Always an estimate, in every round. No price the connector returns is final: the final quote is calculated by Sigo in the link, after the carrier's questions and before the customer pays.",
"type": "string"
}
},
"required": [
"quote_id",
"carrier_name",
"estimate",
"quote_type",
"is_binding",
"disclaimer",
"next_step"
],
"type": "object"
},
"type": "array"
},
"revised_from_quote": {
"description": "True when this quote re-quoted the same customer: started with revise_of, or for a customer who already quoted today and was still at their first round. One person, one application, priced again.",
"type": "boolean"
},
"state": {
"type": [
"string",
"null"
]
},
"status": {
"enum": [
"pending",
"partial",
"ready",
"failed"
],
"type": "string"
},
"to_final_quote": {
"additionalProperties": false,
"properties": {
"available": {
"description": "True once there are prices. There is always a next step towards the final quote.",
"type": "boolean"
},
"next_call": {
"description": "Exactly what to call next, with its arguments: `next_question` with stage second_round while the application is incomplete; `carrier_questions` with `quote_id` (this quote) and `chosen_quote_id` (the `quote_id` of the estimate the customer picked) once it is. Null before there are prices.",
"type": [
"string",
"null"
]
},
"note": {
"description": "What to tell the customer, in their language.",
"type": [
"string",
"null"
]
},
"price_may_change": {
"description": "One line on what finishing can do to the price, in the customer's language. It never promises a better price, and never mentions a carrier that has not answered.",
"type": [
"string",
"null"
]
}
},
"required": [
"available",
"next_call",
"note",
"price_may_change"
],
"type": "object"
}
},
"required": [
"quote_id",
"status",
"more_carriers_pending",
"poll_after_seconds",
"pending_note",
"to_final_quote",
"cover_first",
"application",
"state",
"quoted_at",
"expires_at",
"quotes",
"problems",
"contact",
"covers",
"asked_for",
"revised_from_quote",
"price_levers",
"personal_use_note",
"carriers",
"issued_by"
],
"type": "object"
}
},
{
"description": "Commercial auto, step 2 of 2: call it once, with the collected commercial_next_question returned when ready_to_submit was true. Do not call it again after it answers: a repeat is usually answered with the earlier request and already_received: true, but that is not guaranteed, and a second call can file a second request.\n\nSends the intake to Sigo, where a licensed agent reviews it and follows up by email. It is a request for a quote, not a quote: it returns no price, selects no policy, takes no payment and binds no coverage. Say `message` and `disclaimer` as written, and offer `form_url` with `form_note` for a customer who wants to add their vehicles and drivers now.\n\nA refusal comes back with a code, a message for the customer and a next_step for you. One that says the request did not reach Sigo carries form_url: never tell the customer it was received.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"collected": {
"description": "The `collected` commercial_next_question returned when ready_to_submit was true.",
"type": "string"
},
"locale": {
"description": "The language the customer is writing in. Set it from their own messages: the questions come back in it, and the request is filed in it so the Sigo agent follows up in it.",
"enum": [
"es",
"en"
],
"type": "string"
}
},
"required": [
"collected",
"locale"
],
"type": "object"
},
"name": "submit_commercial_application",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"already_received": {
"description": "True when this business had already sent the same request: the earlier one is answered again, and no second one was filed.",
"type": "boolean"
},
"disclaimer": {
"description": "The notice every quote is subject to. Say it as written; it is the disclosure itself.",
"type": "string"
},
"form_note": {
"description": "The line to give the customer with form_url.",
"type": "string"
},
"form_url": {
"description": "The website's full commercial form, in the customer's language.",
"type": "string"
},
"message": {
"description": "What to tell the customer, as written.",
"type": "string"
},
"reference": {
"description": "Sigo's reference for the request. Not a quote and not a policy number.",
"type": "string"
},
"status": {
"const": "received",
"description": "Sigo has the request. A Sigo agent follows up; nothing was quoted here.",
"type": "string"
}
},
"required": [
"status",
"already_received",
"reference",
"message",
"disclaimer",
"form_url",
"form_note"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:3703d9f889d9ba5a1c2187041318fadd36d09672319f4594fd3ecebf62c90d6c | sha256sum