---
title: "Get Sections Batch"
method: POST
path: "/sections/batch"
tags: ["sections"]
---

# Get Sections Batch

`POST /sections/batch`

## Request

- Base URL: `https://api.3gppscout.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.3gppscout.com/sections/batch`
- Auth: none declared

Read up to 10 clauses in one call, from one or several documents.

Each clause comes back as `get_sections` returns it with `latest=true` (one version: the given
version, else the newest of the given release, else the newest indexed), plus its sub-clauses
as numbers and titles only (all of them up to 40, else the direct ones). Results are in
request order and each has a `status`:
a missing clause does not fail the call; it gets `nearest_sections`, the closest existing
clause numbers.

**Quota:** for REST and MCP this call counts as one request per clause (`requests_counted`),
the same as calling get_sections once per clause. If fewer requests remain than clauses asked
for, it fails with 402 before reading anything.

**Excerpt limit:** each clause carries at most 2,000 words of spec text, cut like get_sections
with `truncated=true` and `truncation_reason="word_limit"`; read the rest at `official_url`.

**Dates for prior art:** each clause has `provenance` (3GPP archive upload time and approving TSG
plenary of its version). `available_before` applies to every clause, like get_sections with
`latest=true`: a clause that only exists in later versions gets status `no_version_before_cutoff`.

## Request body

- SectionsBatchRequest: Request body for reading several clauses in one call.
  - `sections` SectionRef[], required: 1 to 10 clauses, from one or several documents.
    - `doc_number` string, required: Document number, e.g. '38.331'. Numeric format without the 'TS'/'TR' prefix.
    - `section_number` string, required: Clause number as the spec writes it, e.g. '5.3.5', '5.3.1a', 'A.1'.
    - `version` string, nullable: Exact version, e.g. '19.1.0'. Omit for the newest indexed version.
    - `release` string, nullable: Release, e.g. 'Rel-18': read that release's newest version. Ignored when version is set.
  - `available_before` string, date, nullable: Only versions uploaded to the 3GPP archive before this date (YYYY-MM-DD; before 00:00 UTC, so the day itself is excluded), e.g. a patent application's priority date. A version whose upload time is unknown is left out. Usually one version per release of each spec is indexed (the newest in that release, Rel-15 onward), so a release appears only if that version predates the cutoff; older versions are in the 3GPP archive but not searchable here. Applies to every clause: a clause without version reads the newest version uploaded before the date.

## Response `200`

Successful Response

- SectionsBatchResponse
  - `results` SectionBatchItem[], required
    - `doc_number` string, required
    - `doc_type` string, nullable: 'TS' (Technical Specification) or 'TR' (Technical Report), from the stored document type.
    - `section_number` string, required
    - `status` string, required: 'ok', 'section_not_found', 'document_not_found', 'no_version_before_cutoff' (with available_before: no indexed version of the document uploaded before the date has this clause), or 'error'.
    - `section` SectionResult: A single section from a document.
      - `doc_number` string, required
      - `doc_type` string, nullable: 'TS' (Technical Specification) or 'TR' (Technical Report), from the stored document type.
      - `version` string, required
      - `release` string, required
      - `section_number` string, required
      - `section_title` string, nullable
      - `heading_level` integer, nullable
      - `full_text` string
      - `token_count` integer, nullable
      - `fragment_count` integer, nullable
      - `parent_section_number` string, nullable
      - `latest_version` string, nullable
      - `latest_release` string, nullable
      - `same_text_as_latest` boolean, nullable
      - `other_version_titles` OtherVersionTitle[], nullable: With latest=true: this clause's title in other indexed versions, where it differs (the clause was rewritten or replaced). Each has the other version's full_text and citation when that text is short.
        - `version` string, required
        - `release` string
        - `section_title` string, required
        - `full_text` string, nullable: That version's text, when it is at most 400 tokens (and, for REST and MCP, fits the call's word limit).
        - `citation` string, nullable
      - `other_version_note` string, nullable: A one-sentence note when other_version_titles is present.
      - `citation` string, nullable
      - `official_url` string, nullable
      - `truncated` boolean
      - `truncation_reason` string, nullable: 'word_limit' (clause longer than limit_words) or 'one_clause_per_call' (a sub-clause from prefix=true, text withheld).
      - `returned_words` integer, nullable
      - `total_words` integer, nullable
      - `limit_words` integer, nullable
      - `next_step` string, nullable
      - `provenance` SpecProvenance: When this spec version reached the public 3GPP archive, and the TSG plenary it came from. Every value comes from the 3GPP FTP server: archive and dated plenary folder listings, 3GPP's lists of specifications arising from each TSG round, and the 3GPP change request database. Unknown values stay null.
        - `statement` string, nullable: The known facts as plain sentences, ready to quote, e.g. 'Uploaded to the 3GPP archive on 2026-09-24 at 16:47 UTC. Approved at TSG SA #113 (2026-09-15 to 2026-09-18).' It says 'uploaded to the 3GPP archive' and 'approved at', never 'published': no source states a publication date.
        - `archive_uploaded_at` string, nullable: When this version's zip was uploaded to the 3GPP archive (ISO 8601, UTC), as the 3GPP FTP folder listing at archive_url shows it. If 3GPP re-uploaded the file, the earliest time seen. Null when not found; see unknown_reasons.
        - `archive_url` string, nullable: The zip on the 3GPP FTP server whose folder listing gives archive_uploaded_at; open its folder to verify the time.
        - `archive_date_source` string, nullable: 'ftp_archive_listing' (the spec's folder under /ftp/Specs/archive/) or 'ftp_plenary_folder_listing' (a dated plenary folder that showed an earlier time).
        - `plenary_batch` string, nullable: YYYY-MM of the plenary round whose batch of specifications includes this version (3GPP's dated folders, /ftp/Specs/YYYY-MM/).
        - `plenary_batch_source` string, nullable: 'tsg_spec_list' (stated in 3GPP's list of specifications arising from that TSG round), 'tsg_meeting_start' (the month the plenary in tsg_meeting started) or 'ftp_plenary_folder' (the earliest dated folder holding the zip).
        - `tsg_meeting` string, nullable: Plenary meeting ID: 'SP-113' (TSG SA #113), 'RP-109' (TSG RAN), 'CP-110' (TSG CT); a trailing '-e' marks an electronic meeting.
        - `tsg_meeting_name` string, nullable: The meeting as 3GPP names it, e.g. 'TSG SA #113'.
        - `tsg_meeting_relation` string, nullable: 'approved': change requests approved at this meeting created this version (3GPP CR database). 'arising_from': 3GPP lists this version among the specifications arising from this meeting. 'presented': a draft (below version 3.0.0) presented to this meeting.
        - `tsg_meeting_start` string, date, nullable: First day of the plenary meeting.
        - `tsg_meeting_end` string, date, nullable: Last day of the plenary meeting.
        - `tsg_meeting_source` string, nullable: 'cr_database' (3GPP change request database export) or 'tsg_spec_list' (3GPP's list of specifications arising from that TSG round).
        - `tsg_meeting_source_url` string, nullable: The 3GPP file that names the meeting.
        - `unknown_reasons` object, nullable: Why a field is null, by field name. archive_uploaded_at: 'not_in_archive_listing'. tsg_meeting: 'before_tsg_lists_no_approved_cr' (uploaded before March 2023, when 3GPP's per-round spec lists start, and created by no approved change request, e.g. a release upgrade), 'draft_not_listed', or 'not_in_cr_database_or_tsg_lists'. Nothing is guessed.
        - `notes` string, nullable: Anything a reviewer should know, e.g. the file was re-uploaded or two sources name different meetings.
    - `children` SectionChild[]: Sub-clauses (number, title, token count) without text: all of them when there are at most 40, else the direct ones.
      - `section_number` string, required
      - `section_title` string, nullable
      - `token_count` integer, nullable
    - `descendant_count` integer: Sub-clauses at any depth.
    - `nearest_sections` string[], nullable: Existing clause numbers closest to a missing one.
    - `message` string, nullable
  - `requests_counted` integer, required: API requests this call counted toward the monthly quota: one per clause for REST and MCP.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/3gppscout/apis/3gpp-scout-api.md) · [All operations](https://skmtc.dev/3gppscout/apis/3gpp-scout-api/llms.txt) · [OpenAPI document](https://skmtc.dev/3gppscout/apis/3gpp-scout-api/revisions/60bd6896e5b9?raw)
