feat: convert 52 API endpoints from POST to GET for edge caching (#468)

* feat: convert 52 API endpoints from POST to GET for edge caching

Convert all cacheable sebuf RPC endpoints to HTTP GET with query/path
parameters, enabling CDN edge caching to reduce costs. Flatten nested
request types (TimeRange, PaginationRequest, BoundingBox) into scalar
query params. Add path params for resource lookups (GetFredSeries,
GetHumanitarianSummary, GetCountryStockIndex, GetCountryIntelBrief,
GetAircraftDetails). Rewrite router with hybrid static/dynamic matching
for path param support.

Kept as POST: SummarizeArticle, ClassifyEvent, RecordBaselineSnapshot,
GetAircraftDetailsBatch, RegisterInterest.

Generated with sebuf v0.9.0 (protoc-gen-ts-client, protoc-gen-ts-server).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: add rate_limited field to market response protos

The rateLimited field was hand-patched into generated files on main but
never declared in the proto definitions. Regenerating wiped it out,
breaking the build. Now properly defined in both ListEtfFlowsResponse
and ListMarketQuotesResponse protos.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: remove accidentally committed .planning files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Sebastien Melki
2026-02-27 17:44:40 +02:00
committed by GitHub
parent 5f908c0929
commit 6669d373cf
169 changed files with 3806 additions and 1860 deletions

View File

@@ -0,0 +1,461 @@
openapi: 3.1.0
info:
title: TradeService API
version: 1.0.0
paths:
/api/trade/v1/get-trade-restrictions:
get:
tags:
- TradeService
summary: GetTradeRestrictions
description: Get quantitative restrictions and export controls.
operationId: GetTradeRestrictions
parameters:
- name: countries
in: query
description: WTO member codes to filter by. Empty = all.
required: false
schema:
type: string
- name: limit
in: query
description: Max results to return (server caps at 100).
required: false
schema:
type: integer
format: int32
responses:
"200":
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/GetTradeRestrictionsResponse'
"400":
description: Validation error
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationError'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/api/trade/v1/get-tariff-trends:
get:
tags:
- TradeService
summary: GetTariffTrends
description: Get tariff rate timeseries for a country pair.
operationId: GetTariffTrends
parameters:
- name: reporting_country
in: query
description: WTO member code of reporting country (e.g. "840" = US).
required: false
schema:
type: string
- name: partner_country
in: query
description: WTO member code of partner country (e.g. "156" = China).
required: false
schema:
type: string
- name: product_sector
in: query
description: Product sector filter (HS chapter). Empty = aggregate.
required: false
schema:
type: string
- name: years
in: query
description: Number of years to look back (default 10, max 30).
required: false
schema:
type: integer
format: int32
responses:
"200":
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/GetTariffTrendsResponse'
"400":
description: Validation error
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationError'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/api/trade/v1/get-trade-flows:
get:
tags:
- TradeService
summary: GetTradeFlows
description: Get bilateral merchandise trade flows.
operationId: GetTradeFlows
parameters:
- name: reporting_country
in: query
description: WTO member code of reporting country.
required: false
schema:
type: string
- name: partner_country
in: query
description: WTO member code of partner country.
required: false
schema:
type: string
- name: years
in: query
description: Number of years to look back (default 10, max 30).
required: false
schema:
type: integer
format: int32
responses:
"200":
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/GetTradeFlowsResponse'
"400":
description: Validation error
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationError'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/api/trade/v1/get-trade-barriers:
get:
tags:
- TradeService
summary: GetTradeBarriers
description: Get SPS/TBT barrier notifications.
operationId: GetTradeBarriers
parameters:
- name: countries
in: query
description: WTO member codes to filter by. Empty = all.
required: false
schema:
type: string
- name: measure_type
in: query
description: 'Filter by measure type: "SPS", "TBT", or empty for both.'
required: false
schema:
type: string
- name: limit
in: query
description: Max results to return (server caps at 100).
required: false
schema:
type: integer
format: int32
responses:
"200":
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/GetTradeBarriersResponse'
"400":
description: Validation error
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationError'
default:
description: Error response
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
components:
schemas:
Error:
type: object
properties:
message:
type: string
description: Error message (e.g., 'user not found', 'database connection failed')
description: Error is returned when a handler encounters an error. It contains a simple error message that the developer can customize.
FieldViolation:
type: object
properties:
field:
type: string
description: The field path that failed validation (e.g., 'user.email' for nested fields). For header validation, this will be the header name (e.g., 'X-API-Key')
description:
type: string
description: Human-readable description of the validation violation (e.g., 'must be a valid email address', 'required field missing')
required:
- field
- description
description: FieldViolation describes a single validation error for a specific field.
ValidationError:
type: object
properties:
violations:
type: array
items:
$ref: '#/components/schemas/FieldViolation'
description: List of validation violations
required:
- violations
description: ValidationError is returned when request validation fails. It contains a list of field violations describing what went wrong.
GetTradeRestrictionsRequest:
type: object
properties:
countries:
type: array
items:
type: string
description: WTO member codes to filter by. Empty = all.
limit:
type: integer
format: int32
description: Max results to return (server caps at 100).
description: Request for quantitative restriction data.
GetTradeRestrictionsResponse:
type: object
properties:
restrictions:
type: array
items:
$ref: '#/components/schemas/TradeRestriction'
fetchedAt:
type: string
description: ISO 8601 timestamp when data was fetched from WTO.
upstreamUnavailable:
type: boolean
description: True if upstream fetch failed and results may be stale/empty.
description: Response containing trade restrictions and fetch metadata.
TradeRestriction:
type: object
properties:
id:
type: string
description: Unique restriction identifier from WTO.
reportingCountry:
type: string
description: ISO 3166-1 alpha-3 or WTO member code of reporting country.
affectedCountry:
type: string
description: Country affected by the restriction.
productSector:
type: string
description: Product sector or HS chapter description.
measureType:
type: string
description: 'Measure classification: "QR", "EXPORT_BAN", "IMPORT_BAN", "LICENSING".'
description:
type: string
description: Human-readable description of the measure.
status:
type: string
description: 'Current status: "IN_FORCE", "TERMINATED", "NOTIFIED".'
notifiedAt:
type: string
description: ISO 8601 date when measure was notified.
sourceUrl:
type: string
description: WTO source document URL (must be http/https protocol).
description: Quantitative restriction or export control measure notified to WTO.
GetTariffTrendsRequest:
type: object
properties:
reportingCountry:
type: string
description: WTO member code of reporting country (e.g. "840" = US).
partnerCountry:
type: string
description: WTO member code of partner country (e.g. "156" = China).
productSector:
type: string
description: Product sector filter (HS chapter). Empty = aggregate.
years:
type: integer
format: int32
description: Number of years to look back (default 10, max 30).
description: Request for tariff timeseries data.
GetTariffTrendsResponse:
type: object
properties:
datapoints:
type: array
items:
$ref: '#/components/schemas/TariffDataPoint'
fetchedAt:
type: string
description: ISO 8601 timestamp when data was fetched from WTO.
upstreamUnavailable:
type: boolean
description: True if upstream fetch failed and results may be stale/empty.
description: Response containing tariff trend datapoints.
TariffDataPoint:
type: object
properties:
reportingCountry:
type: string
description: WTO member code of reporting country.
partnerCountry:
type: string
description: WTO member code of partner country.
productSector:
type: string
description: Product sector or HS chapter.
year:
type: integer
format: int32
description: Year of observation.
tariffRate:
type: number
format: double
description: Applied MFN tariff rate (percentage).
boundRate:
type: number
format: double
description: WTO bound tariff rate (percentage).
indicatorCode:
type: string
description: WTO indicator code used for this datapoint.
description: Single tariff data point for a reporter-partner-product combination.
GetTradeFlowsRequest:
type: object
properties:
reportingCountry:
type: string
description: WTO member code of reporting country.
partnerCountry:
type: string
description: WTO member code of partner country.
years:
type: integer
format: int32
description: Number of years to look back (default 10, max 30).
description: Request for bilateral trade flow data.
GetTradeFlowsResponse:
type: object
properties:
flows:
type: array
items:
$ref: '#/components/schemas/TradeFlowRecord'
fetchedAt:
type: string
description: ISO 8601 timestamp when data was fetched from WTO.
upstreamUnavailable:
type: boolean
description: True if upstream fetch failed and results may be stale/empty.
description: Response containing trade flow records.
TradeFlowRecord:
type: object
properties:
reportingCountry:
type: string
description: WTO member code of reporting country.
partnerCountry:
type: string
description: WTO member code of partner country.
year:
type: integer
format: int32
description: Year of observation.
exportValueUsd:
type: number
format: double
description: Merchandise export value in millions USD.
importValueUsd:
type: number
format: double
description: Merchandise import value in millions USD.
yoyExportChange:
type: number
format: double
description: Year-over-year export change (percentage).
yoyImportChange:
type: number
format: double
description: Year-over-year import change (percentage).
productSector:
type: string
description: Product sector or HS chapter.
description: Bilateral trade flow record for a reporting-partner pair.
GetTradeBarriersRequest:
type: object
properties:
countries:
type: array
items:
type: string
description: WTO member codes to filter by. Empty = all.
measureType:
type: string
description: 'Filter by measure type: "SPS", "TBT", or empty for both.'
limit:
type: integer
format: int32
description: Max results to return (server caps at 100).
description: Request for SPS/TBT trade barrier notifications.
GetTradeBarriersResponse:
type: object
properties:
barriers:
type: array
items:
$ref: '#/components/schemas/TradeBarrier'
fetchedAt:
type: string
description: ISO 8601 timestamp when data was fetched from WTO.
upstreamUnavailable:
type: boolean
description: True if upstream fetch failed and results may be stale/empty.
description: Response containing trade barrier notifications.
TradeBarrier:
type: object
properties:
id:
type: string
description: Unique barrier notification identifier.
notifyingCountry:
type: string
description: Country that notified the measure.
title:
type: string
description: Title of the notification.
measureType:
type: string
description: 'Measure classification: "SPS" or "TBT".'
productDescription:
type: string
description: Product description or affected goods.
objective:
type: string
description: Stated objective of the measure.
status:
type: string
description: Status of the notification.
dateDistributed:
type: string
description: ISO 8601 date when notification was distributed.
sourceUrl:
type: string
description: WTO source document URL (must be http/https protocol).
description: SPS or TBT trade barrier notification.