📘 Documentație API Dal Travel
API pentru integrarea ofertelor de călătorie
Prezentare generală
API-ul Dal Travel oferă acces programatic la baza de date cu oferte disponibile pe platforma Dal Travel. Acesta expune două endpoint-uri publice, fără autentificare, care returnează liste paginate în format JSON: feed-ul complet de oferte și feed-ul pentru locuri disponibile.
Specificații OpenAPI
API-ul DAL Travel este documentat folosind standardul OpenAPI 3.0.3, oferind specificații complete pentru integrare și testare.
Fișiere disponibile
- OpenAPI YAML:
https://rezervari.daltravel.ro/api_docs/openapi.yaml
- OpenAPI JSON:
https://rezervari.daltravel.ro/api_docs/openapi.json
Caracteristici OpenAPI
- Schema completă: Toate câmpurile documentate cu tipuri de date corecte
- Exemple: Exemple pentru fiecare câmp și endpoint
- Validări: Restricții min/max pentru parametri
- Enum-uri: Valorile fixe pentru zone și status
- Format date: Format ISO 8601 pentru datele de timp
- Referințe: Relații între schema-uri
- Răspunsuri de eroare: Documentație completă pentru toate codurile de eroare
Endpoint principal
https://rezervari.daltravel.ro/feed
Metodă: GET
Autentificare: Nu este necesară (endpoint public)
Format răspuns: JSON
Rate Limiting: Nu este aplicat (endpoint public)
Endpoint locuri disponibile
https://rezervari.daltravel.ro/feed/locuri-libere
Metodă: GET
Autentificare: Nu este necesară (endpoint public)
Format răspuns: JSON
Descriere: Returnează aceleași oferte paginate, dar cu informația agregată de disponibilitate prin câmpul locuriDisponibile în plecariActive[].
Parametri de interogare (Query Parameters)
| Nume |
Tip |
Obligatoriu |
Valoare implicită |
Descriere |
Exemplu |
| page |
integer |
Nu |
1 |
Pagina de rezultate (începe de la 1) |
page=2 |
| limit |
integer |
Nu |
10 |
Numărul maxim de oferte returnate per pagină (1-50) |
limit=20 |
Exemple de cerere:
GET https://rezervari.daltravel.ro/feed
GET https://rezervari.daltravel.ro/feed?page=2&limit=15
GET https://rezervari.daltravel.ro/feed/locuri-libere?page=1&limit=20
```json
{
"offers": [
{
"plecariActive": [
{
"title": "Exemplu de titlu pentru ofertă de călătorie",
"locuriDisponibile": 25,
"partajeCountByGender": {
"masculin": 12,
"feminin": 13
},
"name": null,
"deleted": null,
"pdfUrl": "https://rezervari.daltravel.ro/uploads/pictures/exemplu_brochura.pdf",
"listPhotoUrl": "https://rezervari.daltravel.ro/uploads/pictures/exemplu_imagine_lista.webp",
"id": 1234567,
"status": "active",
"cancelDays1": 120,
"cancelPercent1": 5,
"cancelDays2": 90,
"cancelPercent2": 10,
"cancelDays3": 60,
"cancelPercent3": 50,
"cancelDays4": 30,
"cancelPercent4": 100,
"tagline": "Exemplu de tagline pentru ofertă",
"orase": null,
"introducere": "Text de introducere pentru ofertă...",
"sub_intro": "Sub-introducere pentru ofertă...",
"va_invitam": "Text de invitație...",
"info_traseu": "Informații despre traseu...",
"info_insotitor": "Însoțitor român și ghizi locali",
"info_tarif": "\u003Cp\u003E\u003Cstrong\u003E1200 EURO / loc în cameră dublă; Supliment single: 300 EURO\u003C/strong\u003E\u003C/p\u003E",
"obiective_natura": "Exemplu de obiective de natură, Parcul Natural, Rezervația Naturală",
"obiective_arta": "Exemplu de obiective de artă...",
"obiective_traditii": null,
"obiective_distractii": null,
"start_date": "2024-06-15T00:00:00+03:00",
"end_date": "2024-06-25T00:00:00+03:00",
"tarif_dubla_text": "1200 EURO",
"tarif_euro": 1200,
"reducere_euro": 50,
"tarif_usd": 1300,
"reducere_usd": 25,
"tarif_ron": 6000,
"reducere_ron": 250,
"tarif_a_treia_text": "1000 EURO",
"discount_a_treia_euro": 200,
"discount_a_treia_usd": 220,
"discount_a_treia_ron": 1000,
"tarif_copil_extra_text": "800 EURO",
"discount_copil_extra_euro": 400,
"discount_copil_extra_usd": 440,
"discount_copil_extra_ron": 2000,
"supliment_single_text": "300 EURO",
"supliment_single_euro": 300,
"supliment_single_usd": 330,
"supliment_single_ron": 1500,
"tarif_grup_minim": "Informații despre tarifele pentru grupuri minime...",
"nr_minim_turisti": 30,
"taxeAeroportIntercontinentale": "Taxe aeroport intercontinentale: 150 EUR",
"taxeAeroportLocale": "Taxe aeroport locale: 50 EUR",
"tarif_observatii": "Observații despre tarife: prețurile pot varia în funcție de sezon",
"nr_zile": "10",
"sfaturi": "Sfaturi pentru turiști: aduceți haine potrivite pentru vreme, documente de identitate valide",
"incluse": "Servicii incluse în preț...",
"neincluse": "Servicii neincluse în preț...",
"conditii": "Condiții generale...",
"acte": "- paşaportul sau cartea de identitate în curs de valabilitate",
"observatii": "Observații generale...",
"days": [
{
"id": 12345,
"nr_zi": 1,
"titlu": "Ziua 1 - Plecare din București",
"masa": null,
"cazare": "Hotel Exemplu 4* (sau similar 4*)",
"zbor": null,
"transport": "Avion, autocar",
"obiective": "Obiectiv turistic 1\r\nObiectiv turistic 2\r\nObiectiv turistic 3\r\nObiectiv turistic 4\r\nObiectiv turistic 5",
"optionale": null,
"descriere": "Descrierea zilei...",
"pictures": [
{
"url": "https://rezervari.daltravel.ro/uploads/pictures/exemplu_zi_imagine.webp"
}
]
},
{
"id": 12346,
"nr_zi": 2,
"titlu": "Ziua 2 - Vizitare oraș de destinație",
"masa": "Mic dejun",
"cazare": "Hotel Exemplu 4* (sau similar 4*)",
"zbor": null,
"transport": "Autocar",
"obiective": "Centrul istoric\r\nMuzeul local\r\nPiața centrală",
"optionale": null,
"descriere": "Descrierea zilei...",
"pictures": [
{
"url": "https://rezervari.daltravel.ro/uploads/pictures/exemplu_zi_imagine.webp"
}
]
}
],
"brief_transport": "Avion\r\nAutocar\r\nFerry-boat",
"brief_cazare": "2 nopți în orașul A\r\n2 nopți în orașul B\r\n2 nopți în orașul C\r\n2 nopți în orașul D\r\n2 nopți în orașul E",
"brief_mese": "Mic dejun: 8",
"brief_ghizi": "Însoțitor DAL Travel\r\nGhizi locali",
"brief_marime_grup": "30",
"pdf": "exemplu_brochura_oferta.pdf",
"coords": [
{
"coords": "(44.4268, 26.1025)",
"descriere": "",
"nr": 0,
"ordine": 1
},
{
"coords": "(48.8566, 2.3522)",
"descriere": "",
"nr": 1,
"ordine": 2
},
{
"coords": "(41.9028, 12.4964)",
"descriere": "",
"nr": 2,
"ordine": 3
},
{
"coords": "(40.4168, -3.7038)",
"descriere": "",
"nr": 3,
"ordine": 4
},
{
"coords": "(50.0755, 14.4378)",
"descriere": "",
"nr": 4,
"ordine": 5
}
],
"optionals": [
{
"id": 1,
"name": "Excursie opțională",
"tarif_euro": 50,
"tarif_usd": 55,
"tarif_ron": 250,
"deplasare": false,
"must": false,
"available": true
}
]
}
],
"imageUrl": "",
"id": 1234,
"name": "Exemplu de ofertă de călătorie",
"zone": "europa",
"pictures": [
{
"url": "https://rezervari.daltravel.ro/uploads/pictures/exemplu_imagine1.webp"
},
{
"url": "https://rezervari.daltravel.ro/uploads/pictures/exemplu_imagine2.webp"
},
{
"url": "https://rezervari.daltravel.ro/uploads/pictures/exemplu_imagine3.webp"
},
{
"url": "https://rezervari.daltravel.ro/uploads/pictures/exemplu_imagine4.webp"
},
{
"url": "https://rezervari.daltravel.ro/uploads/pictures/exemplu_imagine5.webp"
}
],
"coords": [
{
"coords": "(44.4268, 26.1025)",
"descriere": "București",
"nr": 0,
"ordine": 1
},
{
"coords": "(48.8566, 2.3522)",
"descriere": "Paris",
"nr": 1,
"ordine": 2
}
],
"continents": [
{
"name": "Europa"
}
],
"countries": [
{
"name": "Franța"
},
{
"name": "Italia"
},
{
"name": "Spania"
},
{
"name": "Germania"
},
{
"name": "Austria"
}
],
"cities": [
{
"name": "Paris"
},
{
"name": "Roma"
},
{
"name": "Madrid"
}
]
}
],
"currentPage": 1,
"lastPage": 5
}
Descriere detaliată a câmpurilor
Câmpuri la nivel de răspuns principal
| Câmp |
Tip |
Descriere |
offers |
array |
Lista de oferte de călătorie disponibile |
currentPage |
integer |
Pagina curentă din rezultate |
lastPage |
integer |
Numărul total de pagini disponibile |
Câmpuri la nivel de ofertă (offers[])
| Câmp |
Tip |
Obligatoriu |
Descriere |
id |
integer |
Da |
Identificator unic al ofertei |
name |
string |
Da |
Numele ofertei (ex: "5 Capitale Baltice") |
zone |
string |
Da |
Zona geografică: europa, asia, america, africa, oceania |
imageUrl |
string |
Nu |
URL-ul imaginii principale a ofertei |
pictures |
array |
Nu |
Lista de imagini asociate ofertei |
coords |
array |
Nu |
Coordonatele geografice ale destinațiilor |
continents |
array |
Nu |
Lista continentelor vizitate |
countries |
array |
Da |
Lista țărilor vizitate în cadrul ofertei |
cities |
array |
Nu |
Lista orașelor vizitate |
plecariActive |
array |
Da |
Lista plecărilor active pentru această ofertă |
Câmpuri în countries[]
| Câmp |
Tip |
Descriere |
name |
string |
Numele țării (ex: "România", "Franța") |
Câmpuri în continents[]
| Câmp |
Tip |
Descriere |
name |
string |
Numele continentului (ex: "Europa", "Asia") |
Câmpuri în cities[]
| Câmp |
Tip |
Descriere |
name |
string |
Numele orașului (ex: "Paris", "Roma") |
Câmpuri în pictures[]
| Câmp |
Tip |
Descriere |
url |
string |
URL-ul complet al imaginii |
Câmpuri în plecariActive[] (plecări active)
| Câmp |
Tip |
Obligatoriu |
Descriere |
id |
integer |
Da |
Identificator unic al plecării |
title |
string |
Da |
Titlul complet al plecării |
locuriDisponibile |
integer |
Da |
Numărul de locuri libere disponibile |
status |
string |
Da |
Statusul plecării: active, inactive |
pdfUrl |
string |
Nu |
URL-ul către broșura PDF a plecării |
listPhotoUrl |
string |
Nu |
URL-ul imaginii pentru listare |
start_date |
string |
Da |
Data de plecare în format ISO 8601 |
end_date |
string |
Da |
Data de întoarcere în format ISO 8601 |
nr_zile |
string |
Da |
Numărul de zile ale călătoriei |
tarif_euro |
number |
Da |
Prețul per persoană în cameră dublă (EUR) |
tarif_dubla_text |
string |
Da |
Prețul per persoană în cameră dublă (text formatat) |
supliment_single_euro |
number |
Nu |
Suplimentul pentru cameră single (EUR) |
supliment_single_text |
string |
Nu |
Suplimentul pentru cameră single (text formatat) |
nr_minim_turisti |
integer |
Da |
Numărul minim de turiști pentru a se desfășura plecarea |
partajeCountByGender |
object |
Da |
Statistici de participare pe gen |
name |
string |
Nu |
Numele plecării (poate fi null) |
deleted |
string |
Nu |
Data ștergerii (dacă este ștearsă) |
cancelDays1 |
integer |
Nu |
Numărul de zile pentru prima etapă de anulare |
cancelPercent1 |
integer |
Nu |
Procentul de penalizare pentru prima etapă de anulare |
cancelDays2 |
integer |
Nu |
Numărul de zile pentru a doua etapă de anulare |
cancelPercent2 |
integer |
Nu |
Procentul de penalizare pentru a doua etapă de anulare |
cancelDays3 |
integer |
Nu |
Numărul de zile pentru a treia etapă de anulare |
cancelPercent3 |
integer |
Nu |
Procentul de penalizare pentru a treia etapă de anulare |
cancelDays4 |
integer |
Nu |
Numărul de zile pentru a patra etapă de anulare |
cancelPercent4 |
integer |
Nu |
Procentul de penalizare pentru a patra etapă de anulare |
tagline |
string |
Nu |
Sloganul ofertei |
orase |
string |
Nu |
Lista orașelor vizitate |
introducere |
string |
Nu |
Textul de introducere al ofertei |
sub_intro |
string |
Nu |
Sub-introducerea ofertei |
va_invitam |
string |
Nu |
Textul de invitație |
info_traseu |
string |
Nu |
Informații despre traseu |
info_insotitor |
string |
Nu |
Informații despre însoțitor |
info_tarif |
string |
Nu |
Informații detaliate despre tarife (HTML) |
obiective_natura |
string |
Nu |
Obiective turistice de natură |
obiective_arta |
string |
Nu |
Obiective turistice de artă |
obiective_traditii |
string |
Nu |
Obiective turistice tradiționale |
obiective_distractii |
string |
Nu |
Obiective turistice de distracție |
reducere_euro |
number |
Nu |
Reducerea aplicată în EUR |
tarif_usd |
number |
Nu |
Prețul în USD |
reducere_usd |
number |
Nu |
Reducerea aplicată în USD |
tarif_ron |
number |
Nu |
Prețul în RON |
reducere_ron |
number |
Nu |
Reducerea aplicată în RON |
tarif_a_treia_text |
string |
Nu |
Prețul pentru a treia persoană în cameră (text) |
discount_a_treia_euro |
number |
Nu |
Reducerea pentru a treia persoană în EUR |
discount_a_treia_usd |
number |
Nu |
Reducerea pentru a treia persoană în USD |
discount_a_treia_ron |
number |
Nu |
Reducerea pentru a treia persoană în RON |
tarif_copil_extra_text |
string |
Nu |
Prețul pentru copilul suplimentar (text) |
discount_copil_extra_euro |
number |
Nu |
Reducerea pentru copilul suplimentar în EUR |
discount_copil_extra_usd |
number |
Nu |
Reducerea pentru copilul suplimentar în USD |
discount_copil_extra_ron |
number |
Nu |
Reducerea pentru copilul suplimentar în RON |
supliment_single_usd |
number |
Nu |
Suplimentul single în USD |
supliment_single_ron |
number |
Nu |
Suplimentul single în RON |
tarif_grup_minim |
string |
Nu |
Informații despre tarifele pentru grupuri minime |
taxeAeroportIntercontinentale |
string |
Nu |
Taxe aeroport intercontinentale |
taxeAeroportLocale |
string |
Nu |
Taxe aeroport locale |
tarif_observatii |
string |
Nu |
Observații despre tarife |
sfaturi |
string |
Nu |
Sfaturi pentru turiști |
incluse |
string |
Nu |
Servicii incluse în preț |
neincluse |
string |
Nu |
Servicii neincluse în preț |
conditii |
string |
Nu |
Condiții generale |
acte |
string |
Nu |
Acte necesare pentru călătorie |
observatii |
string |
Nu |
Observații generale |
days |
array |
Da |
Lista zilelor din itinerar |
brief_transport |
string |
Nu |
Rezumat despre mijloacele de transport |
brief_cazare |
string |
Nu |
Rezumat despre cazare |
brief_mese |
string |
Nu |
Rezumat despre mese |
brief_ghizi |
string |
Nu |
Rezumat despre ghizi |
brief_marime_grup |
string |
Nu |
Rezumat despre mărimea grupului |
pdf |
string |
Nu |
Numele fișierului PDF |
coords |
array |
Nu |
Coordonatele geografice ale destinațiilor |
optionals |
array |
Nu |
Lista serviciilor opționale disponibile pentru această plecare |
Câmpuri în optionals[] (opțiuni plecare)
| Câmp |
Tip |
Descriere |
id |
integer |
Identificator unic al opționalului |
name |
string |
Numele opționalului |
tarif_euro |
integer |
Tarif în EUR (poate fi null) |
tarif_usd |
integer |
Tarif în USD (poate fi null) |
tarif_ron |
integer |
Tarif în RON (poate fi null) |
deplasare |
boolean |
Indică dacă opționalul presupune deplasare |
must |
boolean |
Indică dacă opționalul este obligatoriu |
available |
boolean |
Indică dacă opționalul este disponibil |
Câmpuri în partajeCountByGender
| Câmp |
Tip |
Descriere |
masculin |
integer |
Numărul de participanți de gen masculin |
feminin |
integer |
Numărul de participanți de gen feminin |
Câmpuri în days[] (zilele itinerarului)
| Câmp |
Tip |
Obligatoriu |
Descriere |
id |
integer |
Da |
Identificator unic al zilei |
nr_zi |
integer |
Da |
Numărul zilei în itinerar |
titlu |
string |
Da |
Titlul zilei |
masa |
string |
Nu |
Tipul de masă inclusă (ex: "Mic dejun", "Pranz", "Cina") |
cazare |
string |
Nu |
Detalii despre cazare |
zbor |
string |
Nu |
Detalii despre zbor |
transport |
string |
Nu |
Mijloacele de transport folosite |
obiective |
string |
Nu |
Lista obiectivelor turistice |
optionale |
string |
Nu |
Activități opționale |
descriere |
string |
Nu |
Descrierea detaliată a zilei |
pictures |
array |
Nu |
Imagini asociate zilei |
Câmpuri în coords[] (coordonate geografice)
| Câmp |
Tip |
Descriere |
coords |
string |
Coordonatele în format "(latitudine, longitudine)" |
descriere |
string |
Descrierea locației |
nr |
integer |
Numărul de ordine al coordonatei |
ordine |
integer |
Ordinea în traseu |
Notă: Câmpul coords poate apărea la două nivele:
- La nivelul ofertei (
offers[].coords[]) - coordonatele generale ale destinațiilor
- La nivelul plecării (
offers[].plecariActive[].coords[]) - coordonatele specifice pentru traseul plecării
Exemple de utilizare
1. Obținerea tuturor ofertelor (prima pagină)
curl "https://rezervari.daltravel.ro/feed"
2. Obținerea a 20 de oferte de pe pagina 2
curl "https://rezervari.daltravel.ro/feed?page=2&limit=20"
Limitări și restricții
Rate Limiting
- Nu există limitări de rate pentru endpoint-ul public
- Se recomandă utilizarea responsabilă, pentru a nu supraîncărca serverul. Nu este necesara o sincronizare mai frecventa de 24 de ore.
Limitări de paginare
limit poate fi între 1 și 50 de oferte per pagină
page începe de la 1 (nu de la 0)
- Dacă se solicită o pagină inexistentă, se returnează o listă goală
- Toate datele sunt returnate în format JSON
- Datele de tip string pot conține HTML (ex:
info_tarif)
- Coordonatele sunt în format "(latitudine, longitudine)"
- Datele de timp sunt în format ISO 8601 cu timezone
Observații importante
Câmpuri care pot fi null
- Majoritatea câmpurilor opționale pot avea valoarea
null
- Se recomandă verificarea valorilor înainte de utilizare
- Câmpurile obligatorii nu sunt niciodată
null
Actualizarea datelor
- Datele sunt actualizate în timp real
- Se recomandă cache-ul local pentru performanță optimă
- Intervalul de actualizare recomandat: 1-6 ore
Coduri de eroare posibile
| Cod HTTP |
Descriere |
Cauza posibilă |
Soluție |
| 200 |
OK – Răspuns cu succes |
- |
- |
| 400 |
Bad Request – Parametru invalid |
limit > 50 sau page < 1 |
Verificați valorile parametrilor |
| 404 |
Not Found – Nu există date disponibile |
Pagina solicitată nu există |
Verificați numărul paginii |
| 500 |
Internal Server Error |
Eroare pe server |
Încercați din nou mai târziu |
| 503 |
Service Unavailable |
Server temporar indisponibil |
Încercați din nou în câteva minute |
Pentru întrebări tehnice sau probleme cu API-ul, contactați echipa de dezvoltare Dal Travel.
Endpoint-ul este destinat utilizării publice pentru integrarea ofertelor DalTravel în aplicații externe.