Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: 3gppscout Com Tdocs API
version: 0.2.0
description: 'Operations tagged tdocs across 2 of this provider''s published API definitions: 3gppscout-com-openapi.json, api.json. Each path carries the servers of the definition it was published in.'
tags:
- name: tdocs
paths:
/tdocs/search:
post:
tags:
- tdocs
summary: Search Tdocs
description: 'Search the text of 3GPP TDocs (meeting contributions, CRs, LSs, summaries, chair notes, reports) by meaning and by exact term.
Use for "are there any TDocs about X", "who is proposing Y", or finding where an IE, parameter, spec, or
TDoc ID is discussed. Merges semantic (vector) and keyword (lexical) matches, then reranks. Exact
identifiers in the query (TDoc IDs such as R2-2008188, IE names such as ta-CommonDrift, spec numbers such
as 38.213, quoted phrases) are matched literally, and passages that contain them come first.
`filters` takes the same fields as GET /tdocs (source company with alias matching, meeting, group,
agenda_item, doc_kind, status, work_item, spec, release, since, until). `unit_types` limits results to
passages holding numbered proposals or observations.
Each result is one passage with its TDoc''s ID, title, doc_kind, register status and status_label, meeting,
agenda item, source companies with roles, official_url, unit type and labels (for example "Proposal 3"),
page and paragraph anchor, and text. `anchor` is where the passage starts; `units` gives each numbered
proposal or observation in the passage with its own anchor, which is the one to cite for that unit. `coverage` lists the meetings whose TDoc text is indexed, so an empty
result is a real "nothing found in these meetings".
Evidence rules: a passage from a contribution is its source companies'' proposal, not an agreement. Use
list_meeting_decisions for what was agreed, and get_tdoc to read a whole TDoc.
Errors: 400 `invalid_parameter`, 409 `organization_ambiguous` (candidates returned), 502
`search_unavailable`.'
operationId: search_tdocs
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/TdocSearchRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/tdocs/{tdoc_id}:
get:
tags:
- tdocs
summary: Get Tdoc
description: 'Get one 3GPP TDoc (meeting contribution, CR, LS, summary, report) by ID, for example R1-2605951.
Returns register metadata: title, doc_kind, register status, meeting, agenda item, source companies
with roles (submitter, co_submitter, editor), revision links, and the official 3GPP download URL.
With `include=units`, returns the document''s units as verbatim quotes with a page or paragraph anchor.
`units_source` says which extraction was used: "t4" (proposals, observations, agreements, working
assumptions, conclusions, FFS items, CR changes, LS actions) or "t1" (numbered "Proposal N" and
"Observation N" only, before full structuring has run). Long unit lists are cut at a size budget
(`units_truncated`, `units_total`, `units_next_text_offset`). With `include=text`, returns document text
blocks with anchors.
Excerpt limit: API and MCP calls return one TDoc section and at most 2,000 words of units and text
together. `excerpt` reports `returned_words`, `limit_words`, `truncated` and the `official_url` of the
full document on the 3GPP server; `text.truncation_reason` is `one_section_per_call` or `word_limit`,
and `text.next_offset` starts the next section.
`content.status` is `complete`, `partial` (with `partial_reasons`), or `not_retrieved`. When it is
`not_retrieved`, call `POST /tdocs/{tdoc_id}/fetch` (MCP tool `fetch_tdoc`) to parse it on demand.
Errors: 404 `tdoc_not_indexed` (ID not in the catalog yet, call fetch), 404 `tdoc_not_found`,
410 `tdoc_withdrawn` (metadata in `detail.tdoc`).
Evidence rules: a company''s position comes only from a TDoc where it is submitter or co_submitter.
Register status is a decision source. Proposal text is not an agreement.'
operationId: get_tdoc
parameters:
- name: tdoc_id
in: path
required: true
schema:
type: string
title: Tdoc Id
- name: include
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: 'Comma-separated extras: ''units'' (labeled proposals, observations, agreements, and other units as quotes with anchors), ''text'' (document text blocks with anchors), ''revisions'' (revision chain). Example: include=units,revisions.'
title: Include
description: 'Comma-separated extras: ''units'' (labeled proposals, observations, agreements, and other units as quotes with anchors), ''text'' (document text blocks with anchors), ''revisions'' (revision chain). Example: include=units,revisions.'
- name: text_offset
in: query
required: false
schema:
type: integer
minimum: 0
description: First text block to return when include has 'text'. Use text.next_offset to page.
default: 0
title: Text Offset
description: First text block to return when include has 'text'. Use text.next_offset to page.
- name: max_text_chars
in: query
required: false
schema:
type: integer
maximum: 150000
minimum: 1000
description: Character budget for text blocks.
default: 30000
title: Max Text Chars
description: Character budget for text blocks.
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/tdocs/batch:
post:
tags:
- tdocs
summary: Get Tdocs Batch
description: 'Read up to 10 TDocs in one call, for example every TDoc a summary or search result names.
Each TDoc comes back as `GET /tdocs/{tdoc_id}` returns it (register metadata, sources with roles,
and with `include` its units, text and revision chain), in request order, each with a `status`:
`ok`, `not_indexed` (not in the catalog yet: call fetch_tdoc for it), `not_found`, `withdrawn`
(metadata in `tdoc`), `invalid_tdoc_id`, or `error`. One TDoc that cannot be read does not fail the
others. A TDoc in the catalog whose content was not parsed yet has `status` ok and
`content.status` `not_retrieved`: call fetch_tdoc for it.
Unit and text budgets are per TDoc. Without `max_unit_chars` and `max_text_chars`, 48,000 and
16,000 characters are shared across the TDocs; long unit lists are cut (`units_truncated`).
**Quota:** for REST and MCP this call counts as one request per TDoc (`requests_counted`), the same
as calling get_tdoc once per TDoc. If fewer requests remain than TDocs asked for, it fails with 402
before reading anything.
**Excerpt limit:** each TDoc carries at most 2,000 words of units and text, cut like get_tdoc;
`excerpt` and `official_url` say where to read the rest.'
operationId: get_tdocs_batch
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/TdocsBatchRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/tdocs/{tdoc_id}/fetch:
post:
tags:
- tdocs
summary: Fetch Tdoc Endpoint
description: 'Fetch and parse a TDoc on demand, for a TDoc that is not parsed yet or not in the catalog.
Downloads the TDoc ZIP from the 3GPP server and extracts its text with page or paragraph anchors and
numbered Proposal and Observation units, usually within 60 seconds. Returns the same shape as
`GET /tdocs/{tdoc_id}` plus a `fetch` block (status, timings, how the meeting was located).
Idempotent: when the TDoc is already parsed, returns it at once. When a fetch for the same TDoc is
already running and does not finish in time, returns 202 with `code = tdoc_fetch_in_progress` and
`retry_after` seconds.
If the file cannot be read on demand (for example a legacy .ppt), `content.status` is `unavailable`
with a `reason`; the TDoc is queued for the full pipeline. That outcome is remembered for a few hours
(30 minutes when no file was found) and returned without a new download unless `force=true`.
Errors: 404 `tdoc_not_found`, 410 `tdoc_withdrawn`.'
operationId: fetch_tdoc
parameters:
- name: tdoc_id
in: path
required: true
schema:
type: string
title: Tdoc Id
- name: include
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: 'Same as GET /tdocs/{tdoc_id}: units, text, revisions.'
default: units
title: Include
description: 'Same as GET /tdocs/{tdoc_id}: units, text, revisions.'
- name: text_offset
in: query
required: false
schema:
type: integer
minimum: 0
description: First text block to return when include has 'text'.
default: 0
title: Text Offset
description: First text block to return when include has 'text'.
- name: max_text_chars
in: query
required: false
schema:
type: integer
maximum: 150000
minimum: 1000
description: Character budget for text blocks.
default: 30000
title: Max Text Chars
description: Character budget for text blocks.
- name: force
in: query
required: false
schema:
type: boolean
description: Try again even if a recent on-demand attempt found no file or could not read it.
default: false
title: Force
description: Try again even if a recent on-demand attempt found no file or could not read it.
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/tdocs:
get:
tags:
- tdocs
summary: List Tdocs
description: 'List TDocs in the catalog by company, meeting, agenda item, kind, status, work item, spec, or title words.
Use this for "what did company X submit", "TDocs on agenda item 10.7 at RAN1#126", or "agreed CRs to
38.213". Company names resolve through aliases, so misspellings such as "Manevir" find Mavenir.
`source_resolution` shows how the name resolved. An ambiguous name returns 409
`organization_ambiguous` with candidates.
Each item has doc_kind, register status, meeting, agenda item, sources with roles, and official_url.
`coverage` names the meetings whose full registers were searched, so an empty result is a real
"nothing found in these meetings". This endpoint searches titles and metadata, not document text:
call get_tdoc with include=units for the content.'
operationId: list_tdocs
parameters:
- name: source
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Company name, alias, or org_id, e.g. 'Mavenir', 'Lekha Wireless', 'huawei'. Misspellings resolve through aliases.
title: Source
description: Company name, alias, or org_id, e.g. 'Mavenir', 'Lekha Wireless', 'huawei'. Misspellings resolve through aliases.
- name: role
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: 'Comma-separated source roles: submitter, co_submitter, editor. Default all roles; each item reports matched_role.'
title: Role
description: 'Comma-separated source roles: submitter, co_submitter, editor. Default all roles; each item reports matched_role.'
- name: meeting
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Comma-separated meeting IDs, e.g. 'R1-126' or 'RAN1#126'.
title: Meeting
description: Comma-separated meeting IDs, e.g. 'R1-126' or 'RAN1#126'.
- name: group
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Comma-separated groups, e.g. 'R1', 'RAN2', 'S2'.
title: Group
description: Comma-separated groups, e.g. 'R1', 'RAN2', 'S2'.
- name: agenda_item
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Agenda item; matches the item and its sub-items, e.g. '10.7' matches 10.7.1.
title: Agenda Item
description: Agenda item; matches the item and its sub-items, e.g. '10.7' matches 10.7.1.
- name: doc_kind
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: 'Comma-separated kinds: contribution, pcr, cr, draft_cr, summary, way_forward, ls_in, ls_out, report, chair_notes, agenda, wid, sid, status_report, work_plan, draft_spec.'
title: Doc Kind
description: 'Comma-separated kinds: contribution, pcr, cr, draft_cr, summary, way_forward, ls_in, ls_out, report, chair_notes, agenda, wid, sid, status_report, work_plan, draft_spec.'
- name: status
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Comma-separated register statuses, e.g. 'agreed,approved' or 'noted'.
title: Status
description: Comma-separated register statuses, e.g. 'agreed,approved' or 'noted'.
- name: work_item
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Work item code, e.g. 'NR_NTN_Ph3-Core'.
title: Work Item
description: Work item code, e.g. 'NR_NTN_Ph3-Core'.
- name: spec
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Target spec number, e.g. '38.213'.
title: Spec
description: Target spec number, e.g. '38.213'.
- name: since
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Meetings starting on or after this date (YYYY-MM-DD).
title: Since
description: Meetings starting on or after this date (YYYY-MM-DD).
- name: until
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Meetings starting on or before this date (YYYY-MM-DD).
title: Until
description: Meetings starting on or before this date (YYYY-MM-DD).
- name: q
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Words that must all appear in the title or abstract, e.g. 'NTN timing advance'.
title: Q
description: Words that must all appear in the title or abstract, e.g. 'NTN timing advance'.
- name: include_withdrawn
in: query
required: false
schema:
type: boolean
description: Include withdrawn TDocs.
default: false
title: Include Withdrawn
description: Include withdrawn TDocs.
- name: limit
in: query
required: false
schema:
type: integer
maximum: 200
minimum: 1
description: Page size.
default: 50
title: Limit
description: Page size.
- name: cursor
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: next_cursor from a previous response.
title: Cursor
description: next_cursor from a previous response.
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
components:
schemas:
TdocsBatchRequest:
properties:
tdoc_ids:
items:
type: string
type: array
maxItems: 10
minItems: 1
title: Tdoc Ids
description: 1 to 10 TDoc IDs, e.g. ['R1-2605951', 'R2-2604548'].
include:
anyOf:
- type: string
- type: 'null'
title: Include
description: 'Comma-separated extras for every TDoc, as for GET /tdocs/{tdoc_id}: units, text, revisions.'
default: units
max_unit_chars:
anyOf:
- type: integer
maximum: 40000.0
minimum: 1000.0
- type: 'null'
title: Max Unit Chars
description: Character budget for each TDoc's unit quotes. Default 48,000 divided by the number of TDocs.
max_text_chars:
anyOf:
- type: integer
maximum: 150000.0
minimum: 1000.0
- type: 'null'
title: Max Text Chars
description: Character budget for each TDoc's text blocks when include has 'text'. Default 16,000 divided by the number of TDocs.
type: object
required:
- tdoc_ids
title: TdocsBatchRequest
description: Request body for reading several TDocs in one call.
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
input:
title: Input
ctx:
type: object
title: Context
type: object
required:
- loc
- msg
- type
title: ValidationError
TdocSearchRequest:
properties:
query:
type: string
maxLength: 1000
minLength: 2
title: Query
description: What the TDocs should discuss, in plain words or exact terms, e.g. 'timing advance pre-compensation for NTN', 'ta-CommonDrift', 'R2-2008188'.
filters:
$ref: '#/components/schemas/TdocSearchFilters'
description: Catalog filters, the same fields as GET /tdocs.
unit_types:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Unit Types
description: 'Only chunks holding these units: ''proposal'', ''observation'', or ''body'' (text outside numbered proposals and observations).'
rerank_top_k:
type: integer
maximum: 50.0
minimum: 1.0
title: Rerank Top K
description: Results to return after reranking.
default: 10
max_per_tdoc:
type: integer
maximum: 10.0
minimum: 1.0
title: Max Per Tdoc
description: At most this many passages from one TDoc. Use 1 for a list of distinct TDocs.
default: 2
include_text:
type: boolean
title: Include Text
description: Include each passage's text.
default: true
rerank:
type: boolean
title: Rerank
description: Rerank candidates for precision. Leave true.
default: true
type: object
required:
- query
title: TdocSearchRequest
TdocSearchFilters:
properties:
source:
anyOf:
- type: string
- type: 'null'
title: Source
description: Company name, alias, or org_id, e.g. 'Mavenir' or 'huawei'. Matches TDocs where it is a submitter or co-submitter.
meeting:
anyOf:
- type: string
- type: 'null'
title: Meeting
description: Meeting IDs, e.g. 'R1-126' or 'RAN1#126'.
group:
anyOf:
- type: string
- type: 'null'
title: Group
description: Groups, e.g. 'R1', 'RAN2', 'S2'.
agenda_item:
anyOf:
- type: string
- type: 'null'
title: Agenda Item
description: Agenda items; '10.7' also matches 10.7.1.
doc_kind:
anyOf:
- type: string
- type: 'null'
title: Doc Kind
description: 'Kinds: contribution, pcr, cr, draft_cr, cr_pack, summary, way_forward, ls_in, ls_out, report, chair_notes, agenda, wid, sid, status_report, work_plan, draft_spec.'
status:
anyOf:
- type: string
- type: 'null'
title: Status
description: Register statuses, e.g. 'agreed,approved' or 'noted'. Joined from the register at query time.
work_item:
anyOf:
- type: string
- type: 'null'
title: Work Item
description: Work item code, e.g. 'NR_NTN_Ph3-Core'.
spec:
anyOf:
- type: string
- type: 'null'
title: Spec
description: Target spec number, e.g. '38.213'.
release:
anyOf:
- type: string
- type: 'null'
title: Release
description: Release, e.g. 'Rel-20'.
since:
anyOf:
- type: string
- type: 'null'
title: Since
description: Meetings starting on or after this date (YYYY-MM-DD).
until:
anyOf:
- type: string
- type: 'null'
title: Until
description: Meetings starting on or before this date (YYYY-MM-DD).
type: object
title: TdocSearchFilters
description: Catalog filters, the same fields as GET /tdocs. Comma-separated values match any of them.
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
x-refined-from:
- 3gppscout-com-openapi.json
- api.json