> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bridgelinepf.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Conventions

> Formats, ids, nulls, your own identifiers, and how the API changes without breaking you.

## Requests

* **Base URL:** `https://portal.bridgelinepf.com/api`. Every path starts with `/v1`.
* **HTTPS only.** Bodies are JSON, sent with `Content-Type: application/json`. A body larger than 2 MB is refused.
* **Auth:** `Authorization: Bearer <key>`. See [authentication](/authentication).

## Formats

| Kind | Format | Example |
| - | - | - |
| Money | A decimal string in US dollars. Requests take up to two decimal places; responses always have two | `"46100.00"` |
| Rates | A number, as a fraction | `0.1195` is 11.95% |
| Dates | `YYYY-MM-DD` | `"2026-10-15"` |
| Timestamps | ISO 8601 in UTC, to the second | `"2026-10-04T15:04:05Z"` |

Money is a string so that no amount is ever rounded by a floating-point parser. Send `"46100.00"`, not `46100`: a JSON number is rejected with a hint.

Rates are fractions everywhere: `minimum_earned.rate: 0.25` means 25%, and so does `down_payment_rate: 0.25`. Sending `25` for a rate is rejected, with a hint to send `0.25`.

## Ids

Ids are opaque strings with a prefix that says what they are:

| Prefix | Object | Notes |
| - | - | - |
| `qte_` | A quote | Fixed length, 26 characters |
| `pol_` | A policy within one quote | Unique within its quote |
| `opt_` | A financing option within one quote | Deterministic: `opt_<down payment percent>_<term months>`. See [choosing an option in code](/guides/choosing-an-option) |
| `req_` | A request | In every error and the `Request-Id` header |

Apart from `opt_`, don't parse ids or assume anything about their contents. Treat a malformed id as you would any unknown one: the API answers `404`.

## Nulls and unknown fields

* **`null` means "not provided".** In a request, a field you send as `null` is the same as one you leave out. In a response, `null` means there's no value, such as `selected_option_id` before your client chooses.
* **Unknown request fields are rejected,** with a "did you mean" hint. A typo never silently does nothing.
* **Responses can gain fields.** Your code should ignore fields it doesn't know.

## Your ids

Store your own identifiers on our objects, so you never need a mapping table.

| Field | On | Limits |
| - | - | - |
| `client_reference_id` | The quote | 1 to 255 characters. Not unique: re-quoting the same proposal under one id is normal |
| `metadata` | The quote, and each policy | Up to 20 keys, each 1 to 40 characters; string values up to 500 characters |

Both come back exactly as you sent them, on every response. `metadata` is `{}` when you sent none, and policies come back in the order you sent them, each with your `metadata`. Don't put sensitive personal data in either.

## Enums only grow

Values such as `status`, `eligibility.status`, coverage `type`, and assumption, warning and error codes can gain new members. We never rename or repurpose one. Write your code so an unknown value falls into a safe default, for example:

* an unknown quote `status`: treat the quote as not usable;
* an unknown coverage `type`: treat it as `other`;
* an unknown error `code`: handle it by its `type` and HTTP status.

See [versioning](/changelog#versioning) for how we handle the rare change that can't be additive.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.