API for agents
Read-only access to trips, destinations, availability, and business details. Booking is a handoff to the website — this API does not collect payment or run automated checkout.
Public REST API
No token is required for these routes. Pass lang=en or lang=ar so localized fields resolve to strings. Errors use an error field.
| Method | Path | Notes |
|---|---|---|
| GET | /api/health | Liveness. { status: "ok" } |
| GET | /api/v1/trips | Filters: supplier_id, destination_id, public_status, include_inactive (admin), lang=en|ar |
| GET | /api/v1/trips/{id} | Query: lang=en|ar |
| GET | /api/v1/destinations | Query: lang, status, public_status |
| GET | /api/v1/destinations/{id} | Query: lang |
| POST | /api/v1/images | Authenticated image upload; original files up to 20 MB are accepted and compressed before delivery. |
| GET | /api/v1/suppliers | Query: lang |
| GET | /api/v1/suppliers/{id} | Query: lang |
| GET | /api/v1/tour-guides | List |
| GET | /api/v1/tour-guides/{id} | By id |
| POST | /api/v1/bookings/manual | Guest booking. Optional bearer. Requires PII the user supplied. |
| POST | /api/v1/feedback | rating 1–5. Optional comment, name, contact. |
Machine-readable description: /openapi.json
MCP (read-only)
Streamable HTTP. Five tools, no writes. Search and get_trip return a /book?trip=id URL so the agent can hand the user to the form.
https://duckegy.com/api/mcp
search_trips— Filter by query / max_price / guests. Includes book_url.get_trip— Slug or 24-hex id. Includes book_url.list_destinations— Meeting points.check_availability— kayak | water_cycle | sup on YYYY-MM-DD. Shortage is a result, not a tool error.get_business_info— Hours, dual EGP tiers, InstaPay/cash, languages, contact.
There are no booking or payment tools. PII and InstaPay or cash stay on the website form.
Authentication
Catalogue reads need no auth. Supplier and admin routes use a 72-hour JWT in Authorization: Bearer. There is no OAuth authorization server and no automated agent registration. Details: /auth.md.