Queries travel promotions (flights, hotels and packages) and allows filtering and sorting them locally.
API Overview
- Base URL:
https://anduin.ferminrp.com - Auth: None required
- Response format: JSON
- Main endpoint:
/api/v1/promos - OpenAPI:
https://anduin.ferminrp.com/docs/openapi.json - Upstream source:
data.source - Operational news channel:
https://t.me/comparaviajes(@comparaviajes), with new promo posts on an hourly frequency - Relevant timestamps:
data.lastUpdated(promo update)timestamp(service response)
- Documented query params for
/api/v1/promos: none - Note: the tested query params (
category,destinationCountry,limit,q) do not filter at the source; filter locally withjq(verified against the current response from the endpoint).
Endpoint
GET /api/v1/promos
Usage examples:
curl -s "https://anduin.ferminrp.com/api/v1/promos" | jq '.'
curl -s "https://anduin.ferminrp.com/api/v1/promos" | jq '.data.promos[0:5]'
curl -s "https://anduin.ferminrp.com/api/v1/promos" | jq '.data.promos | map(select(.category == "vuelos"))'
curl -s "https://anduin.ferminrp.com/api/v1/promos" | jq '.data.promos | map(select(.category == "autos"))'
curl -s "https://anduin.ferminrp.com/api/v1/promos" | jq '.data.promos | map(select(.destinationCountry == "brazil"))'
curl -s "https://anduin.ferminrp.com/api/v1/promos" | jq '.data.promos | sort_by(.date) | reverse | .[0:10]'
curl -s "https://anduin.ferminrp.com/api/v1/promos" | jq '.data.promos | sort_by(-.score) | .[0:10]'
Key fields
- Top-level:
success(bool)timestamp(ISO datetime)
data:lastUpdated(ISO datetime)source(source URL)totalPromos(int)promos(array)
promos[]:id,date,title,permalink,thumbnailUrldestinationCountry(can benull)categoryscore(numeric for ranking, may not be present if AI classification fails)
- Dynamic values observed today (examples, not a closed list):
category:vuelos,hoteles,autos,paquetes,asistencia,otrosdestinationCountry:brazil,united_states,spain,dominican_republic,aruba,mexico,japan,portugal,europe,null
- Additional semantics:
permalinkis built dynamically as/links/viajes/:idon the request host
Workflow
- Detect user intent:
- General listing
- Filter by category or country
- Ranking by score
- Latest promos
- Query the single endpoint with
curl -s. - Validate
success == trueand existence ofdata.promos. - Apply filters and sort locally with
jq:- By
category - By
destinationCountry - By text in
titleoridwhen applicable - By
dateorscore
- By
- Respond first with a snapshot:
- Total count (
totalPromos) lastUpdated- Top 3 promos by score or relevance
- Total count (
- Then show a short table (top 5/10):
date | category | destinationCountry | score | title
- Include only
permalinkfor the promos shown. - Keep the response informative, without financial advice or availability guarantees.
- If the user asks for real-time recency, clarify that they can also follow news at
@comparaviajes(https://t.me/comparaviajes).
Error Handling
- Unsuccessful HTTP:
- Report the HTTP code and the endpoint queried.
- 404 (
No promos data available):- Report that there is no cached promo data at this time.
success: false:- Show the error payload if it exists.
- Unexpected JSON:
- Show the minimum useful raw output and clarify the inconsistency.
- Network or timeout:
- Retry up to 2 times with a short wait.
promosempty:- Report "no promotions available currently".
Presenting Results
- Default format:
- Executive summary + short table
- Prioritize:
- Recency (
date) - Relevance (
score) - Clarity of destination and category
- Recency (
- Clarify timestamps (
lastUpdatedand/ortimestamp) and the external source (data.source). - When applicable, add an operational note for hourly monitoring on Telegram:
https://t.me/comparaviajes. - Do not issue purchase recommendations; only report available promotions.
Out of Scope
This skill must not do in v1:
- Direct scraping of external sites
- Automation of booking or purchase
- Push alerts, notifications, or change tracking
- Use of endpoints other than
/api/v1/promos