{"openapi":"3.1.0","info":{"title":"TravelCargo Public API v1","version":"1.0.0","description":"Read-only, unauthenticated access to TravelCargo public trip inventory, a free peer-to-peer shipping marketplace where verified travelers with spare luggage capacity carry packages. All prices are indicative; fees are negotiated between sender and traveler (the platform is free). Rate limit: 30 requests/minute/IP per server instance. Prefer caching: responses are fresh at the edge for 60 s and served stale while revalidating for 300 s.","contact":{"email":"support@travelcargo.eu"},"license":{"name":"All rights reserved"}},"servers":[{"url":"https://www.travelcargo.eu"}],"paths":{"/api/public/v1/trips/search":{"get":{"summary":"Search active public trips by route","operationId":"searchTrips","description":"Returns active trips (departing today or later) matching an origin and destination city. City-name variants are tolerated (e.g. Bombay → Mumbai). Sorted by departure, 20 per page.","parameters":[{"name":"origin","in":"query","required":true,"schema":{"type":"string"},"example":"Berlin"},{"name":"destination","in":"query","required":true,"schema":{"type":"string"},"example":"Mumbai"},{"name":"dateFrom","in":"query","required":false,"schema":{"type":"string","format":"date"},"example":"2026-11-01"},{"name":"dateTo","in":"query","required":false,"schema":{"type":"string","format":"date"},"example":"2026-12-01"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":1}}],"responses":{"200":{"description":"Matching trips (empty array when nothing matches).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResult"}}}},"400":{"description":"Missing or invalid parameters (problem+json)."},"429":{"description":"Rate limit exceeded (problem+json)."}}}},"/api/public/v1/trips/{id}":{"get":{"summary":"Get a single public trip","operationId":"getTrip","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The trip.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Trip"}}}},"404":{"description":"No trip with this id (problem+json)."}}}},"/api/public/v1/quote":{"get":{"summary":"Indicative price range for a route","operationId":"estimateQuote","description":"Platform-guidance price range for sending a package with a traveler on a known route, optionally compared with the carrier’s published courier price (source and retrieval date included).","parameters":[{"name":"origin","in":"query","required":true,"schema":{"type":"string"},"example":"Berlin"},{"name":"destination","in":"query","required":true,"schema":{"type":"string"},"example":"Mumbai"},{"name":"weightKg","in":"query","required":true,"schema":{"type":"number","minimum":0.5,"maximum":30},"example":5}],"responses":{"200":{"description":"Indicative range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"404":{"description":"No route guidance for this city pair yet (problem+json)."}}}}},"components":{"schemas":{"Trip":{"type":"object","description":"Explicit allowlist, no other trip data is exposed. The traveler’s identity is limited to a first name and their government-ID verification flag.","properties":{"id":{"type":"string"},"origin":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"}}},"destination":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"}}},"departDate":{"type":"string","format":"date-time"},"capacityKgAvailable":{"type":"number"},"priceIndication":{"type":"object","properties":{"currency":{"type":"string","const":"EUR"},"min":{"type":"number"},"max":{"type":"number"},"basis":{"type":"string","const":"per-package"},"indicative":{"type":"boolean","const":true},"note":{"type":"string"}}},"traveler":{"type":"object","properties":{"firstName":{"type":"string"},"verified":{"type":"boolean"}}},"deepLink":{"type":"string","format":"uri"}},"required":["id","origin","destination","departDate","capacityKgAvailable","traveler","deepLink"]},"SearchResult":{"type":"object","properties":{"query":{"type":"object"},"total":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"hasMore":{"type":"boolean"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Trip"}}},"required":["total","page","pageSize","hasMore","items"]},"Quote":{"type":"object","properties":{"origin":{"type":"string"},"destination":{"type":"string"},"weightKg":{"type":"number"},"priceIndication":{"type":"object"},"courierComparison":{"type":"object","properties":{"carrier":{"type":"string"},"weightKg":{"type":"number"},"priceEur":{"type":"number"},"sourceUrl":{"type":"string","format":"uri"},"retrievedAt":{"type":"string","format":"date"}}},"liveInventory":{"type":"string","format":"uri"},"deepLink":{"type":"string","format":"uri"}}}}}}