Javni API v1

Tehnička API specifikacija

Dobrodošli na portal za programere. GoST365 omogućava jednostavnu integraciju rezervacionog kalendara i formi na bilo kom sajtu (WordPress, Webflow, React, PHP ili statički HTML).

Autentifikacija

Svaki API zahtev mora biti poslat preko HTTPS protokola i mora sadržati vaš javni API ključ u zaglavlju (header-u) zahteva. API ključ se generiše od strane Super Admina u Control Panelu i ima format Stripe ključa (`gost365_live_...`).

Podržana zaglavlja:

x-api-key: gost365_live_e83bc2a3a9...
Authorization: Bearer gost365_live_e83bc2a3a9...

CORS & Whitelist Zaštita

Kako bi se sprečilo da neko zloupotrebi vaš javni API ključ na drugom sajtu, GoST365 vrši striktnu proveru mrežnog porekla zahteva (**CORS**).

Važno: Domeni sa kojih se vrši poziv (npr. `mojapartman.com`, `www.mojapartman.com`, ili `localhost:3000` za vreme razvoja) moraju biti upisani u polje allowed_domains za datog klijenta u sistemu. Ukoliko domen nije na listi, API će vratiti grešku `403 Forbidden`.

Rate Limiting (Ograničenje)

U produkciji je aktivna zaštita od preopterećenja koja dozvoljava maksimalno 100 zahteva u minuti po jedinstvenoj IP adresi. Ukoliko pređete limit, API vraća statusni kod `429 Too Many Requests`.

API Reference: Jedinice

Dohvatite smeštajne jedinice klijenta i njihove rezervisane termine.

GEThttps://gost365.app/api/v1/units

Primer odgovora (200 OK) — odaberi tip jedinice

Smještaj

Vozila

Oprema

{
  "success": true,
  "data": [
    {
      "id": "8f7e6d5c-4b3a-2a19-0e9d-8c7b6a5f4e3d",
      "name": "Apartman Morski Konjic",
      "type": "Apartman",
      "billing_mode": "nightly",
      "description": "Luksuzan studio sa pogledom na more.",
      "address": "Bulevar Plaže 12, Budva",
      "base_price": 75,
      "check_in": "14:00",
      "check_out": "10:00",
      "amenities": ["wifi", "ac", "parking", "pool"],
      "details": {
            "max_guests": 4,
            "bedrooms": 2,
            "bathrooms": 1,
            "area_size": 65,
            "floor": "2. sprat"
      },
      "images": ["https://sajt.com/slika1.jpg"],
      "pricing_config": { "base_price": 75, "currency": "EUR", "tiers": [], "seasons": [] },
      "availability_blocks": [
        { "start_date": "2026-07-01", "end_date": "2026-07-08", "status": "confirmed" },
        { "start_date": "2026-07-15", "end_date": "2026-07-20", "status": "pending" }
      ]
    }
  ]
}

Napomena: availability_blocks sadrži sve zauzete termine sa statusima confirmed i pending — koristite ih za blokiranje datuma na kalendaru vašeg sajta.

API Reference: Rezervacije

Pošaljite upit ili direktnu rezervaciju sa vašeg sajta u Dashboard.

POSThttps://gost365.app/api/v1/bookings

Primer Request Body — odaberi tip jedinice

Smještaj

Vozila

Oprema

{
  "unit_id": "8f7e6d5c-4b3a-2a19-0e9d-8c7b6a5f4e3d",
  "start_date": "2026-07-01",
  "end_date": "2026-07-08",
  "guest_name": "Jovan Jovanović",
  "guest_email": "jovan.jovanovic@email.com",
  "guest_phone": "+381641234567",
  "adults_count": 2,
  "children_count": 1,
  "infants_count": 0,
  "notes": "Molimo za tihu sobu i krevetac za bebu."
}

Opis Polja (JSON Body)

PoljeTipObaveznoOpis
unit_idUUIDDaJedinstveni ID apartmana iz GET /units
start_dateString (YYYY-MM-DD)DaDatum dolaska gosta
end_dateString (YYYY-MM-DD)DaDatum odlaska gosta
guest_nameStringDaIme i prezime gosta
guest_emailStringDaKontakt email adresa gosta
guest_phoneStringNeKontakt telefon gosta
guests_countIntegerNe (podr. zbir)Ukupan broj osoba (zbir odraslih, dece i beba)
adults_countIntegerNe (podr. 1)Broj odraslih osoba
children_countIntegerNe (podr. 0)Broj dece (2-17 godina)
infants_countIntegerNe (podr. 0)Broj beba (do 2 godine)
notesStringNeNapomena gosta

Odgovor pri uspešnom kreiranju (201 Created)

{
  "success": true,
  "booking_id": "7a8b9c0d-e1f2-3a4b-5c6d-7e8f9a0b1c2d",
  "message": "Booking created successfully"
}

Greške i Statusni Kodovi

  • 400 Nedostaju obavezna polja ili cenovnik za dati apartman nije ispravno konfigurisan.
  • 401 API ključ nedostaje ili je nevažeći.
  • 403 Nalog je suspendovan ili domen sajta sa kog šaljete upit nije dodat na CORS listu u Control Panelu.
  • 409 Konflikt preklapanja: Neko je u međuvremenu već rezervisao te datume. Sprečava overbooking.

Schema po Tipu Jedinice

Polje details u odgovoru API-ja sadrži specifične podatke za svaki tip jedinice. Polje billing_mode govori programeru koji UI prikazati korisniku.

"nightly"Po noćenju

Apartman, Soba, Kuća

Date range picker — datum dolaska / odlaska

"daily"Po danu

Auto, Šator, Ostalo

Date range picker — datum preuzimanja / vraćanja

"hourly"Po satu

Kvad, Motor, Bicikl, Plovilo, Bazen

Jedan datum + vremenski period (hh:mm)

Smještaj

Apartmanbilling_mode: "nightly"

Polja u details

PoljeTip
max_guestsnumber
bedroomsnumber
bathroomsnumber
area_sizenumber
floorstring

Amenities IDs

wifiacparkingpool

Primjer details objekta

{
  "max_guests": 4,
  "bedrooms": 2,
  "bathrooms": 1,
  "area_size": 65,
  "floor": "2. sprat"
}
Sobabilling_mode: "nightly"

Polja u details

PoljeTip
max_guestsnumber
bedsnumber
bathroomsnumber
area_sizenumber
floorstring

Amenities IDs

wifiacbreakfasttvensuite

Primjer details objekta

{
  "max_guests": 2,
  "beds": 2,
  "bathrooms": 1,
  "area_size": 22,
  "floor": "3. sprat"
}
Kućabilling_mode: "nightly"

Polja u details

PoljeTip
max_guestsnumber
bedroomsnumber
bathroomsnumber
area_sizenumber
floorsnumber

Amenities IDs

wifiacparkingpoolpetsbbqgarden

Primjer details objekta

{
  "max_guests": 8,
  "bedrooms": 3,
  "bathrooms": 2,
  "area_size": 150,
  "floors": 2
}

Vozila

Kvadbilling_mode: "hourly"

Polja u details

PoljeTip
brand_modelstring
manufacture_yearnumber
registration_platesstring
seatsnumber
transmissionstring
fuel_typestring
engine_powerstring

Amenities IDs

helmet4x4insurancegps

Primjer details objekta

{
  "brand_model": "Yamaha Raptor 350",
  "manufacture_year": 2022,
  "registration_plates": "KO 123-AB",
  "seats": 1,
  "transmission": "manual",
  "fuel_type": "petrol",
  "engine_power": "350cc"
}
Motorbilling_mode: "hourly"

Polja u details

PoljeTip
brand_modelstring
manufacture_yearnumber
registration_platesstring
transmissionstring
fuel_typestring
engine_powerstring

Amenities IDs

helmetinsurancegpsautomatic

Primjer details objekta

{
  "brand_model": "Honda CB500F",
  "manufacture_year": 2021,
  "registration_plates": "BG 456-CD",
  "transmission": "manual",
  "fuel_type": "petrol",
  "engine_power": "500cc"
}
Biciklbilling_mode: "hourly"

Polja u details

PoljeTip
bike_typestring
frame_sizestring
speedsnumber
manufacture_yearnumber

Amenities IDs

helmetlockelectricbasket

Primjer details objekta

{
  "bike_type": "ebike",
  "frame_size": "M / 48cm",
  "speeds": 9,
  "manufacture_year": 2023
}
Plovilobilling_mode: "hourly"

Polja u details

PoljeTip
brand_modelstring
manufacture_yearnumber
registration_platesstring
seatsnumber
engine_powerstring
fuel_typestring

Amenities IDs

life_jacketgpsinsurancefishing

Primjer details objekta

{
  "brand_model": "Fiart Mare 28",
  "manufacture_year": 2020,
  "registration_plates": "RS-4521",
  "seats": 6,
  "engine_power": "150 KS",
  "fuel_type": "petrol"
}
Autobilling_mode: "daily"

Polja u details

PoljeTip
brand_modelstring
manufacture_yearnumber
registration_platesstring
seatsnumber
transmissionstring
fuel_typestring
engine_powerstring

Amenities IDs

automaticinsurancegpschild_seat

Primjer details objekta

{
  "seats": 5,
  "brand_model": "VW Golf 8",
  "manufacture_year": 2023,
  "registration_plates": "BG 789-EF",
  "transmission": "automatic",
  "fuel_type": "petrol",
  "engine_power": "130 KS"
}

Oprema

Bazenbilling_mode: "hourly"

Polja u details

PoljeTip
capacitynumber
dimensionsstring
water_temperaturenumber

Amenities IDs

heatingindoorchanging_roomtowels

Primjer details objekta

{
  "capacity": 20,
  "dimensions": "25×10×1.8m",
  "water_temperature": 28
}
Šatorbilling_mode: "daily"

Polja u details

PoljeTip
capacitynumber
dimensionsstring
equipmentstring

Amenities IDs

installationoutdoorpowertables_chairs

Primjer details objekta

{
  "capacity": 100,
  "dimensions": "10×20m",
  "equipment": "Stolice, stolovi, LED rasvjeta, pozornica"
}
Ostalobilling_mode: "daily"

Polja u details

PoljeTip
capacitynumber
dimensionsstring
equipmentstring

Amenities IDs

installationindoorpower

Primjer details objekta

{
  "capacity": 50,
  "dimensions": "200m²",
  "equipment": "Projektor, platno, PA sistem"
}

Polja u details su opciona — vraćaju se samo ako je vlasnik popunio te podatke u dashboardu. Uvijek provjerite da li je vrijednost null prije upotrebe.

Implementacija u Kodu

Preuzmite kompletne i testirane kodne primere za vašu platformu.

// 1. Dobijanje smeštajnih jedinica i zauzetih termina
const fetchUnits = async () => {
  const response = await fetch('https://gost365.app/api/v1/units', {
    method: 'GET',
    headers: {
      'x-api-key': 'gost365_live_vaš_api_ključ_ovde',
      'Content-Type': 'application/json'
    }
  });

  if (!response.ok) {
    throw new Error('Greška pri učitavanju: ' + response.statusText);
  }

  const result = await response.json();
  console.log(result.data); // Niz apartmana
};
// 2. Slanje novog upita za rezervaciju sa sajta
const createBooking = async (bookingData) => {
  const response = await fetch('https://gost365.app/api/v1/bookings', {
    method: 'POST',
    headers: {
      'x-api-key': 'gost365_live_vaš_api_ključ_ovde',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      unit_id: "8f7e6d5c-4b3a-2a19-0e9d-8c7b6a5f4e3d", // UUID apartmana
      start_date: "2026-07-01",
      end_date: "2026-07-08",
      guest_name: "Jovan Jovanović",
      guest_email: "jovan.jovanovic@email.com",
      guest_phone: "+381641234567", // opciono
      adults_count: 2, // opciono, podrazumevano 1
      children_count: 1, // opciono, podrazumevano 0
      infants_count: 0, // opciono, podrazumevano 0
      notes: "Molimo za tihu sobu i krevetac za bebu." // opciono
    })
  });

  if (response.status === 409) {
    alert('Izabrani datumi su već zauzeti (Overbooking zaštita).');
    return;
  }

  if (!response.ok) {
    const errorData = await response.json();
    throw new Error(errorData.error || 'Neuspešno slanje rezervacije');
  }

  const result = await response.json();
  console.log('Uspešno kreirano! ID rezervacije:', result.booking_id);
};