---
title: "Get Bill Full"
method: GET
path: "/api/v1/bills/{bill_id}/full"
tags: ["bills"]
---

# Get Bill Full

`GET /api/v1/bills/{bill_id}/full`

## Request

- Base URL: `https://api.billcommons.org`
- URL: `https://api.billcommons.org/api/v1/bills/{bill_id}/full`
- Auth: none declared

Every sub-resource for one bill in a single round trip.

Composes the existing handlers rather than re-implementing their queries.
Duplicating them would mean this envelope and the individual endpoints
could drift into disagreeing about the same bill -- and the sub-resource
handlers carry real logic worth not forking (related-bill identifier
resolution, vote records grouped per event, the enrolled-outcome flag).

They each call _get_bill_or_404, which is `db.get` -- served from the
session identity map after the first, so the repeated existence check costs
nothing.

## Path parameters

- `bill_id` string, uuid, required

## Response `200`

Successful Response

- BillFullEnvelope: Everything one bill page needs, in a single response. The web bill page fanned out to NINE requests per render (detail, versions, actions, sponsors, votes, documents, related, subjects, jurisdiction). The sitemap exposed ~200,000 such pages, so one crawl was well over a million API requests -- and each one checked out its own pooled connection. That fan-out is the load half of the 2026-08-02 outage. One request, one connection, one transaction. Sub-resource endpoints stay exactly as they are: they are a reasonable API for a consumer who wants one slice, and this is for the consumer who wants all of it.
  - `bill` BillDetail, required
    - `id` string, uuid, required
    - `jurisdiction_id` string, uuid, required
    - `session_id` string, uuid, required
    - `jurisdiction_abbreviation` string, nullable
    - `session_identifier` string, nullable
    - `chamber` string, nullable
    - `identifier` string, required
    - `identifier_norm` string, required
    - `title` string, required
    - `short_title` string, nullable
    - `bill_type` string, nullable
    - `status` string, nullable
    - `status_date` string, date, nullable
    - `introduced_date` string, date, nullable
    - `latest_action_text` string, nullable
    - `latest_action_date` string, date, nullable
    - `source_url` string, nullable
    - `updated_at` string, date-time, nullable
    - `description` string, nullable
    - `source_name` string, nullable
    - `retrieved_at` string, date-time, nullable
    - `upstream_updated_at` string, date-time, nullable
    - `enrolled_outcome_uncaptured` boolean
    - `replaces` RelatedBillLink[]
      - `id` string, uuid, required
      - `identifier` string, required
      - `jurisdiction_abbreviation` string, nullable
      - `session_identifier` string, nullable
      - `status` string, nullable
    - `replaced_by` RelatedBillLink[]
      - `id` string, uuid, required
      - `identifier` string, required
      - `jurisdiction_abbreviation` string, nullable
      - `session_identifier` string, nullable
      - `status` string, nullable
  - `versions` BillVersionOut[], required
    - `id` string, uuid, required
    - `bill_id` string, uuid, required
    - `note` string, nullable
    - `date` string, date, nullable
  - `actions` BillActionOut[], required
    - `id` string, uuid, required
    - `bill_id` string, uuid, required
    - `description` string, required
    - `action_date` string, date, nullable
    - `classification` string, nullable
    - `order` integer, nullable
  - `sponsors` SponsorshipOut[], required
    - `id` string, uuid, required
    - `bill_id` string, uuid, required
    - `person_id` string, uuid, nullable
    - `name` string, nullable
    - `classification` string, nullable
    - `primary` boolean, required
  - `votes` VoteEventOut[], required
    - `id` string, uuid, required
    - `bill_id` string, uuid, nullable
    - `motion_text` string, nullable
    - `motion_classification` string, nullable
    - `start_date` string, date, nullable
    - `result` string, nullable
    - `yes_count` integer, nullable
    - `no_count` integer, nullable
    - `other_count` integer, nullable
    - `votes` VoteRecordOut[]
      - `id` string, uuid, required
      - `person_id` string, uuid, nullable
      - `voter_name` string, nullable
      - `option` string, required
  - `documents` BillDocumentOut[], required
    - `id` string, uuid, required
    - `bill_version_id` string, uuid, required
    - `media_type` string, nullable
    - `url` string, nullable
    - `has_extracted_text` boolean
    - `text_is_partial` boolean: True when text was extracted from a malformed PDF with one or more unreadable pages -- the text is real but incomplete, so diffs/quotes against it may be missing sections.
  - `related` RelatedBillOut[], required
    - `id` string, uuid, required
    - `relation_type` string, nullable
    - `related_identifier` string, nullable
    - `related_bill_id` string, uuid, nullable
  - `subjects` string[], required
  - `jurisdiction` Jurisdiction
    - `id` string, uuid, required
    - `name` string, required
    - `abbreviation` string, required
    - `classification` string, required
    - `openstates_id` string, nullable
  - `meta` object, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/billcommons/apis/bill-commons-api.md) · [All operations](https://skmtc.dev/billcommons/apis/bill-commons-api/llms.txt) · [OpenAPI document](https://skmtc.dev/billcommons/apis/bill-commons-api/revisions/bfb8cd50a317?raw)
