3GPP Scout API & MCP Server

Hosted semantic search over 3GPP technical specifications (8,700+ document versions, Rel-15 through Rel-20) and a TDoc catalog for recent working-group meetings, via REST and a remote MCP server at https://api.3gppscout.com/mcp/.

8,700+
Document versions
1.3M+
Sections indexed
19k+
TDocs registered
6
Releases (Rel-15 through Rel-20)

The 3GPP Scout API lets you search across the full text of 3GPP specifications using natural language. Your query is semantically matched against indexed content, reranked for precision, and returned with the matching text along with full section context. The same API also looks up meeting TDocs (contributions, CRs, liaison statements, summaries), searches their text, and returns meeting decisions where extracted. Agents can use the same corpus through the hosted MCP server without running a local index.

All endpoints are read-only and require an API key for access (MCP uses OAuth instead).

FAQ

Is 3GPP Scout a hosted 3GPP MCP server? Yes. The remote MCP endpoint is https://api.3gppscout.com/mcp/ (Streamable HTTP, OAuth 2.1). Product page: https://3gppscout.com/mcp. You do not need to run a local index or clone a self-hosted GitHub MCP project.

Which 3GPP documents are indexed? The full published TS/TR corpus for Rel-15 through Rel-20 (8,700+ document versions), kept current as 3GPP publishes new and revised specifications.

Do you cover TDocs? Yes. See TDoc Catalog: latest two meeting rounds of RAN1, RAN2, RAN3, RAN4, and SA2, plus on-demand fetch of any named TDoc. Meeting decisions are a pilot subset. Company position comparison and cross-meeting stories are not built yet.

REST or MCP? Same corpus either way. REST at https://api.3gppscout.com with an API key; MCP at https://api.3gppscout.com/mcp/ with OAuth. TDoc calls are ordinary metered requests, same as search.

Base URL

https://api.3gppscout.com

All endpoints are relative to this base URL. The API is served over HTTPS only.

Quick Start

Search for anything in the 3GPP spec corpus with a single request:

Request
curl -X POST https://api.3gppscout.com/search/text \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "How does RRC connection setup work in NR?",
    "rerank_top_k": 5
  }'
Response (abbreviated)
{
  "query": "How does RRC connection setup work in NR?",
  "results": [
    {
      "id": 42,
      "doc_number": "38.331",
      "doc_type": "TS",
      "version": "19.1.0",
      "release": "Rel-19",
      "section_number": "5.3.3",
      "section_title": "RRC connection establishment",
      "content": "The purpose of this procedure is to establish an RRC connection...",
      "similarity": 0.8234,
      "relevance_score": 0.9512,
      "section_text": "...full section text..."
    }
  ],
  "total": 5,
  "reranked": true,
  "elapsed_ms": 420.3
}

That's it. The API handles search, content retrieval, and reranking in a single call.

Authentication

All API requests require a valid API key passed as a Bearer token in the Authorization header.

Authorization Header
Authorization: Bearer YOUR_API_KEY

Getting an API Key

Sign in to the 3GPP Scout Dashboard and navigate to API Keys to create and manage your keys.

Error Responses

StatusMeaning
401Missing, malformed, or invalid API key
401API key has been deactivated
402Monthly API/MCP/BYOK retrieval allowance exhausted

The /health, /docs, /skill.md, and /agent-setup/prompt.md endpoints do not require authentication.

API, MCP, and BYOK Retrieval Quotas

REST API keys, OAuth-authenticated MCP tools, and BYOK hosted-chat retrieval share one monthly allowance. Regular Scout-funded hosted chat uses prepaid credits instead. Explorer includes 150 requests per calendar month. Founding Engineer includes 1,000 requests per calendar month for $8/month.

An exhausted allowance returns HTTP 402. FastAPI places the contract in detail, and FastMCP-generated tools preserve the same actionable payload.

HTTP 402 response
{
  "detail": {
    "code": "api_quota_exhausted",
    "message": "Monthly API request quota exhausted. Upgrade to Founding Engineer for $8/month and 1,000 requests per month.",
    "current_plan": "explorer",
    "used": 150,
    "limit": 150,
    "remaining": 0,
    "reset_at": "2026-09-01T00:00:00Z",
    "upgrade": {
      "plan": "Founding Engineer",
      "price": {"amount": 8, "currency": "USD", "interval": "month"},
      "monthly_price_cents": 800,
      "requests_per_month": 1000,
      "url": "https://dashboard.3gppscout.com/dashboard/billing"
    }
  }
}
Client behavior: do not retry while remaining is zero. Wait until the UTC reset_at timestamp or direct the user to the absolute upgrade.url. Error responses and enforcement logs do not contain API keys, request bodies, or query text.

Filtering

All search endpoints support metadata filters that narrow results before similarity matching. Filters are applied server-side for efficient pre-filtering.

FilterExample ValueDescription
filter_release"Rel-19"3GPP release (Rel-15 through Rel-20 indexed)
filter_doc_type"TS"Document type: TS (technical specification) or TR (technical report)
filter_doc_number"38.331"Specific document number
filter_series"38"3GPP series (e.g. 38 = NR/5G, 23 = system architecture)
filter_section_number"5.4"Exact section number (text search only)

Filters can be combined. For example, filter_series: "38" + filter_release: "Rel-19" searches only the latest 5G NR specs.

Reranking

Text search results are reranked by default using a cross-encoder reranking model. The flow is:

  1. Embed query → retrieve match_count nearest matches (default 50)
  2. Fetch the text content for each match
  3. Pass query + all candidate texts to the reranker
  4. Return the top rerank_top_k results sorted by relevance score

Reranked results include both similarity (semantic similarity, 0–1) and relevance_score (reranker output, 0–1). The relevance score is generally a better signal for result quality.

Set "rerank": false to skip reranking and return results sorted by similarity only.

List Documents

GET /documents

Returns metadata for available documents. Use filters to check if a specific document is indexed (fast): without filters returns all ~3,200 documents (slower, cached for 60 minutes).

Query Parameters

ParameterTypeDescription
doc_numberstringFilter by document number, e.g. "38.811". Recommended: avoids scanning all documents.
releasestringFilter by release, e.g. "Rel-19"
seriesstringFilter by series, e.g. "38"
doc_typestringFilter by type: "TS" or "TR"

Examples

Check if a specific document is indexed
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.3gppscout.com/documents?doc_number=38.811"
List all TR documents in Rel-19
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.3gppscout.com/documents?doc_type=TR&release=Rel-19"
▶ Show example response
[
  {
    "id": 1,
    "doc_number": "38.811",
    "doc_type": "TR",
    "version": "15.4.0",
    "release": "Rel-15",
    "series": "38",
    "title": null,
    "filename": "38811-f40.zip",
    "total_text_chunks": 812,
    "total_image_chunks": 45,
    "status": "complete"
  }
]

Get Document

GET /documents/{document_id}

Fetch a single document by its numeric ID (as returned by /documents).

Path Parameters

ParameterTypeDescription
document_id requiredintNumeric document ID

Example

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://api.3gppscout.com/documents/42

Get Sections

GET /sections

Fetch full section text by section number. Section numbers are not unique across documents, so doc_number is required.

Query Parameters

ParameterTypeDescription
section_number requiredstringSection to look up. Numeric ("5.3.3"), trailing-letter ("5.3.1a"), or annex ("A.1", "B.2.3").
doc_number requiredstringDocument number, e.g. "38.331", "38.874".
versionstringVersion, e.g. "19.1.0"
releasestringRelease, e.g. "Rel-19"
prefixboolMatch sub-sections too ("5.4""5.4.1", "5.4.6"; "A""A.1", "A.2.3"). Default false
If no section matches, the API returns HTTP 200 with an empty list []. Use /sections/toc to see the actual section IDs available for a document.

Example

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.3gppscout.com/sections?section_number=5.3.3&doc_number=38.331&release=Rel-19"

Annex example

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.3gppscout.com/sections?section_number=A.1&doc_number=38.874"

Table of Contents

GET /sections/toc

Lists all section numbers and titles for a document without full text: useful for browsing a spec's structure.

Query Parameters

ParameterTypeDescription
doc_number requiredstringDocument number, e.g. "38.321"
versionstringVersion, e.g. "19.1.0"

Example

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.3gppscout.com/sections/toc?doc_number=38.321"

Get Image

GET /images/{doc_number}/{version}/{image_index}

Serve an extracted figure or diagram as a PNG image. The image_path field from image search results maps directly to this endpoint.

Path Parameters

ParameterTypeDescription
doc_number requiredstringDocument number, e.g. "38.300"
version requiredstringDocument version, e.g. "19.1.0"
image_index requiredintImage index within the document (from search results)

Response

Returns the raw PNG bytes with Content-Type: image/png. No JSON wrapper.

StatusMeaning
200PNG image bytes
400Invalid document number, version, or index
404Image not found for this document/version/index
429Per-IP rate or concurrency limit exceeded
No authentication required. Image URLs are designed to be embeddable directly in <img> tags, chat messages, or markdown without needing an API key. This endpoint does not consume Explorer request quota. Responses are cacheable for 24 hours.

Usage with Image Search

The typical flow is: search for images, then use the image_path from results to fetch the actual PNG.

# 1. Search for images
curl -X POST https://api.3gppscout.com/search/images \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "user plane protocol stack", "filter_doc_number": "38.300"}'

# Response includes: "image_path": "/images/38.300/19.1.0/8"

# 2. Fetch the image (no auth needed)
curl https://api.3gppscout.com/images/38.300/19.1.0/8 --output figure.png

Embedding in HTML

<img src="https://api.3gppscout.com/images/38.300/19.1.0/8"
     alt="User Plane Protocol Stack (TS 38.300)" />

TDoc Catalog

TDocs are the documents companies and groups submit to 3GPP working group meetings: contributions, CRs and pCRs, liaison statements, feature-lead summaries, chair notes, and meeting reports. Scout keeps them in a TDoc catalog, separate from the TS/TR corpus. The catalog holds the full registers of the latest two meeting rounds of RAN1, RAN2, RAN3, RAN4, and SA2 (currently 30 meetings, 19,137 registered TDocs, 17,748 parsed and searchable), plus TDocs linked by revision, plus any TDoc you fetch on demand (usually within seconds). Meeting decisions from chair notes and reports are extracted for a pilot subset so far. Company position comparison and cross-meeting stories are not built yet.

Each TDoc endpoint is one metered request, like the search endpoints.

Evidence rules. Every item carries doc_kind, the register status, and the official_url on the 3GPP server. Source companies carry a role: submitter, co_submitter, or editor. A company's position comes only from a TDoc where it is a submitter or co-submitter. Proposal text is not an agreement; the register status is the decision source. List responses include coverage, the meetings searched, so an empty list is a real "nothing found".

Errors

CodeHTTPMeaning
tdoc_not_indexed404The ID is not in the catalog yet. Call POST /tdocs/{tdoc_id}/fetch.
tdoc_not_found404No register entry and no file on the 3GPP server.
tdoc_withdrawn410Registered but withdrawn. Metadata is in detail.tdoc.
tdoc_fetch_in_progress202An on-demand fetch is still running. Retry after retry_after seconds.
organization_ambiguous409A company name matches several organizations. Candidates are returned.
invalid_parameter400A filter value is not recognized, for example an unknown group or meeting ID.
search_unavailable502POST /tdocs/search could not reach either search path. Retry shortly.

Get TDoc

GET /tdocs/{tdoc_id}

One TDoc by ID: title, kind, register status, meeting, agenda item, source companies with roles, revision links, and the official download URL. With include=units, each numbered "Proposal N" and "Observation N" comes back as a verbatim quote with an anchor.

Parameters

ParameterTypeDescription
tdoc_id requiredstringTDoc ID, e.g. R1-2605951
includestringComma-separated: units, text (text blocks with anchors), revisions
text_offsetintFirst text block to return. Use text.next_offset to page.
max_text_charsintCharacter budget for text blocks (default 30,000, max 150,000)

content.status is complete, partial (see partial_reasons), or not_retrieved. Anchors name the file and location: #p23 is paragraph 23, #page4-p2 is page 4 paragraph 2, #slide3-p1 is a slide, #Sheet1!r7 is a sheet row.

Example

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.3gppscout.com/tdocs/R1-2605951?include=units"

Response (abridged)

{
  "tdoc_id": "R1-2605951",
  "title": "Discussion on NTN specific requirements and design",
  "doc_kind": "contribution",
  "status": "not treated",
  "status_label": "Contribution. Register status: not treated at R1-126. No decision recorded in the register.",
  "meeting": {"meeting_id": "R1-126", "start_date": "2026-08-24", "end_date": "2026-08-28"},
  "agenda_item": "10.7.1",
  "sources": [{"org_id": "lekha-wireless", "display_name": "Lekha Wireless Solutions", "role": "submitter"}],
  "official_url": "https://www.3gpp.org/ftp/tsg_ran/WG1_RL1/TSGR1_126/Docs/R1-2605951.zip",
  "content": {"status": "complete", "extractor": "pipeline", "unit_count": 9},
  "units": [
    {"unit_id": "R1-2605951:proposal-1", "unit_type": "proposal", "label": "Proposal 1",
     "quote": "Proposal 1: For satellite assistance information ...", "page": null,
     "anchor": "R1-2605951.docx#p21"}
  ]
}

Fetch TDoc on Demand

POST /tdocs/{tdoc_id}/fetch

Downloads a TDoc from the 3GPP server and parses it, usually within 60 seconds. Works for catalog TDocs that are not parsed yet and for TDoc IDs the catalog does not know (the meeting is found from the TDoc number ranges). Returns the same shape as GET /tdocs/{tdoc_id} plus a fetch block with timings. Idempotent: an already parsed TDoc returns at once.

Takes the same include, text_offset, and max_text_chars parameters (default include=units).

On-demand results from legacy Word .doc files are marked partial, because Word auto-numbered labels are not visible to the lightweight reader. Legacy PowerPoint (.ppt) files return content.status = "unavailable" with a reason. Both are queued for the full pipeline.

Example

curl -X POST -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.3gppscout.com/tdocs/R2-2604548/fetch?include=units,text"

List TDocs

GET /tdocs

Catalog listing by company, meeting, agenda item, kind, status, work item, target spec, or title words. Company names resolve through aliases and common misspellings; source_resolution shows how. This matches titles and metadata, not document text.

Query Parameters

ParameterTypeDescription
sourcestringCompany name, alias, or org_id, e.g. Mavenir
rolestringComma-separated: submitter, co_submitter, editor
meetingstringComma-separated meeting IDs, e.g. R1-126 or RAN1#126
groupstringComma-separated groups, e.g. R1, RAN2, S2
agenda_itemstringAgenda item and its sub-items, e.g. 10.7
doc_kindstringComma-separated, e.g. contribution,cr,summary
statusstringComma-separated register statuses, e.g. agreed,approved
work_itemstringWork item code, e.g. NR_NTN_Ph3-Core
specstringTarget spec, e.g. 38.213
since / untildateMeeting start date bounds, YYYY-MM-DD
qstringWords that must all appear in the title or abstract
limit / cursorint / stringPage size (max 200) and next_cursor

Example

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.3gppscout.com/tdocs?source=Manevir"

Search TDocs

POST /tdocs/search

Searches the text of indexed TDocs by meaning and by exact term. Semantic (vector) matches and keyword matches are merged and reranked. Exact identifiers in the query are matched literally and passages that contain them come first: TDoc IDs such as R2-2008188, IE names such as ta-CommonDrift, spec numbers such as 38.213, and quoted phrases. Use it for "are there any TDocs about X" and "who is proposing Y". Use GET /tdocs to list a register by metadata, and GET /tdocs/{tdoc_id} to read a whole TDoc.

Body

FieldTypeDescription
query requiredstringTopic in plain words or exact terms, e.g. timing advance pre-compensation for NTN
filtersobjectSame fields as GET /tdocs: source (company, matches submitters and co-submitters), meeting, group, agenda_item, doc_kind, status, work_item, spec, release, since, until
unit_typesstring[]proposal, observation, or body
rerank_top_kintPassages to return (default 10, max 50)
max_per_tdocintPassages per TDoc (default 2). Use 1 for a list of distinct TDocs.
include_textboolInclude passage text (default true)

Each result carries the same TDoc fields as GET /tdocs (kind, register status and status_label, meeting, agenda item, sources with roles, official_url) plus the passage: unit_type, unit_labels (for example Proposal 3), page, anchor, text, relevance_score, and matched_by (vector, lexical, tdoc_id). Register status is joined at query time. The same passage in several versions of one summary is returned once, with the others in also_in. coverage lists the meetings whose TDoc text is indexed and how many of their TDocs are, so an empty result is a real "nothing found in these meetings".

Example

curl -X POST -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"query": "ta-CommonDrift", "filters": {"group": "R1"}, "max_per_tdoc": 1}' \
  "https://api.3gppscout.com/tdocs/search"

Response (abridged)

{
  "results": [
    {"tdoc_id": "R1-2606369", "title": "NR-NTN GNSS resilience", "doc_kind": "contribution",
     "status_label": "Contribution. Register status: not treated at R1-126. No decision recorded in the register.",
     "meeting": {"meeting_id": "R1-126"}, "agenda_item": "9.4.1",
     "sources": [{"org_id": "qualcomm", "display_name": "Qualcomm", "role": "submitter"}],
     "unit_type": "observation", "unit_labels": ["Observation 5", "Observation 6"],
     "anchor": "R1-2606369.docx#p112", "text": "...", "relevance_score": 0.70,
     "matched_by": ["lexical", "vector"], "identifier_hits": ["ta-CommonDrift"]}
  ],
  "coverage": {"groups": ["R1"], "meetings": ["R1-125", "R1-126"], "indexed_tdocs": 131, "registered_tdocs": 3460}
}

Meetings

GET /meetings

Meetings in the catalog with dates, TDoc number range, TDoc counts, and coverage (full_register or partial). Filters: group, since, until, state.

GET /meetings/{meeting_id}

One meeting (R1-126 or RAN1#126): agenda items with TDoc counts and key documents (chair notes, meeting reports, summaries, way forwards). decision_sources lists the chair notes and reports, and decisions.counts counts the extracted decisions by type.

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.3gppscout.com/meetings/R1-126"
GET /meetings/{meeting_id}/decisions

What the meeting decided: agreements, working assumptions, conclusions, FFS items, and CR, LS, and way-forward outcomes. Each decision has a verbatim quote, its source (chair notes, meeting or session report, feature-lead summary, or register status) with anchor, the TDoc it was recorded under, the TDocs it references, and the proposals it adopts. Decisions never come from proposal text. Filters: agenda_item, decision_type (default: every type except noted), q (topic words), source_kind. coverage lists the meeting's decision sources and how many have been processed.

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.3gppscout.com/meetings/R1-126/decisions?q=NTN%20timing"

Organizations

GET /organizations?q=

Resolves a company name. status is exact, fuzzy, ambiguous, or not_found; candidates carry match scores and TDoc counts.

GET /organizations/{org_id}

One organization with aliases and activity: TDoc counts by role, meeting, and kind, plus recent TDocs. Accepts an alias such as manevir.

MCP Server

The 3GPP Scout API includes an MCP (Model Context Protocol) server for Cursor, Claude, Codex, OpenCode, and other compatible agents.

Explorer accounts include 150 Scout requests per UTC month for free. Your external agent or model provider may charge separately.

Add to Cursor (one click)

Add to Cursor

Clicking the button opens Cursor and installs the 3GPP Scout MCP server automatically.

Agent-guided setup

Ask any supported agent to fetch and execute the appropriate instructions from https://api.3gppscout.com/agent-setup/prompt.md. The public Markdown prompt covers Cursor, Claude, Codex, OpenCode, and generic MCP clients, including OAuth and a small verification request.

Manual Configuration

For Cursor, add to .cursor/mcp.json in your workspace or user settings:

{
  "mcpServers": {
    "3gpp-scout": {
      "url": "https://api.3gppscout.com/mcp/"
    }
  }
}

For current Claude, Codex, and OpenCode commands and configuration, use the agent-guided setup prompt above.

Authentication

The MCP server uses OAuth 2.1: no API key is needed in the config. On first use, your browser will open for you to sign in with your 3GPP Scout account. After approving access, the MCP client handles tokens automatically.

Available Tools

Once connected, your agent has access to all API endpoints as MCP tools:

  • search_text: semantic search over specification text
  • search_images: search diagrams, figures, and tables
  • search_combined: text + image search in one call
  • list_documents / get_document: browse available documents
  • get_sections / list_sections: fetch section text and table of contents
  • get_image: fetch extracted figures as PNG images
  • get_tdoc / fetch_tdoc: one TDoc with quoted proposals, parsed on demand when needed
  • list_tdocs: TDocs by company, meeting, agenda item, kind, or status, with coverage
  • search_tdocs: TDoc text by meaning and exact term (IE names, TDoc IDs, spec numbers), with coverage
  • list_meetings / get_meeting: meetings, agenda items, and key documents
  • list_meeting_decisions: what a meeting agreed, with quotes from chair notes, reports, and summaries
  • resolve_organization / get_organization: company names, aliases, and activity

MCP Resource

The MCP server also provides a scout://skill-guide resource: a comprehensive guide your agent can read to understand the API, recommended workflows, and best practices.

Skill File

For agents that don't support MCP, we provide a Skill File: a standalone markdown document containing everything an LLM agent needs to use the API effectively: endpoints, parameters, workflows, and tips.

Download

https://api.3gppscout.com/skill.md

How to Use

  1. Download or copy the file from the link above
  2. Save it as SKILL.md in your project (e.g. .cursor/skills/3gpp-scout/SKILL.md)
  3. Your agent will read it automatically and know how to call the API

The skill file covers the same information as the MCP resource (scout://skill-guide) but works with any agent framework: just include it in the agent's context.

OpenClaw

The 3GPP Scout skill is published on ClawHub, the skill registry for OpenClaw. If you use an OpenClaw-compatible agent, you can install the skill directly from the registry.

Install

https://clawhub.ai/chriscarrotlabs/3gpp-scout

Configure your API key

Once installed, set your API key as the SCOUT_API_KEY environment variable:

export SCOUT_API_KEY="sk-your-key-here"

Or add it to ~/.openclaw/openclaw.json under skills."3gpp-scout".env.SCOUT_API_KEY.

The ClawHub listing has passed OpenClaw's security scan (benign, high confidence) and is updated whenever the skill file here changes.

Models & Embeddings

The API uses three Voyage AI models:

ModelPurposeDimensions
voyage-context-3Text query & chunk embedding1024
voyage-multimodal-3Image query & chunk embedding1024
rerank-2Cross-encoder reranking for text results-

Text chunks are contextualized embeddings: each chunk is embedded along with metadata about the document and section it belongs to, improving retrieval quality for domain-specific queries.

Architecture

The API is a stateless server backed by cloud infrastructure:

  Client Request
       │
       ▼
  ┌──────────────────────┐
  │  3GPP Scout API      │  api.3gppscout.com
  └──────────┬───────────┘
             │
   ┌─────────┼──────────┬──────────┐
   ▼         ▼          ▼          ▼
Embedding   Vector     Content    Image
 Model      Search     Store      Store
                     (text/JSON)  (PNGs)

Request flow for text search:

  1. Embed the query string using the text embedding model
  2. Run vector similarity search with optional metadata filters
  3. Resolve matches to their source document and chunk
  4. Fetch chunk text and section context
  5. Optionally rerank candidates for higher precision
  6. Return the final results

Request flow for image serving:

  1. Image search returns results with image_path (e.g. /images/38.300/19.1.0/8)
  2. Client fetches the image URL directly
  3. API proxies the PNG from Google Cloud Storage

Corpus Coverage

The index covers all six 3GPP releases from Rel-15 through Rel-20: 8,700+ document versions and 1.3M+ sections across 2.6M+ text vectors and 225K+ image vectors.

ReleaseDocument versionsSections
Rel-151,504199K+
Rel-161,607221K+
Rel-171,714260K+
Rel-181,788285K+
Rel-192,028378K+
Rel-2010029K+
Total8,7411.37M+

Processing Pipeline

Each document goes through a multi-stage pipeline: parsing, semantic chunking, embedding, section extraction, and image extraction. The chunking stage produces optimized chunks of 400–800 tokens for high-quality retrieval. Images are extracted as individual PNGs and served via the /images endpoint.

Health Check

GET /health

Returns API status and model info. Use this to verify the server is running.

Example

curl https://api.3gppscout.com/health
▶ Show example response
{
  "status": "ok",
  "version": "0.2.0",
  "models": {
    "text_embedding": "voyage-context-3",
    "image_embedding": "voyage-multimodal-3",
    "reranker": "rerank-2"
  }
}

OpenAPI / Swagger

The auto-generated interactive API docs are available at /swagger (Swagger UI) and /redoc (ReDoc). The raw OpenAPI schema is at /openapi.json.