# CT Injury Cases

Connecticut personal injury litigation data: motor vehicle (car accident) injury cases in Connecticut Superior Court, Hartford Judicial District, from public court records. Case outcomes and dispositions, time to disposition, trial rates, jury verdict and accepted settlement-offer amounts, motion rulings, and profiles of the judges, law firms, attorneys and medical experts involved. Free, over REST and MCP.

Derived from public Connecticut court records; not the official record; verify with the court.

- MCP (streamable HTTP, no auth): `https://ctinjurycases.com/mcp`
- REST: `GET https://ctinjurycases.com/v1/<tool>?<parameters>` or `POST` a JSON body; add `format=md` for markdown.
- OpenAPI: https://ctinjurycases.com/openapi.json
- Every tool takes an optional `purpose`: one sentence on what you are trying to find out. It is logged, never returned.
- Limits are per client, except that Claude's and ChatGPT's hosted connectors call from their platform's servers, so each platform's users share one pool. Connecting directly (e.g. Claude Code, or REST from your own machine) has its own per-user limit.

## describe_dataset

Start here. What the dataset covers (Connecticut Superior Court motor vehicle personal injury cases, Hartford Judicial District) and how current it is, every field, every stats metric and dimension, caveats, and example calls for each tool.

Not rate limited.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| disclaimer | string | How to treat the data: derived, not the official record. |
| coverage | object | What the dataset covers and how current it is. |
| coverage.asOf | string | Date of the latest fetch from the court website, YYYY-MM-DD; closedTo in windowed results. |
| coverage.totalCases | integer | Cases in the dataset. |
| coverage.districts | object[] | Coverage per judicial district. |
| coverage.districts[].district | string | Judicial district. |
| coverage.districts[].cases | integer | Cases filed in the district. |
| coverage.districts[].readDocumentKinds | string[] | Kinds of filed documents read for amounts and complaint facts. |
| coverage.caseTypes | object[] | Cases per court case type code. |
| coverage.caseTypes[].value | string | The value. |
| coverage.caseTypes[].cases | integer | Cases with that value. |
| coverage.filedYears | object[] | Cases per year filed. |
| coverage.filedYears[].value | string | The value. |
| coverage.filedYears[].cases | integer | Cases with that value. |
| fields | object | Field glossary. |
| fields.case | object[] | Fields of a case, as get_case returns them. |
| fields.case[].name | string | Field name. |
| fields.case[].description | string | What the field holds. |
| fields.complaintFacts | object[] | Facts read from the complaint, usable only as stats dimensions and filters. |
| fields.complaintFacts[].name | string | Field name. |
| fields.complaintFacts[].description | string | What the field holds. |
| metrics | object[] | Every stats metric. |
| metrics[].name | string | Metric name, the stats metric argument. |
| metrics[].unit | string | case or ruling: what the metric counts. |
| metrics[].description | string | What the metric computes. |
| metrics[].nCounts | string | What n in each group's values counts. |
| metrics[].closedInWindow | boolean | True when the metric counts only closures from closedFrom to closedTo; false when it counts every case or ruling on record. |
| metrics[].caveats | string[] | What to keep in mind when reading the metric. |
| dimensions | object[] | Every stats dimension. |
| dimensions[].name | string | Dimension name, for group_by or as a filter. |
| dimensions[].units | string[] | Units (case, ruling) the dimension applies to. |
| dimensions[].multiValued | boolean | True when one case can take several values, so groups overlap. |
| dimensions[].description | string | What the dimension is. |
| caveats | string[] | What to keep in mind across the dataset. |
| examples | string[] | One example call per tool: the tool name, then its arguments as JSON. |

Example: https://ctinjurycases.com/v1/describe_dataset

## search_cases

List auto-injury cases matching filters, in docket-number order, up to 50 per page. Use get_case for one case in full and stats for counts, rates and amounts across many.

Rate limited: 60 calls a minute per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 600 calls a minute.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| district | string | no | Judicial district, e.g. HARTFORD JD. |
| case_type | string | no | Case type code: V01, V04 or V09. |
| litigation_type | string | no | third_party, um_uim or subrogation. |
| filed_from | string | no | Filed on or after this date (YYYY-MM-DD). |
| filed_to | string | no | Filed on or before this date (YYYY-MM-DD). |
| disposition_category | string | no | How the case ended, e.g. withdrawal or plaintiff_verdict; pending for open cases. |
| trial_kind | string | no | jury, court or not_tried. |
| judge_key | string | no | Judge key from search_judges; matches the judge who decided the disposition. |
| firm_juris_number | string | no | Juris number from search_firms; matches either side's lead firm. |
| cursor | string | no | nextCursor from the previous page; omit for the first page. |
| limit | integer | no | Results per page, at most 50 (the default). |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| results | object[] | This page of matches. |
| results[].docketNumber | string | Connecticut docket number, e.g. HHD-CV-21-6140000-S. |
| results[].district | string | Judicial district the case is filed in, e.g. HARTFORD JD. |
| results[].caseType | string | Court case type code: V01 driver or passenger vs driver, V04 pedestrian vs driver, V09 other motor-vehicle torts. |
| results[].litigationType | string | third_party (injured person vs at-fault driver), um_uim (claim against own uninsured/underinsured motorist carrier), subrogation (insurer suing to recover what it paid). |
| results[].fileDate | string | Date the case was filed. |
| results[].dispositionCategory | string \| null | How the case ended, grouped from the court disposition text; null while pending. damages_hearing is a judgment after a hearing that only set damages, usually after a default, not a trial. |
| results[].dispositionDate | string \| null | Date of disposition; null while pending. |
| results[].trialKind | string \| null | jury or court when the case was tried to a verdict or decision; null otherwise. |
| results[].officialUrl | string | The case on the Connecticut Judicial Branch civil inquiry site, the official record. |
| total | integer | Matches across all pages. |
| nextCursor | string \| null | Pass as cursor for the next page; null on the last. |

Example: https://ctinjurycases.com/v1/search_cases?district=HARTFORD%20JD&filed_from=2021-01-01&limit=5

## get_case

One case: dates, disposition, trial, verdict and offer amounts, its motion rulings, and the judges, attorneys and law firms by side.

Rate limited: 60 calls a minute per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 600 calls a minute.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| docket_number | string | yes | Docket number, e.g. HHD-CV-21-6140000-S. |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| case | object | The case record. |
| case.docketNumber | string | Connecticut docket number, e.g. HHD-CV-21-6140000-S. |
| case.officialUrl | string | The case on the Connecticut Judicial Branch civil inquiry site, the official record. |
| case.district | string | Judicial district the case is filed in, e.g. HARTFORD JD. |
| case.caseType | string | Court case type code: V01 driver or passenger vs driver, V04 pedestrian vs driver, V09 other motor-vehicle torts. |
| case.litigationType | string | third_party (injured person vs at-fault driver), um_uim (claim against own uninsured/underinsured motorist carrier), subrogation (insurer suing to recover what it paid). |
| case.fileDate | string | Date the case was filed. |
| case.fileYear | integer | Year the case was filed. |
| case.dispositionCategory | string \| null | How the case ended, grouped from the court disposition text; null while pending. damages_hearing is a judgment after a hearing that only set damages, usually after a default, not a trial. |
| case.dispositionDate | string \| null | Date of disposition; null while pending. |
| case.daysToDisposition | integer \| null | Days from filing to disposition; null while pending. |
| case.trialKind | string \| null | jury or court when the case was tried to a verdict or decision; null otherwise. |
| case.trialDate | string \| null | Trial date recorded on the docket. |
| case.closedPleadingsDate | string \| null | Date pleadings were closed. |
| case.juryClaimDate | string \| null | Date a jury was claimed. |
| case.defendants | integer | Number of defendants. |
| case.splitOutcome | boolean | True when defendants in the same case reached different outcomes. |
| case.acceptedOfferCents | integer \| null | Amount of the offer of compromise that was accepted, in cents; null when none was accepted or the amount is unknown. |
| case.arbitrationNetAwardCents | integer \| null | Net court-annexed arbitration award, in cents, when one was read from the award. |
| case.trialDeNovoDemanded | boolean | True when either side demanded a trial de novo after arbitration. |
| case.netVerdictCents | integer \| null | Net jury verdict for the plaintiff after comparative negligence, in cents; null without a plaintiff or mixed jury verdict whose amount was read. |
| case.dispositionJudgeKey | string \| null | Key of the judge who decided the disposition, when a judge did. |
| case.plaintiffJurisNumber | string \| null | Juris number of the plaintiff side's lead law firm. |
| case.defenseJurisNumber | string \| null | Juris number of the defense side's lead law firm. |
| dispositionJudge | object \| null | The judge who decided the disposition; null when no judge did. |
| dispositionJudge.key | string | Judge key, for get_judge. |
| dispositionJudge.name | string \| null | Judge name; null when the key has no registered name. |
| firms | object | Lead law firm on each side; null when none is known. |
| firms.plaintiff | object \| null | The plaintiff side's lead firm. |
| firms.plaintiff.jurisNumber | string | Juris number. |
| firms.plaintiff.name | string \| null | Name; null when the registry has none. |
| firms.defense | object \| null | The defense side's lead firm. |
| firms.defense.jurisNumber | string | Juris number. |
| firms.defense.name | string \| null | Name; null when the registry has none. |
| attorneys | object[] | Attorneys who appeared, with their juris numbers for get_attorney. |
| attorneys[].jurisNumber | string | Juris number. |
| attorneys[].name | string \| null | Name; null when the registry has none. |
| attorneys[].side | string | Side the attorney appeared for: plaintiff or defendant. |
| rulings | object[] | Motion rulings in the case. |
| rulings[].motionFamily | string | Kind of motion ruled on. |
| rulings[].movingSide | string | Side that filed the motion. |
| rulings[].opposed | boolean | Whether an objection to the motion was filed. |
| rulings[].outcome | string | Ruling outcome: granted, denied, partial, off, order, withdrawn… |
| rulings[].judge | object \| null | The judge who ruled, when known. |
| rulings[].judge.key | string | Judge key, for get_judge. |
| rulings[].judge.name | string \| null | Judge name; null when the key has no registered name. |
| rulings[].rulingDate | string | Date of the ruling. |
| rulings[].daysToRuling | integer \| null | Days from filing the motion to the ruling. |

Example: https://ctinjurycases.com/v1/get_case?docket_number=HHD-CV-13-6042060-S

## stats

Compute one metric over cases (or motion rulings), optionally broken down by up to two dimensions and narrowed by filters. describe_dataset lists every metric and dimension and which unit each applies to. Groups of three or fewer cases are suppressed. At most 100 groups, largest first.

Rate limited: 60 calls a minute per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 600 calls a minute.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| metric | case_count \| disposition_mix \| median_days_to_disposition \| trial_rate \| plaintiff_verdict_rate \| net_verdict \| accepted_offer \| motion_grant_rate | yes | What to compute; see describe_dataset for each metric. |
| group_by | (district \| file_year \| case_type \| litigation_type \| disposition_category \| trial_kind \| judge_key \| plaintiff_firm \| defense_firm \| motion_family \| moving_side \| mechanism \| plaintiff_role \| road_type \| commercial_vehicle \| um_uim \| amount_in_demand \| claims_lost_wages \| injury_kind \| injury_region)[] | no | Up to two dimensions to break the metric down by. |
| district | string | no | Judicial district, e.g. HARTFORD JD. |
| case_type | string | no | Case type code: V01, V04 or V09. |
| litigation_type | string | no | third_party, um_uim or subrogation. |
| filed_from | string | no | Filed on or after this date (YYYY-MM-DD). |
| filed_to | string | no | Filed on or before this date (YYYY-MM-DD). |
| disposition_category | string | no | How the case ended, e.g. withdrawal or plaintiff_verdict; pending for open cases. |
| trial_kind | string | no | jury, court or not_tried. |
| judge_key | string | no | Judge key from search_judges; matches the judge who decided the disposition. |
| firm_juris_number | string | no | Juris number from search_firms; matches either side's lead firm. |
| mechanism | string | no | How the crash happened, e.g. rear_end. |
| plaintiff_role | string | no | driver, passenger, pedestrian… |
| road_type | string | no | Kind of road, e.g. interstate. |
| commercial_vehicle | boolean | no | A commercial vehicle was involved. |
| um_uim | boolean | no | UM/UIM coverage is claimed. |
| amount_in_demand | string | no | Amount-in-demand band, e.g. 15000_or_more. |
| claims_lost_wages | boolean | no | Lost wages are claimed. |
| injury_kind | string | no | An alleged injury kind, e.g. fracture. |
| injury_region | string | no | An injured body region, e.g. neck. |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| metric | string | The metric computed. |
| unit | case \| ruling | What the metric counts: cases, or motion rulings for motion_grant_rate. |
| groupBy | string[] | The group_by dimensions, in order. |
| groups | object[] | One entry per group, largest n first. |
| groups[].group | map of string \| number \| boolean \| null | The group: each group_by dimension and its value. Empty without group_by. |
| groups[].suppressed | true \| false | Too few cases to show; values are withheld. Shown: the group has enough cases. |
| groups[].cases | integer | Distinct cases in the group, after the closure window for windowed metrics. Decides suppression. |
| groups[].values | map of number \| null \| map of number | The metric's figures for the group, always with n; each metric's entry in describe_dataset says what n counts and what the other keys are. |
| closedFrom | string \| null | For metrics over closed cases, the first disposition date counted, inclusive; the figures are not all-time. Null for metrics over every case. |
| closedTo | string \| null | For metrics over closed cases, the last disposition date counted, inclusive: the as-of date. Null for metrics over every case. |
| totalGroups | integer | Groups before the cap on how many are returned. |
| groupsSuppressed | integer | Returned groups that are suppressed. |
| truncated | boolean | True when more groups exist than were returned. |
| multiValuedDimensions | string[] | Dimensions where one case can sit in several groups, so group counts overlap. |
| names | map of string | Names of the judges and firms in the groups. |

### Metrics

#### case_count

Number of cases, open or closed.

- n counts: Cases.
- Counts: Every case on record.

#### disposition_mix

Closed cases counted by disposition category, in counts.

- n counts: Cases closed in the window.
- Counts: Only cases closed from closedFrom to closedTo.
- Counts only cases closed in the 330 days ending at the as-of date (closedFrom to closedTo): the court removes withdrawn cases about a year after withdrawal, so only the last ~11 months of closures are complete. A district last fetched before the as-of date contributes closures only up to its fetch date, a slightly shorter window; the closures it does contribute are still complete.
- Closures on record cluster in this window anyway: the court has already removed older withdrawals, so earlier years hold mostly judgments.
- Contested trials are rare, about 0.5% of closures, so any split of them is thin; always read n.

#### median_days_to_disposition

Median days from filing to disposition, as medianDays.

- n counts: Cases closed in the window.
- Counts: Only cases closed from closedFrom to closedTo.
- Counts only cases closed in the 330 days ending at the as-of date (closedFrom to closedTo): the court removes withdrawn cases about a year after withdrawal, so only the last ~11 months of closures are complete. A district last fetched before the as-of date contributes closures only up to its fetch date, a slightly shorter window; the closures it does contribute are still complete.
- Closures on record cluster in this window anyway: the court has already removed older withdrawals, so earlier years hold mostly judgments.

#### trial_rate

Share of closed cases that went through a contested trial to a jury or the court, as rate, with the count as trials. A hearing that only set damages (disposition damages_hearing) is not a trial.

- n counts: Cases closed in the window.
- Counts: Only cases closed from closedFrom to closedTo.
- Counts only cases closed in the 330 days ending at the as-of date (closedFrom to closedTo): the court removes withdrawn cases about a year after withdrawal, so only the last ~11 months of closures are complete. A district last fetched before the as-of date contributes closures only up to its fetch date, a slightly shorter window; the closures it does contribute are still complete.
- Closures on record cluster in this window anyway: the court has already removed older withdrawals, so earlier years hold mostly judgments.
- Contested trials are rare, about 0.5% of closures, so any split of them is thin; always read n.

#### plaintiff_verdict_rate

Plaintiff verdicts as a share of plaintiff plus defense verdicts, as rate, with the count as plaintiffVerdicts.

- n counts: Plaintiff plus defense verdicts; mixed verdicts are left out.
- Counts: Every case on record.
- Counts every verdict on record, since verdicts are not removed from the court website, but recent years hold only a few verdicts each; always read n.

#### net_verdict

Net plaintiff jury verdict after comparative negligence, in cents: medianCents, and the nearest-rank 25th and 75th percentiles as p25Cents and p75Cents.

- n counts: Plaintiff or mixed jury verdicts whose amount was read from the verdict form.
- Counts: Every case on record.
- Counts every verdict on record, since verdicts are not removed from the court website, but recent years hold only a few verdicts each; always read n.

#### accepted_offer

Accepted offer of compromise, in cents: medianCents, and the nearest-rank 25th and 75th percentiles as p25Cents and p75Cents.

- n counts: Cases closed in the window with an accepted offer whose amount was read.
- Counts: Only cases closed from closedFrom to closedTo.
- Counts only cases closed in the 330 days ending at the as-of date (closedFrom to closedTo): the court removes withdrawn cases about a year after withdrawal, so only the last ~11 months of closures are complete. A district last fetched before the as-of date contributes closures only up to its fetch date, a slightly shorter window; the closures it does contribute are still complete.
- Most cases with an accepted offer then close by withdrawal, which the court removes about a year later; hence the window.

#### motion_grant_rate

Granted rulings as a share of decided ones, as rate, with the count as granted. Counted per ruling, not per case.

- n counts: Decided rulings: granted, denied or granted in part. Off-calendar, withdrawn and bare orders are left out.
- Counts: Every ruling on record.

### Groups

- Any group of 3 or fewer cases is suppressed: it shows suppressed: true and no values.
- injury_kind and injury_region are multi-valued: one case can sit in several of their groups, so those groups overlap and their counts can add up to more than the total.
- At most 100 groups, largest n first; truncated says whether more exist.

Example: https://ctinjurycases.com/v1/stats?metric=net_verdict&group_by=injury_kind

## search_judges

List judges by name and district, with case counts, most cases first. get_judge gives one judge in full.

Rate limited: 60 calls a minute per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 600 calls a minute.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| name | string | no | Part of the name, any case. |
| district | string | no | Judicial district, e.g. HARTFORD JD. |
| cursor | string | no | nextCursor from the previous page; omit for the first page. |
| limit | integer | no | Results per page, at most 50 (the default). |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| results | object[] | This page of matches. |
| results[].key | string | Judge key, for get_judge and the judge_key filter. |
| results[].name | string \| null | Name. |
| results[].cases | integer | Cases where the judge decided the disposition or ruled on a motion. |
| results[].districts | string[] | Judicial districts of those cases. |
| results[].casesByYear | map of integer | Cases counted by the year they were filed. |
| total | integer | Matches across all pages. |
| nextCursor | string \| null | Pass as cursor for the next page; null on the last. |

Example: https://ctinjurycases.com/v1/search_judges?limit=5

## get_judge

One judge: how the cases they decided ended (closures in the last ~11 months), motion grant rates by motion family, and trial and verdict figures.

Rate limited, and shares a daily limit with the other profile tools: 25 profile calls a day per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 500 profile calls a day.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| judge_key | string | yes | Judge key from search_judges. |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| key | string | Judge key, for get_judge and the judge_key filter. |
| name | string \| null | Name. |
| cases | integer | Cases where the judge decided the disposition or ruled on a motion. |
| districts | string[] | Judicial districts of those cases. |
| casesByYear | map of integer | Cases counted by the year they were filed. |
| closedFrom | string | First disposition date counted, inclusive. Outcome counts here cover only cases closed from closedFrom to closedTo, not all time. |
| closedTo | string | Last disposition date counted, inclusive: the dataset as-of date. |
| dispositions | map of integer | Cases whose disposition this judge decided and that closed from closedFrom to closedTo, by how they ended. Counts only cases closed in the 330 days ending at the as-of date (closedFrom to closedTo): the court removes withdrawn cases about a year after withdrawal, so only the last ~11 months of closures are complete. A district last fetched before the as-of date contributes closures only up to its fetch date, a slightly shorter window; the closures it does contribute are still complete. |
| rulingsByMotionFamily | object[] | The judge's motion rulings by kind of motion, over every ruling on record. |
| rulingsByMotionFamily[].motionFamily | string | Kind of motion. |
| rulingsByMotionFamily[].rulings | integer | Rulings on such motions. |
| rulingsByMotionFamily[].decided | integer | Of those, rulings that decided the motion: granted, denied or granted in part. |
| rulingsByMotionFamily[].granted | integer | Of the decided, those granted. |
| rulingsByMotionFamily[].grantRate | number \| null | granted / decided; null when none were decided. |
| trialFigures | map of number \| null \| null | Tried cases, verdict counts and rates, median net verdict in cents, median days from filing to trial and to closed pleadings. |

Past the daily profile limit it answers instead with limitReached, limit, resetsAt, message, contactUrl.

Example: https://ctinjurycases.com/v1/get_judge?judge_key=MORGAN%7CL

## search_firms

List law firms by name, side, district and size, most cases first. get_firm gives one firm in full.

Rate limited: 60 calls a minute per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 600 calls a minute.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| name | string | no | Part of the name, any case. |
| side | plaintiff \| defense | no | Only those with cases for this side, ranked by their cases on that side rather than by all their cases. |
| district | string | no | Judicial district, e.g. HARTFORD JD. |
| min_cases | integer | no | At least this many cases; with side, cases on that side. |
| cursor | string | no | nextCursor from the previous page; omit for the first page. |
| limit | integer | no | Results per page, at most 50 (the default). |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| results | object[] | This page of matches. |
| results[].jurisNumber | string | Firm juris number, for get_firm and the firm filters. |
| results[].name | string \| null | Name. |
| results[].cases | integer | Every case the firm appeared in, as lead firm or not. The firm's other figures count only the cases it leads a side in, so their totals can be a little lower. |
| results[].districts | string[] | Judicial districts the firm appeared in. |
| results[].casesByYear | map of integer | Cases the firm leads a side in, by the year they were filed. |
| results[].kind | firm \| individual | individual: a person's name rather than a firm's, such as a solo practitioner. |
| results[].plaintiffCases | integer | Of cases, those where the firm appeared for the plaintiff, as lead firm or not. |
| results[].defenseCases | integer | Of cases, those where the firm appeared for the defense, as lead firm or not. |
| total | integer | Matches across all pages. |
| nextCursor | string \| null | Pass as cursor for the next page; null on the last. |

Example: https://ctinjurycases.com/v1/search_firms?side=defense&min_cases=20&limit=5

## get_firm

One law firm: its attorneys, the firms it most often faces, the medical experts named for its side, its motion practice, and how its cases ended. A firm's case counts (cases, plaintiffCases, defenseCases) cover every case it appeared in. Its other figures (casesByYear, opposing firms, experts, motion practice, outcomes), the stats plaintiff_firm and defense_firm dimensions and the firm_juris_number filter cover only the cases where it is a side's lead firm, so one firm's case total can differ slightly from place to place.

Rate limited, and shares a daily limit with the other profile tools: 25 profile calls a day per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 500 profile calls a day.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| juris_number | string | yes | Firm juris number from search_firms. |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| jurisNumber | string | Firm juris number, for get_firm and the firm filters. |
| name | string \| null | Name. |
| cases | integer | Every case the firm appeared in, as lead firm or not. The firm's other figures count only the cases it leads a side in, so their totals can be a little lower. |
| districts | string[] | Judicial districts the firm appeared in. |
| casesByYear | map of integer | Cases the firm leads a side in, by the year they were filed. |
| kind | firm \| individual | individual: a person's name rather than a firm's, such as a solo practitioner. |
| plaintiffCases | integer | Of cases, those where the firm appeared for the plaintiff, as lead firm or not. |
| defenseCases | integer | Of cases, those where the firm appeared for the defense, as lead firm or not. |
| attorneys | object[] | Attorneys who have filed with this firm. |
| attorneys[].jurisNumber | string | Attorney juris number, for get_attorney. |
| attorneys[].name | string \| null | Attorney name; null when the registry has none. |
| opposingFirms | object[] | Lead firms on the other side, most frequent first. |
| opposingFirms[].jurisNumber | string | Firm juris number, for get_firm. |
| opposingFirms[].name | string \| null | Firm name; null when the firm is not in the dataset. |
| opposingFirms[].cases | integer | Cases counted together. |
| expertsDisclosed | object[] | Medical providers named for this side in its cases, most frequent first. |
| expertsDisclosed[].providerId | string | Provider id, for get_provider. |
| expertsDisclosed[].name | string | Provider name. |
| expertsDisclosed[].specialty | string \| null | Specialty, when known. |
| expertsDisclosed[].cases | integer | Of these cases, those naming the provider. |
| motionPractice | object[] | This side's motions in these cases and how often they were granted. |
| motionPractice[].motionFamily | string | Kind of motion. |
| motionPractice[].rulings | integer | Rulings on such motions. |
| motionPractice[].decided | integer | Of those, rulings that decided the motion: granted, denied or granted in part. |
| motionPractice[].granted | integer | Of the decided, those granted. |
| motionPractice[].grantRate | number \| null | granted / decided; null when none were decided. |
| outcomes | object | How these cases ended. |
| outcomes.closedFrom | string | First disposition date counted, inclusive. Outcome counts here cover only cases closed from closedFrom to closedTo, not all time. |
| outcomes.closedTo | string | Last disposition date counted, inclusive: the dataset as-of date. |
| outcomes.dispositions | map of integer | Cases closed from closedFrom to closedTo, counted by disposition category. Counts only cases closed in the 330 days ending at the as-of date (closedFrom to closedTo): the court removes withdrawn cases about a year after withdrawal, so only the last ~11 months of closures are complete. A district last fetched before the as-of date contributes closures only up to its fetch date, a slightly shorter window; the closures it does contribute are still complete. |
| outcomes.acceptedOffer | object | Accepted offers of compromise in cases closed from closedFrom to closedTo; most such cases close by withdrawal, which the court removes. |
| outcomes.acceptedOffer.n | integer | Amounts counted. |
| outcomes.acceptedOffer.medianCents | number \| null | Median amount in cents; null when n is 0. |
| outcomes.acceptedOffer.p25Cents | number \| null | Nearest-rank 25th percentile in cents; null when n is 0. |
| outcomes.acceptedOffer.p75Cents | number \| null | Nearest-rank 75th percentile in cents; null when n is 0. |
| outcomes.netVerdict | object | Every net jury verdict on record, not limited to closedFrom to closedTo: verdicts are not removed from the court website. |
| outcomes.netVerdict.n | integer | Amounts counted. |
| outcomes.netVerdict.medianCents | number \| null | Median amount in cents; null when n is 0. |
| outcomes.netVerdict.p25Cents | number \| null | Nearest-rank 25th percentile in cents; null when n is 0. |
| outcomes.netVerdict.p75Cents | number \| null | Nearest-rank 75th percentile in cents; null when n is 0. |

Past the daily profile limit it answers instead with limitReached, limit, resetsAt, message, contactUrl.

Example: https://ctinjurycases.com/v1/get_firm?juris_number=408308

## search_attorneys

List attorneys by name, firm, side and district, most cases first. get_attorney gives one attorney in full.

Rate limited: 60 calls a minute per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 600 calls a minute.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| name | string | no | Part of the name, any case. |
| firm_juris_number | string | no | Juris number of their firm. |
| side | plaintiff \| defense | no | Only those with cases for this side, ranked by their cases on that side rather than by all their cases. |
| district | string | no | Judicial district, e.g. HARTFORD JD. |
| cursor | string | no | nextCursor from the previous page; omit for the first page. |
| limit | integer | no | Results per page, at most 50 (the default). |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| results | object[] | This page of matches. |
| results[].jurisNumber | string | Attorney juris number, for get_attorney. |
| results[].name | string \| null | The name the Connecticut Judicial Branch registers for the juris number; null when it lists no attorney under it. The attorney's cases are counted either way. |
| results[].cases | integer | Every case the attorney appeared in, with any firm they have filed with. |
| results[].districts | string[] | Judicial districts of those cases. |
| results[].casesByYear | map of integer | Cases counted by the year they were filed. |
| results[].plaintiffCases | integer | Of cases, those on the plaintiff side. |
| results[].defenseCases | integer | Of cases, those on the defense side. |
| total | integer | Matches across all pages. |
| nextCursor | string \| null | Pass as cursor for the next page; null on the last. |

Example: https://ctinjurycases.com/v1/search_attorneys?side=plaintiff&limit=5

## get_attorney

One attorney: their firms, the firms they most often face, the medical experts named for their side, their motion practice, and how their cases ended. An attorney's figures span every firm the attorney has filed with, not only their current firm.

Rate limited, and shares a daily limit with the other profile tools: 25 profile calls a day per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 500 profile calls a day.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| juris_number | string | yes | Attorney juris number from search_attorneys. |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| jurisNumber | string | Attorney juris number, for get_attorney. |
| name | string \| null | The name the Connecticut Judicial Branch registers for the juris number; null when it lists no attorney under it. The attorney's cases are counted either way. |
| cases | integer | Every case the attorney appeared in, with any firm they have filed with. |
| districts | string[] | Judicial districts of those cases. |
| casesByYear | map of integer | Cases counted by the year they were filed. |
| plaintiffCases | integer | Of cases, those on the plaintiff side. |
| defenseCases | integer | Of cases, those on the defense side. |
| firms | object[] | Every firm the attorney has filed with. |
| firms[].jurisNumber | string | Firm juris number, for get_firm. |
| firms[].name | string \| null | Firm name; null when the firm is not in the dataset. |
| opposingFirms | object[] | Lead firms on the other side, most frequent first. |
| opposingFirms[].jurisNumber | string | Firm juris number, for get_firm. |
| opposingFirms[].name | string \| null | Firm name; null when the firm is not in the dataset. |
| opposingFirms[].cases | integer | Cases counted together. |
| expertsDisclosed | object[] | Medical providers named for this side in its cases, most frequent first. |
| expertsDisclosed[].providerId | string | Provider id, for get_provider. |
| expertsDisclosed[].name | string | Provider name. |
| expertsDisclosed[].specialty | string \| null | Specialty, when known. |
| expertsDisclosed[].cases | integer | Of these cases, those naming the provider. |
| motionPractice | object[] | This side's motions in these cases and how often they were granted. |
| motionPractice[].motionFamily | string | Kind of motion. |
| motionPractice[].rulings | integer | Rulings on such motions. |
| motionPractice[].decided | integer | Of those, rulings that decided the motion: granted, denied or granted in part. |
| motionPractice[].granted | integer | Of the decided, those granted. |
| motionPractice[].grantRate | number \| null | granted / decided; null when none were decided. |
| outcomes | object | How these cases ended. |
| outcomes.closedFrom | string | First disposition date counted, inclusive. Outcome counts here cover only cases closed from closedFrom to closedTo, not all time. |
| outcomes.closedTo | string | Last disposition date counted, inclusive: the dataset as-of date. |
| outcomes.dispositions | map of integer | Cases closed from closedFrom to closedTo, counted by disposition category. Counts only cases closed in the 330 days ending at the as-of date (closedFrom to closedTo): the court removes withdrawn cases about a year after withdrawal, so only the last ~11 months of closures are complete. A district last fetched before the as-of date contributes closures only up to its fetch date, a slightly shorter window; the closures it does contribute are still complete. |
| outcomes.acceptedOffer | object | Accepted offers of compromise in cases closed from closedFrom to closedTo; most such cases close by withdrawal, which the court removes. |
| outcomes.acceptedOffer.n | integer | Amounts counted. |
| outcomes.acceptedOffer.medianCents | number \| null | Median amount in cents; null when n is 0. |
| outcomes.acceptedOffer.p25Cents | number \| null | Nearest-rank 25th percentile in cents; null when n is 0. |
| outcomes.acceptedOffer.p75Cents | number \| null | Nearest-rank 75th percentile in cents; null when n is 0. |
| outcomes.netVerdict | object | Every net jury verdict on record, not limited to closedFrom to closedTo: verdicts are not removed from the court website. |
| outcomes.netVerdict.n | integer | Amounts counted. |
| outcomes.netVerdict.medianCents | number \| null | Median amount in cents; null when n is 0. |
| outcomes.netVerdict.p25Cents | number \| null | Nearest-rank 25th percentile in cents; null when n is 0. |
| outcomes.netVerdict.p75Cents | number \| null | Nearest-rank 75th percentile in cents; null when n is 0. |

Past the daily profile limit it answers instead with limitReached, limit, resetsAt, message, contactUrl.

Example: https://ctinjurycases.com/v1/get_attorney?juris_number=409856

## search_providers

List medical providers named in expert disclosures, by type, specialty, side (treating or defense examiner), town and size, most cases first. get_provider gives one provider in full.

Rate limited: 60 calls a minute per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 600 calls a minute.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| name | string | no | Part of the name, any case. |
| type | string | no | physician, therapy, imaging or facility. |
| specialty | string | no | Part of the specialty, e.g. orthop. |
| side | treating \| defense_examiner | no | treating: named as the plaintiff's treating provider; defense_examiner: retained by the defense to examine the plaintiff. |
| town | string | no | Town the provider practises in. |
| min_cases | integer | no | At least this many cases. |
| cursor | string | no | nextCursor from the previous page; omit for the first page. |
| limit | integer | no | Results per page, at most 50 (the default). |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| results | object[] | This page of matches. |
| results[].id | string | Provider id, for get_provider. |
| results[].name | string \| null | Name. |
| results[].cases | integer | Cases whose expert disclosures name the provider. |
| results[].districts | string[] | Judicial districts of those cases. |
| results[].casesByYear | map of integer | Cases counted by the year they were filed. |
| results[].kind | clinician \| practice | clinician: a person; practice: a clinic, hospital or other organisation. |
| results[].type | string | physician, therapy, imaging or facility. |
| results[].credential | string \| null | The credential named in the filings. When the filings name none, or one outside the usual list, and the federal NPI registry finds the clinician exactly once, the credential the registry lists, e.g. "M.D.". "other" when the filings name a credential outside the usual list and the registry does not supply one. null when neither says. |
| results[].specialty | string \| null | The specialty named in the filings. When the filings name none and the federal NPI registry finds the clinician exactly once and, when the filings name a credential from the usual list, lists that same credential: the registry's primary taxonomy, e.g. Orthopaedic Surgery. null otherwise. |
| results[].town | string \| null | Town the provider practises in, when known. |
| results[].side | treating \| defense_examiner | treating: named as the plaintiff's treating provider; defense_examiner: retained by the defense to examine the plaintiff. |
| total | integer | Matches across all pages. |
| nextCursor | string \| null | Pass as cursor for the next page; null on the last. |

Example: https://ctinjurycases.com/v1/search_providers?side=defense_examiner&specialty=orthop&limit=5

## get_provider

One medical provider: the law firms that named them, their case list, how those cases ended, and, for defense examiners, the kinds of findings they disputed and on which body regions (counts only).

Rate limited, and shares a daily limit with the other profile tools: 25 profile calls a day per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 500 profile calls a day.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| provider_id | string | yes | Provider id from search_providers. |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| id | string | Provider id, for get_provider. |
| name | string \| null | Name. |
| cases | integer | Cases whose expert disclosures name the provider. |
| districts | string[] | Judicial districts of those cases. |
| casesByYear | map of integer | Cases counted by the year they were filed. |
| kind | clinician \| practice | clinician: a person; practice: a clinic, hospital or other organisation. |
| type | string | physician, therapy, imaging or facility. |
| credential | string \| null | The credential named in the filings. When the filings name none, or one outside the usual list, and the federal NPI registry finds the clinician exactly once, the credential the registry lists, e.g. "M.D.". "other" when the filings name a credential outside the usual list and the registry does not supply one. null when neither says. |
| specialty | string \| null | The specialty named in the filings. When the filings name none and the federal NPI registry finds the clinician exactly once and, when the filings name a credential from the usual list, lists that same credential: the registry's primary taxonomy, e.g. Orthopaedic Surgery. null otherwise. |
| town | string \| null | Town the provider practises in, when known. |
| side | treating \| defense_examiner | treating: named as the plaintiff's treating provider; defense_examiner: retained by the defense to examine the plaintiff. |
| retainingFirms | object[] | The lead firm on the provider's side in their cases, most frequent first. |
| retainingFirms[].jurisNumber | string | Firm juris number, for get_firm. |
| retainingFirms[].name | string \| null | Firm name; null when the firm is not in the dataset. |
| retainingFirms[].cases | integer | Cases counted together. |
| docketNumbers | string[] | Docket numbers of the cases naming the provider, for get_case. |
| disputes | object \| null | Findings this examiner disputed in defense examinations; null when none were read. |
| disputes.total | integer | Disputed findings read. |
| disputes.byKind | map of integer | Disputed findings counted by kind of dispute. |
| disputes.byBodyRegion | map of integer | Disputed findings counted by body region. |
| outcomes | object | How these cases ended. |
| outcomes.closedFrom | string | First disposition date counted, inclusive. Outcome counts here cover only cases closed from closedFrom to closedTo, not all time. |
| outcomes.closedTo | string | Last disposition date counted, inclusive: the dataset as-of date. |
| outcomes.dispositions | map of integer | Cases closed from closedFrom to closedTo, counted by disposition category. Counts only cases closed in the 330 days ending at the as-of date (closedFrom to closedTo): the court removes withdrawn cases about a year after withdrawal, so only the last ~11 months of closures are complete. A district last fetched before the as-of date contributes closures only up to its fetch date, a slightly shorter window; the closures it does contribute are still complete. |
| outcomes.acceptedOffer | object | Accepted offers of compromise in cases closed from closedFrom to closedTo; most such cases close by withdrawal, which the court removes. |
| outcomes.acceptedOffer.n | integer | Amounts counted. |
| outcomes.acceptedOffer.medianCents | number \| null | Median amount in cents; null when n is 0. |
| outcomes.acceptedOffer.p25Cents | number \| null | Nearest-rank 25th percentile in cents; null when n is 0. |
| outcomes.acceptedOffer.p75Cents | number \| null | Nearest-rank 75th percentile in cents; null when n is 0. |
| outcomes.netVerdict | object | Every net jury verdict on record, not limited to closedFrom to closedTo: verdicts are not removed from the court website. |
| outcomes.netVerdict.n | integer | Amounts counted. |
| outcomes.netVerdict.medianCents | number \| null | Median amount in cents; null when n is 0. |
| outcomes.netVerdict.p25Cents | number \| null | Nearest-rank 25th percentile in cents; null when n is 0. |
| outcomes.netVerdict.p75Cents | number \| null | Nearest-rank 75th percentile in cents; null when n is 0. |

Past the daily profile limit it answers instead with limitReached, limit, resetsAt, message, contactUrl.

Example: https://ctinjurycases.com/v1/get_provider?provider_id=practice%3Ajeffersonradiology

## request_data

Tell us about data this dataset does not have but you need: other courts or states, case types, fields, documents. Logged and read by the people who build the dataset.

Rate limited: 60 calls a minute per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 600 calls a minute.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| description | string | yes | What data you need and what you would use it for. |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| received | true | The submission was recorded. |
| message | string | Acknowledgement to pass on to the user. |

Example: https://ctinjurycases.com/v1/request_data?description=Verdict%20amounts%20for%20New%20Haven%20JD%20auto%20cases%20since%202020.

## send_message

Send a message to the person who runs this service: feedback, a question, a problem with the data, or interest in paid features, broader coverage or higher limits. Include the user's name or email only with their explicit permission.

Rate limited: 60 calls a minute per client. Calls through Claude's or ChatGPT's hosted connectors all come from that platform's servers, so each platform's users share one limit of 600 calls a minute.

### Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| message | string | yes | The message. |
| name | string | no | The user's name, if they agreed. |
| email | string | no | The user's email, if they agreed and want a reply. |
| purpose | string | no | One sentence on what you are trying to find out. Logged to improve the dataset; never returned. |

### Output

| Field | Type | Description |
| --- | --- | --- |
| received | true | The submission was recorded. |
| message | string | Acknowledgement to pass on to the user. |

Example: https://ctinjurycases.com/v1/send_message?message=Would%20higher%20daily%20limits%20be%20possible%20for%20a%20research%20project%3F