> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.truvo.com/llms.txt.

# Request a pet quote

To get pet insurance quotes, send a `POST /v1/quote-requests` request with `line` set to `pet`. Prefill what you already know about the pet owner, such as their name or email address, and ask them for the rest. If you don't know an optional value, omit the field instead of guessing.

## Get the pet owner's agreement

Before you request quotes, the pet owner must agree to Truvo's quote disclosure. [`GET /v1/capabilities`](/api-reference/get-capabilities) returns it as `quote_disclosure`. Show the pet owner its `text` as written, and ask whether they agree. If they agree, send its `version` as `quote_disclosure_version`, with `quote_disclosure_accepted` set to `true`. If the version isn't the current one, the request fails with `422`. [The quote disclosure](/guides/truvo#the-quote-disclosure) lists each rule and its error.

## Minimal request

Generate one `Idempotency-Key` for each new quote request, and [reuse it when you retry](/guides/request-keys). To retry, rerun the `curl` command without regenerating `KEY`. Over MCP, pass the key as `request_key`.

Set `TRUVO_API_KEY` to your [sandbox key](/guides/authentication) and replace `quote_disclosure_version` with the version the pet owner agreed to:

```bash
KEY=$(uuidgen)
curl -X POST https://api.truvo.com/v1/quote-requests \
  -H "Authorization: Bearer $TRUVO_API_KEY" \
  -H "Truvo-Version: 2026-09-26" \
  -H "Idempotency-Key: $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "line": "pet",
    "quote_disclosure_version": "2026-10-06.1",
    "quote_disclosure_accepted": true,
    "application": {
      "owner": {
        "name": {
          "first_name": "Test",
          "last_name": "Applicant One"
        },
        "email": "alex@example.com",
        "phone": "512-555-0123",
        "address": {
          "line1": "1 Main St",
          "city": "Atlanta",
          "state": "GA",
          "postal_code": "30301"
        }
      },
      "pets": [
        {
          "name": "Biscuit",
          "species": "dog",
          "breed": "Labrador Retriever",
          "date_of_birth": "2021-04-02",
          "sex": "female"
        }
      ]
    }
  }'
```

Truvo returns `202` with a quote request. [Poll the quote request](/guides/polling) to get its quotes.

## Request fields

| Label       | Meaning                                                                                                                               |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| Required    | The request fails with `422` without the field.                                                                                       |
| Required if | The request fails with `422` without the field when the condition after the label is true.                                            |
| Recommended | Optional. Carriers use the value to price the quote, so send it when you have it. If you omit it, they receive a default or no value. |
| No label    | Optional. If Truvo applies a default, the table lists it.                                                                             |

[Top-level fields](#top-level-fields) · [`application`](#application) · [`owner`](#applicationowner) · [`pets[]`](#applicationpets) · [`coverage`](#applicationcoverage)

### Top-level fields

| Field                                | Type    | Description                                                                                                                                                                                        |
| ------------------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `line` Required                      | string  | The insurance line. Value: `pet`.                                                                                                                                                                  |
| `quote_disclosure_version` Required  | string  | The version of the quote disclosure that the pet owner agreed to. `GET /v1/capabilities` returns it as `quote_disclosure.version`.                                                                 |
| `quote_disclosure_accepted` Required | boolean | Set to `true` after the pet owner agrees to the quote disclosure. Their agreement covers the quote and contact by phone, text, and email. If the value isn't `true`, the request fails with `422`. |
| `application` Required               | object  | The pet owner, pets, and coverage to quote. `GET /v1/capabilities` returns its JSON Schema as the line's `required_facts_schema`.                                                                  |

### `application`

| Field            | Type                     | Description                                                                                       |
| ---------------- | ------------------------ | ------------------------------------------------------------------------------------------------- |
| `owner` Required | object                   | The pet owner's name, contact details, and home address.                                          |
| `pets` Required  | array of 1 to 10 objects | The pets to insure.                                                                               |
| `coverage`       | object                   | The coverage settings for all pets in the request. Truvo applies a default for each one you omit. |

### `application.owner`

| Field                          | Type                                 | Description                                                                                                                                                                                                                                                                                                   |
| ------------------------------ | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `name` Required                | object                               | The pet owner's name.                                                                                                                                                                                                                                                                                         |
| `name.first_name` Required     | string, 1 to 100 characters          | The first name, such as `Alex`.                                                                                                                                                                                                                                                                               |
| `name.last_name` Required      | string, 1 to 100 characters          | The last name, such as `Smith`.                                                                                                                                                                                                                                                                               |
| `email` Required               | string (email), up to 254 characters | The pet owner's email address.                                                                                                                                                                                                                                                                                |
| `phone` Required               | string, 1 to 32 characters           | The pet owner's US phone number, including its area code, such as `512-555-0123`. The sandbox accepts `512-555-0123`; for live quotes, use the pet owner's number. A live request with a number that nobody could answer, such as a fictional number in the `555-0100` to `555-0199` range, fails with `422`. |
| `address` Required             | object                               | The address of the pet owner's home.                                                                                                                                                                                                                                                                          |
| `address.line1` Required       | string, 1 to 200 characters          | The street address, such as `100 Example Way`.                                                                                                                                                                                                                                                                |
| `address.city` Required        | string, 1 to 100 characters          | The city, such as `Austin`.                                                                                                                                                                                                                                                                                   |
| `address.state` Required       | string                               | The two-letter state code, such as `TX`.                                                                                                                                                                                                                                                                      |
| `address.postal_code` Required | string                               | The ZIP code, such as `78701` or `78701-1234`.                                                                                                                                                                                                                                                                |
| `address.line2`                | string or null, 1 to 200 characters  | A second address line, such as a unit number.                                                                                                                                                                                                                                                                 |

### `application.pets[]`

| Field                    | Type                        | Default | Description                                      |
| ------------------------ | --------------------------- | ------- | ------------------------------------------------ |
| `name` Required          | string, 1 to 100 characters |         | The pet's name, such as `Biscuit`.               |
| `species` Required       | string                      |         | The pet's species. Values: `dog`, `cat`.         |
| `breed` Required         | string, 1 to 100 characters |         | The pet's breed, such as `Labrador Retriever`.   |
| `date_of_birth` Required | string (date)               |         | The pet's date of birth, in `YYYY-MM-DD` format. |
| `sex` Required           | string                      |         | The pet's sex. Values: `female`, `male`.         |
| `neutered` Recommended   | boolean                     | `false` | Whether the pet is spayed or neutered.           |

### `application.coverage`

| Field                   | Type                                                         | Default              | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ----------------------- | ------------------------------------------------------------ | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `deductible_minor`      | integer, 0 or more, a multiple of `100` (whole dollars)      | `50000` (\$500)      | The deductible, in US cents: `50000` is \$500. If a carrier quotes a different amount, its quote reports the change in `evidence.assumptions`. Amounts carriers offer: `5000` (\$50), `10000` (\$100), `20000` (\$200), `25000` (\$250), `30000` (\$300), `35000` (\$350), `40000` (\$400), `45000` (\$450), `50000` (\$500), `55000` (\$550), `60000` (\$600), `65000` (\$650), `70000` (\$700), `75000` (\$750), `80000` (\$800), `85000` (\$850), `90000` (\$900), `95000` (\$950), `100000` (\$1,000), `110000` (\$1,100), `120000` (\$1,200), `130000` (\$1,300), `140000` (\$1,400), `150000` (\$1,500), `160000` (\$1,600), `170000` (\$1,700), `180000` (\$1,800), `190000` (\$1,900), `200000` (\$2,000), `210000` (\$2,100), `220000` (\$2,200), `230000` (\$2,300), `240000` (\$2,400), `250000` (\$2,500). |
| `reimbursement_percent` | integer, 1 to 100                                            | `80`                 | The percentage of covered vet expenses that the carrier reimburses after the deductible, such as `80` for 80%. If a carrier quotes a different percentage, its quote reports the change in `evidence.assumptions`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `annual_limit_minor`    | integer, greater than 0, a multiple of `100` (whole dollars) | `1000000` (\$10,000) | The annual limit, in US cents: `1000000` is \$10,000. If a carrier quotes a different amount, its quote reports the change in `evidence.assumptions`. Amounts carriers offer: `250000` (\$2,500), `300000` (\$3,000), `400000` (\$4,000), `500000` (\$5,000), `600000` (\$6,000), `700000` (\$7,000), `750000` (\$7,500), `800000` (\$8,000), `900000` (\$9,000), `1000000` (\$10,000), `1250000` (\$12,500), `1500000` (\$15,000), `2000000` (\$20,000), `2500000` (\$25,000), `3000000` (\$30,000).                                                                                                                                                                                                                                                                                                                  |

## Responses

| Request                                                 | Response                                                                                                                                  |
| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| Has every required field                                | `202` with a quote request. Its `assumptions` lists each default that Truvo applied.                                                      |
| Is missing a required field of `application`            | `422` `needs_information`. `field_errors` lists each missing field with the code `required`.                                              |
| Is missing `line`, `application`, or a disclosure field | `422` `invalid_input`. `field_errors` identifies the field.                                                                               |
| Has an invalid value                                    | `422` `invalid_input`. `field_errors` lists each invalid field, with `allowed_values` when the API can list the values the field accepts. |

A request that fails with `422` isn't stored, so you can send the corrected request with the same `Idempotency-Key` or a new one.

After Truvo accepts a request, a carrier can still report `missing_information` in `market_outcomes` if it needs more information than the request included. See [Why did a request finish with no quotes?](/guides/why-did-a-request-finish-with-no-quotes).

### Default values

If you omit `neutered` or a `coverage` field, Truvo sends carriers the default and reports it in the quote request's `assumptions`:

```json
{
  "path": "application.coverage.deductible_minor",
  "value": 50000,
  "source": "pet_coverage_default",
  "label": "Truvo default, $500."
}
```

To send carriers another value, create a new quote request that includes the field.

### Missing required fields

If `pets` is missing or empty, `field_errors` lists the array and the required fields of its first item. The following response is for a request whose `application` is empty:

```json
{
  "error": {
    "code": "needs_information",
    "message": "The quote request needs more information.",
    "field_errors": [
      {
        "path": "application.owner.name.first_name",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.owner.name.last_name",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.owner.email",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.owner.phone",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.owner.address.line1",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.owner.address.city",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.owner.address.state",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.owner.address.postal_code",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.pets",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.pets.0.name",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.pets.0.species",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.pets.0.breed",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.pets.0.date_of_birth",
        "message": "This fact is required.",
        "code": "required"
      },
      {
        "path": "application.pets.0.sex",
        "message": "This fact is required.",
        "code": "required"
      }
    ],
    "retry_action": {
      "type": "supply_facts",
      "summary": "Supply the missing facts and send the request again."
    },
    "doc_url": "https://docs.truvo.com/v1/errors/needs_information"
  },
  "request_id": "req_2a20b55ec50f115e"
}
```