---
title: "Search Combined"
method: POST
path: "/search/combined"
tags: ["search"]
---

# Search Combined

`POST /search/combined`

## 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/search/combined`
- Auth: none declared

Search both text and images/diagrams in 3GPP specifications simultaneously.

Combines text search and image search in a single request. Returns text_results (matched passages) and image_results (figures/diagrams) for the same query.

**When to use:** For broad topic research where both text explanations and diagrams are relevant — e.g. "5G NR random access procedure" would return the procedural text AND the flow chart.

**Trade-off:** Slower than text-only search because it queries both indexes. Prefer `search_text` when you only need text, and `search_images` when you only need figures.

**Filters:** All filters (release, series, doc_number, available_before, etc.) apply to both the text and image searches. Every result carries `provenance` (3GPP archive upload time and approving TSG plenary).

**Exact values:** numbers, constants and symbol names in the query (e.g. "32400", "44.1 dB") are also matched literally against clause text, as in `search_text`; text results that contain them carry `matched_terms`.

## Request body

- CombinedSearchRequest: Request body for combined text + image search.
  - `query` string, required: Natural language search query. Searches both text and images simultaneously.
  - `text_match_count` integer: Text candidates before reranking. Default 30 balances speed and quality.
  - `text_match_threshold` number: Text similarity threshold. Leave at 0 (default) and rely on reranking.
  - `rerank` boolean: Rerank text results for better precision. Always leave true.
  - `rerank_top_k` integer: Number of text results after reranking. Use 3–5 for focused lookups, 10–20 for research.
  - `include_section_text` boolean: Include full parent section text for each text chunk.
  - `image_match_count` integer: Number of image/diagram results to return alongside text results.
  - `image_match_threshold` number: Image similarity threshold. Default 0 returns best matches.
  - `deduplicate` boolean: Collapse near-duplicate text and image results from different releases/versions; collapsed matches appear in each winner's 'also_in' with release, version, and scores. Ignored when filter_release is set.
  - `filter_release` string, nullable: Restrict to a specific 3GPP release. Examples: 'Rel-15', 'Rel-17', 'Rel-20'. Omit for all indexed releases (Rel-15 through Rel-20).
  - `filter_doc_type` string, nullable: Restrict by document type: 'TS' (Technical Specification) or 'TR' (Technical Report).
  - `filter_doc_number` string, nullable: Restrict to a specific document, e.g. '38.331', '23.501'. Numeric format only.
  - `filter_series` string, nullable: Restrict by series: '38' = NR/5G, '23' = system architecture, '36' = LTE, '33' = security.
  - `filter_section_number` string, nullable: Restrict to a section, e.g. '5.3.5'. Only useful with filter_doc_number.
  - `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.

## Response `200`

Successful Response

- CombinedSearchResponse: Response from combined search.
  - `query` string, required
  - `text_results` TextResult[], required
    - `id` integer, required
    - `doc_number` string, required
    - `doc_type` string, required
    - `version` string, required
    - `release` string, required
    - `section_number` string, nullable
    - `section_title` string, nullable
    - `content` string, required
    - `content_type` string, nullable
    - `similarity` number, nullable: Vector similarity; null for a chunk found only by exact identifier or exact term match.
    - `definition` MatchedDefinition: The exact identifier from the query that this chunk defines.
      - `name` string, required: The identifier as the spec writes it, e.g. 'Ellipsoid-PointWithUncertaintyCircle'.
      - `kind` string, required: 'asn1' (Name ::= ...), 'avp', 'command' (Diameter), 'ie' (IE heading), 'heading', or 'avp_table'.
      - `code` integer, nullable: AVP or Diameter command code, when known.
      - `match` string, required: 'exact' (ignoring case), 'loose' (ignoring case, hyphens and underscores), or 'code'.
    - `matched_terms` string[], nullable: Exact numbers, constants or identifiers from the query that this chunk contains, lowercase (e.g. ['32400'], ['44.1'], ['d_rx_ota_margin']). Numbers inside formulas count.
    - `relevance_score` number, nullable
    - `section_text` string, nullable
    - `section_token_count` integer, nullable
    - `also_in` AlsoIn[], nullable
      - `release` string, required
      - `version` string, required
      - `relevance_score` number, nullable
      - `similarity` number, nullable
      - `archive_uploaded_at` string, nullable: When this version was uploaded to the 3GPP archive (ISO 8601, UTC); null when unknown.
    - `latest_version` string, nullable
    - `latest_release` 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[], nullable: With include_children: the section's sub-clauses, without text.
      - `section_number` string, required
      - `section_title` string, nullable
      - `token_count` integer, nullable
    - `descendant_count` integer, nullable: With include_children: sub-clauses at any depth.
  - `image_results` ImageResult[], required
    - `id` integer, required
    - `doc_number` string, required
    - `doc_type` string, required
    - `version` string, required
    - `release` string, required
    - `section_number` string, nullable
    - `caption` string, nullable
    - `context_before` string, nullable
    - `context_after` string, nullable
    - `image_path` string, nullable
    - `similarity` number, required
    - `also_in` AlsoIn[], nullable
      - `release` string, required
      - `version` string, required
      - `relevance_score` number, nullable
      - `similarity` number, nullable
      - `archive_uploaded_at` string, nullable: When this version was uploaded to the 3GPP archive (ISO 8601, UTC); null when unknown.
    - `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.
  - `text_total` integer, required
  - `image_total` integer, required
  - `reranked` boolean, required
  - `elapsed_ms` number, required

## 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)
