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

# Read carrier loss development

> Read a carrier’s Schedule P development triangles and interrogatory answers as reported.

Use these endpoints to read Schedule P as the carrier filed it: paid and incurred
loss triangles by accident year, and the interrogatory answers about reserving.
They require your organization’s NAIC dataset access. Contact support to enable it
after accepting the NAIC terms; the API does not enable access itself.

## Choose the carrier, line and year

Start with a carrier ID from `GET /insurance/carriers`. A five-digit NAIC company
code is also accepted; the response returns the canonical managed carrier ID.

Schedule P uses lettered lines, such as `R` for products liability and `D` for
workers' compensation. They are a separate scheme from the numbered statement
lines in state and line results. `line` is required. `SUMMARY` is the reported
all-lines page; do not add it to the lettered lines.

Set `EFFECTIVE_API_KEY` to your user API key, then request Part 2 (incurred) for
products liability in a specific statement year:

```bash theme={null}
curl --request GET \
  --url "https://api.canary.effectiveai.app/api/v2/insurance/carriers/19682/loss-development?line=R&part=2&statementYear=2025" \
  --header "Authorization: Bearer $EFFECTIVE_API_KEY"
```

The response includes the statement year, a `lossDevelopmentRows` array and
`nextCursor`. Omit `part` to read parts 2 to 6. Omit `statementYear` to select the
carrier’s latest loaded Schedule P year. Each row is one printed row of one page:

* `id`: pass unchanged to the item endpoint under the same carrier.
* `naicCompanyCode`: the source company, separate from the managed carrier ID.
* `line`, `part`, `section` and `variant`: the Schedule P page. For lines F, H and
  R, section 1 is occurrence and section 2 is claims-made.
* `sourceRow`, `rowType` and `accidentYear`: row 01 is prior years, rows 02 to 11
  are accident years and row 12 is totals.
* `development`: the triangle cells by evaluation year, with their measure and unit.
* `supplemental`: other columns on the same row, such as one-year development.
* `sources`: the Schedule P page and statement year.

Copy `lossDevelopmentRows[].id` into the item URL. For the 2024 accident year on
the occurrence page, the request is:

```bash theme={null}
curl --request GET \
  --url "https://api.canary.effectiveai.app/api/v2/insurance/carriers/19682/loss-development/nld1.WyIxOTY4MiIsMjAyNSwiUiIsIjIiLCJSIC0gU0VDVElPTiAxIiwiMTAiXQ" \
  --header "Authorization: Bearer $EFFECTIVE_API_KEY"
```

Expected response:

```json theme={null}
{
  "id": "nld1.WyIxOTY4MiIsMjAyNSwiUiIsIjIiLCJSIC0gU0VDVElPTiAxIiwiMTAiXQ",
  "carrier": {
    "id": "carrier_SD0SC8Y",
    "name": "HARTFORD FIRE INSURANCE COMPANY"
  },
  "naicCompanyCode": "19682",
  "statementYear": 2025,
  "line": {
    "code": "R",
    "name": "Products Liability — Occurrence",
    "scheme": "schedule-p"
  },
  "part": "2",
  "section": "1",
  "variant": "R - SECTION 1",
  "sourceRow": "10",
  "rowType": "accident_year",
  "accidentYear": 2024,
  "development": {
    "measure": "incurred_net_losses_and_dcc",
    "unit": "usd",
    "values": [
      { "evaluationYear": 2024, "developmentMonths": 12, "value": 52271000 },
      { "evaluationYear": 2025, "developmentMonths": 24, "value": 49247000 }
    ]
  },
  "supplemental": [{ "measure": "one_year_development", "unit": "usd", "value": -3024000 }],
  "sources": [
    {
      "exhibit": "Schedule P, Part 2R, Section 1",
      "statementYear": 2025
    }
  ]
}
```

The item has the same shape as its list entry. A carrier that resolves to several
source companies returns separate rows for each company. They are not combined.

## Interpret the values

| Part | Development measure | Unit | Basis |
| - | - | - | - |
| 2 | `incurred_net_losses_and_dcc` | usd | Net of reinsurance |
| 3 | `paid_net_losses_and_dcc` | usd | Net of reinsurance |
| 4 | `bulk_and_ibnr_net_reserves` | usd | Net of reinsurance |
| 5 | `claims_closed_with_loss_payment`, `claims_outstanding` or `claims_reported` | count | Direct and assumed |
| 6 | `direct_and_assumed_premiums_earned` or `ceded_premiums_earned` | usd | Section 1 direct and assumed; section 2 ceded |

Schedule P reports money in thousands. The API returns whole US dollars, so a
reported `52271` becomes `52271000`. Claim counts are not scaled. Negative values
are preserved. The source load does not keep blank or zero cells, so a missing
evaluation year means blank or zero; it is not evidence of either.

The API returns what the schedule reports. It does not calculate development
factors, ultimates, loss ratios or sums. Part 1, Part 7 loss-sensitive contracts
and a mapping to numbered statement lines are not available.

## Read the interrogatories

The interrogatories answer questions about the schedule, such as whether reserves
are discounted (question 4) and whether claim counts are per claim or per claimant
(question 6):

```bash theme={null}
curl --request GET \
  --url "https://api.canary.effectiveai.app/api/v2/insurance/carriers/19682/loss-development/interrogatories?year=2025" \
  --header "Authorization: Bearer $EFFECTIVE_API_KEY"
```

Expected response (abbreviated to four answers):

```json theme={null}
{
  "carrier": { "id": "carrier_SD0SC8Y", "name": "HARTFORD FIRE INSURANCE COMPANY" },
  "year": 2025,
  "coverage": "complete",
  "companies": [
    {
      "naicCompanyCode": "19682",
      "answers": [
        {
          "question": "04",
          "topic": "Discounting of Schedule P reserves",
          "yesNoResponse": "NO",
          "numericResponse": null,
          "occurrenceAmount": null,
          "claimsMadeAmount": null,
          "explanation": null
        },
        {
          "question": "05.1",
          "topic": "Net premiums in force at year end: fidelity",
          "yesNoResponse": null,
          "numericResponse": 32307000,
          "occurrenceAmount": null,
          "claimsMadeAmount": null,
          "explanation": null
        },
        {
          "question": "05.2",
          "topic": "Net premiums in force at year end: surety",
          "yesNoResponse": null,
          "numericResponse": 162603000,
          "occurrenceAmount": null,
          "claimsMadeAmount": null,
          "explanation": null
        },
        {
          "question": "06",
          "topic": "Claim count basis: per claim or per claimant",
          "yesNoResponse": null,
          "numericResponse": null,
          "occurrenceAmount": null,
          "claimsMadeAmount": null,
          "explanation": "PER CLAIM"
        }
      ],
      "sources": [{ "exhibit": "Schedule P Interrogatories", "statementYear": 2025 }]
    }
  ]
}
```

Omit `year` for the latest loaded year. Each source company has its own section.
`topic` is a short label, not the filed question text. Monetary answers are whole
US dollars; questions 5.1 and 5.2 are reported in thousands and scaled. Blank text
is null. The 2018 and 2019 loads store blank numbers as `0`, so a zero in those
years does not prove a reported zero.

## Continue and recover

Lists default to 50 rows; `limit` accepts 1–200. Follow `nextCursor` with the same
filters and limit. An omitted statement year stays pinned during traversal. Cursors
expire after 24 hours; restart without the cursor after `invalid_cursor`. Imported
values can change between calls; this is not a frozen snapshot.

* `dataset_not_enabled` (403): request NAIC access from support.
* `statutory_data_not_found` (404): no loaded Schedule P data for that carrier and
  year. This does not prove the carrier failed to file.
* Empty `lossDevelopmentRows`: the year is loaded, but the line or part has no rows.
* Item `not_found` (404): the row was removed, is unavailable, or belongs to another
  carrier. Return to the collection to discover current rows.

A nonempty list costs $0.02 plus $0.05 per returned row. One row or one
interrogatory document costs $0.07. A 50-row page costs $2.52. Errors and empty
results are free. Repeating a successful read incurs another charge. API and MCP
use the same prices.


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