BDBOX API

API v1 dokumentacija

Stabilan JSON interfejs za mobilnu aplikaciju, javne podatke i buduce integracije.

Status

Pregled

Ova dokumentacija pokriva BDBOX API v1: provjeru statusa, autentifikaciju, profil trenutnog korisnika, kategorije, oglase, poruke, gradove/lokacije i podatke iz modula Analize.

Base URL https://www.bijeljina.org/bdbox/api/v1

Standardizovani OpenAPI opis postojećeg API-ja dostupan je na /bdbox/api/v1/openapi.yaml.

Svi API odgovori koriste JSON format sa success, data ili error i meta.request_id.

Autentifikacija

Server integracije koriste Bearer token. Za izdavanje API tokena javite se administraciji preko stranice /bdbox/kontakt. Mobilna aplikacija koristi korisnički access token dobijen kroz login endpoint. Oba se salju kroz isti HTTP header:

Authorization: Bearer bdbox_test_xxxxxxxxx

Token se cuva bezbjedno i ne treba ga objavljivati u kodu koji je javno dostupan, logovima ili screenshot-ovima.

Token mozete provjeriti pozivom GET /api/v1/auth-test. Ako je token ispravan i ima dozvolu public:read, endpoint vraca osnovne podatke o API klijentu.

curl -i -H 'Authorization: Bearer TOKEN' \
  https://www.bijeljina.org/bdbox/api/v1/auth-test

Idempotency-Key

Idempotency-Key je nasumican jedinstven string koji klijent sam generise za jedan pokusaj upisa. Koristi se za POST akcije gdje retry ne smije napraviti duplikat: kreiranje oglasa, upload/rotaciju slika, renew oglasa i slanje poruke.

Pravila: 16-128 ASCII znakova, novi key za svaku novu akciju, isti key ponoviti samo kada ponavljate isti zahtjev nakon timeout-a ili greske mreze. Isti key i isti payload vracaju raniji rezultat; isti key sa drugim payloadom vraca 409 idempotency_conflict.

Primjeri dobrih vrijednosti:

550e8400-e29b-41d4-a716-446655440000
msg_20260625_103000_8f3a2c9d7b1e4a90
client123-01j1x8r6k8p9s2v3a4b5c6d7e8

Generisanje u JavaScript-u:

const idempotencyKey = crypto.randomUUID();

Generisanje u PHP-u:

$idempotencyKey = bin2hex(random_bytes(16));

Greške

Greške uvijek imaju success=false, stabilan error.code i meta.request_id koji treba poslati administraciji ako se problem prijavljuje.

{
  "success": false,
  "error": {
    "code": "missing_token",
    "message": "Nedostaje Bearer token."
  },
  "meta": {
    "request_id": "req_20260617_...",
    "api_version": "v1"
  }
}
{
  "success": false,
  "error": {
    "code": "validation_error",
    "message": "Podaci oglasa nisu validni.",
    "details": {
      "fields": {
        "title": "Naslov je obavezan.",
        "category_id": "Kategorija nije pronadjena.",
        "custom_fields.51": "Polje je obavezno."
      }
    }
  },
  "meta": {
    "request_id": "req_...",
    "api_version": "v1"
  }
}
{
  "success": false,
  "error": {
    "code": "idempotency_conflict",
    "message": "Idempotency-Key je vec koristen za drugi zahtjev."
  },
  "meta": {
    "request_id": "req_...",
    "api_version": "v1"
  }
}
{
  "success": false,
  "error": {
    "code": "rate_limit_exceeded",
    "message": "API rate limit po minuti je prekoracen."
  },
  "meta": {
    "request_id": "req_...",
    "api_version": "v1"
  }
}
{
  "success": false,
  "error": {
    "code": "phone_verification_required",
    "message": "Potrebno je da verifikujete broj telefona da bi mogli slati poruke."
  },
  "meta": {
    "request_id": "req_...",
    "api_version": "v1"
  }
}

Ograničenja

Osnovni rate limit se racuna po API klijentu kroz api_request_logs. Ako klijent nema posebno podesena ogranicenja, koriste se globalni default limiti.

Limit Default Napomena
API zahtjevi po minuti 120 Po API klijentu.
API zahtjevi po danu 5000 Po API klijentu.
Kreiranje oglasa 10/h Najviše 10 create zahtjeva po korisniku u jednom satu.

User login dodatno koristi throttle po IP adresi, identifikatoru i njihovoj kombinaciji. Nakon previse neuspjelih pokusaja vraca 429 login_rate_limited.

API za postavljanje oglasa

Ovaj dio je namijenjen korisnicima koji zele kroz API dodavati i administrirati svoje BDBOX oglase. Za ovu vrstu integracije koristi se Bearer token vezan za korisnički nalog.

Potrebne dozvole

  • public:read za kategorije i lokacije,
  • listings:read_own za vlastite oglase,
  • listings:write za kreiranje, izmjenu, slike i obnovu oglasa,
  • listings:delete za završavanje i brisanje oglasa.

listings:auto_approve je posebna dozvola za provjerene server klijente i dodjeljuje je isključivo BDBOX administracija.

Ključna pravila

  • Standardno kreiranje kroz API šalje oglas na pregled prije javnog prikaza.
  • Jedan API oglas ima jednu krajnju kategoriju.
  • external_id je trajni ID iz sistema integratora.
  • Idempotency-Key se generise za svaki POST koji se moze retry-ovati.

Kompletan tok

  1. Korisnik se javi administraciji za izdavanje API tokena i potrebnih dozvola.
  2. Integracija ucita dostupne kategorije i polja: GET /categories/{id}/custom-fields.
  3. Integracija kreira oglas sa svojim external_id i Idempotency-Key.
  4. Integracija po potrebi uploaduje glavnu i galerijske slike.
  5. Kasnije oglas mijenja po BDBOX ID-u ili po external_id.
  6. Oglas se moze obnoviti, završiti ili obrisati kroz posebne endpoint-e.

Preporučeni redoslijed integracije je: polja kategorije → kreiranje oglasa → glavna slika → galerijske slike → izmjena, obnova ili brisanje po potrebi.

Kreiranje oglasa

Primjer kreira oglas koji ide na pregled prije javnog prikaza. Prije slanja treba provjeriti kategorije, lokacije i obavezna polja kategorije.

Korisnik API-ja ne moze sam poslati status=approved. Standardni API token kreira pending oglas. Provjereni server klijent kome BDBOX administracija ručno dodijeli listings:auto_approve dobija direktan approved create i zadržava approved status poslije izmjena i uploada slika.

curl -i -X POST \
  -H 'Authorization: Bearer TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000' \
  --data @listing.json \
  https://www.bijeljina.org/bdbox/api/v1/listings
<?php
$token = 'TOKEN';
$payload = [
    'external_id' => 'erp-listing-1001',
    'title' => 'Prodajem stan u Bijeljini',
    'short_description' => 'Dvosoban stan u centru',
    'description' => 'Detaljan opis oglasa',
    'category_id' => 189,
    'city_id' => 108401,
    'price_info' => ['type' => 'fixed', 'amount' => 150000],
    'contact' => ['phone' => '065 123 456'],
    'custom_fields' => [
        '51' => '58',
        '53' => 'Novogradnja',
    ],
];

$ch = curl_init('https://www.bijeljina.org/bdbox/api/v1/listings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $token,
        'Content-Type: application/json',
        'Idempotency-Key: ' . bin2hex(random_bytes(16)),
    ],
    CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
]);

$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
import requests
import uuid

token = "TOKEN"
payload = {
    "external_id": "erp-listing-1001",
    "title": "Prodajem stan u Bijeljini",
    "short_description": "Dvosoban stan u centru",
    "description": "Detaljan opis oglasa",
    "category_id": 189,
    "city_id": 108401,
    "price_info": {"type": "fixed", "amount": 150000},
    "contact": {"phone": "065 123 456"},
    "custom_fields": {
        "51": "58",
        "53": "Novogradnja"
    }
}

response = requests.post(
    "https://www.bijeljina.org/bdbox/api/v1/listings",
    headers={
        "Authorization": f"Bearer {token}",
        "Content-Type": "application/json",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json=payload,
)
print(response.status_code, response.json())
Polje Status Opis
external_id required za server klijente Stabilan ID oglasa u sistemu integratora. Mora ostati isti za kasnije izmjene.
title required Naslov oglasa.
short_description required Kratak opis/prikaz u listama.
description optional Detaljan tekst oglasa, do 20000 karaktera.
category_id required ID krajnje kategorije. Provjeriti kroz kategorije i polja kategorije.
city_id required ID grada iz lokacija.
price_info required type je fixed, negotiable ili no_price. Kod fixed poslati i amount.
contact.phone recommended Kontakt telefon za oglas.
location optional Adresa, poštanski broj i opcione koordinate.
custom_fields zavisi od kategorije Ključevi su ID-jevi polja iz custom_fields[].id. Vrijednosti su tekstualne kanonske vrijednosti iz allowed_values, ne ID-jevi opcija.

custom_fields je JSON objekat. Ključevi mogu biti poslani kao stringovi, npr. "51", jer JSON objekti prirodno koriste string ključeve. Za checkbox se šalje niz tekstualnih vrijednosti, a za select, radio, number, decimal, text, url i time jedna vrijednost.

Ako je allowed_values prazan niz, vrijednost ne birate iz liste nego šaljete vrijednost odgovarajućeg tipa. Za number i decimal prihvata se JSON broj ili string, npr. "51": "58" ili "51": 58. Vrijednost se u sistemu čuva kao tekst, ali se validira kao broj.

Za select i radio šalje se tačan string iz allowed_values, npr. "Gorivo": "Dizel" u konceptu, odnosno stvarno "29": "Dizel" ako je ID polja 29. Ako se nazivi opcija u sistemu promijene, integracija treba ponovo pročitati GET /categories/{id}/custom-fields i koristiti nove kanonske vrijednosti.

{
  "external_id": "erp-listing-1001",
  "title": "Prodajem stan u Bijeljini",
  "short_description": "Dvosoban stan u centru",
  "description": "Detaljan opis oglasa sa svim bitnim informacijama.",
  "category_id": 189,
  "city_id": 108401,
  "price_info": {
    "type": "fixed",
    "amount": 150000
  },
  "location": {
    "address": "Centar",
    "postal_code": "76300",
    "lat": 44.7587,
    "lng": 19.2144
  },
  "contact": {
    "phone": "065 123 456",
    "whatsapp_country_code": "387",
    "whatsapp_area_code": "65",
    "whatsapp_phone": "123456"
  },
  "custom_fields": {
    "51": "58",
    "53": "Novogradnja",
    "55": "Namješteno",
    "56": ["Balkon", "Lift"]
  }
}
{
  "success": true,
  "data": {
    "id": 18009,
    "external_id": "erp-listing-1001",
    "status": "pending",
    "title": "Prodajem stan u Bijeljini",
    "currency": "BAM"
  },
  "meta": {
    "request_id": "req_...",
    "api_version": "v1",
    "idempotent_replay": false
  }
}

Izmjena oglasa

PATCH se koristi za dozvoljena tekstualna, cjenovna, lokacijska, kontakt i dodatna polja. Kategorija, status, slug, vlasnik, slike i external_id se ne mijenjaju kroz PATCH.

curl -i -X PATCH \
  -H 'Authorization: Bearer TOKEN' \
  -H 'Content-Type: application/json' \
  --data '{"price_info":{"type":"fixed","amount":155000}}' \
  https://www.bijeljina.org/bdbox/api/v1/listings/by-external-id/erp-listing-1001
<?php
$token = 'TOKEN';
$externalId = rawurlencode('erp-listing-1001');
$payload = ['price_info' => ['type' => 'fixed', 'amount' => 155000]];

$ch = curl_init("https://www.bijeljina.org/bdbox/api/v1/listings/by-external-id/{$externalId}");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $token,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
]);
$response = curl_exec($ch);
import requests

response = requests.patch(
    "https://www.bijeljina.org/bdbox/api/v1/listings/by-external-id/erp-listing-1001",
    headers={"Authorization": "Bearer TOKEN"},
    json={"price_info": {"type": "fixed", "amount": 155000}},
)
print(response.status_code, response.json())
{
  "success": true,
  "data": {
    "id": 18009,
    "status": "pending",
    "price_info": {
      "amount": 155000,
      "currency": "BAM",
      "type": "fixed"
    }
  },
  "meta": {
    "request_id": "req_...",
    "api_version": "v1"
  }
}

Slike

Slike se salju odvojeno od create zahtjeva kao multipart/form-data. Main slika i galerijske slike imaju zasebne endpoint-e. Dozvoljeni su JPEG i PNG fajlovi do 10 MiB i 40 MP.

Tačan form-key za upload je image. Ne koristiti file, picture ili naziv originalnog fajla kao ključ.

Gallery endpoint prima jednu sliku po zahtjevu. Za više galerijskih slika pošaljite više HTTP zahtjeva u petlji. Svaka slika mora imati svoj novi Idempotency-Key; isti key ponovite samo za retry iste slike i istog zahtjeva.

curl -i -X POST \
  -H 'Authorization: Bearer TOKEN' \
  -H 'Idempotency-Key: 550e8400-e29b-41d4-a716-446655440001' \
  -F '[email protected]' \
  https://www.bijeljina.org/bdbox/api/v1/listings/18009/main-image
curl -i -X POST \
  -H 'Authorization: Bearer TOKEN' \
  -H 'Idempotency-Key: 550e8400-e29b-41d4-a716-446655440002' \
  -F '[email protected]' \
  https://www.bijeljina.org/bdbox/api/v1/listings/18009/images
curl -i -X POST \
  -H 'Authorization: Bearer TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 550e8400-e29b-41d4-a716-446655440003' \
  --data '{"degrees":90}' \
  https://www.bijeljina.org/bdbox/api/v1/listings/18009/main-image/rotate
{
  "success": true,
  "data": {
    "image_key": "78d439902b86060324faa5d847a125fe.jpg",
    "url": "https://www.bijeljina.org/bdbox/pictures/main-pic/78/78d439902b86060324faa5d847a125fe.jpg",
    "original_url": "https://www.bijeljina.org/bdbox/pictures/main-pic-original/78/78d439902b86060324faa5d847a125fe.jpg"
  },
  "meta": {
    "request_id": "req_...",
    "api_version": "v1",
    "idempotent_replay": false
  }
}

Upravljanje oglasom

Status akcije su odvojene od PATCH-a. Delete briše oglas iz korisničkog i javnog prikaza. Complete označava oglas kao završen. Renew obnavlja samo aktivan oglas i troši dnevni brojač besplatnih obnova.

curl -i -X POST -H 'Authorization: Bearer TOKEN' \
  https://www.bijeljina.org/bdbox/api/v1/listings/18009/deactivate
curl -i -X POST -H 'Authorization: Bearer TOKEN' \
  https://www.bijeljina.org/bdbox/api/v1/listings/18009/complete
curl -i -X POST -H 'Authorization: Bearer TOKEN' \
  -H 'Idempotency-Key: 550e8400-e29b-41d4-a716-446655440004' \
  https://www.bijeljina.org/bdbox/api/v1/listings/18009/renew
curl -i -X DELETE -H 'Authorization: Bearer TOKEN' \
  https://www.bijeljina.org/bdbox/api/v1/listings/18009

GET /api/v1/auth-test

Autentifikacija: Bearer token sa public:read scope-om.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  https://www.bijeljina.org/bdbox/api/v1/auth-test

POST /api/v1/auth/login

Autentifikacija: nije potreban Bearer token. Obavezni su Content-Type: application/json i javni X-BDBOX-Client identifikator first-party aplikacije.

Podrzava email ili korisnicko ime. Vraca access token koji traje 15 minuta i refresh token koji traje 30 dana. Raw tokeni se prikazuju samo u login odgovoru.

Nepoznat nalog, pogresna lozinka i neaktivan nalog vracaju isti 401 invalid_credentials odgovor.

curl -i -X POST \
  -H 'Content-Type: application/json' \
  -H 'X-BDBOX-Client: bdbox-mobile-test' \
  --data '{"identifier":"USERNAME_OR_EMAIL","password":"PASSWORD","device":{"name":"Test device","platform":"web","id":"test-installation"}}' \
  https://www.bijeljina.org/bdbox/api/v1/auth/login

POST /api/v1/auth/refresh

Autentifikacija: refresh token u JSON body-ju. Obavezni su Content-Type: application/json i isti X-BDBOX-Client koji je korišten za login.

Uspješan refresh atomski rotira access i refresh token. Stari tokeni odmah prestaju raditi. Originalni 30-dnevni refresh rok se ne produžava.

curl -i -X POST \
  -H 'Content-Type: application/json' \
  -H 'X-BDBOX-Client: bdbox-mobile-test' \
  --data '{"refresh_token":"REFRESH_TOKEN"}' \
  https://www.bijeljina.org/bdbox/api/v1/auth/refresh

POST /api/v1/auth/logout

Autentifikacija: user access Bearer token. API client server token ne može se koristiti za ovaj endpoint.

Opoziva samo trenutnu user sesiju/uređaj. Ponovljeni logout iste sesije vraća uspješan odgovor.

curl -i -X POST \
  -H 'Authorization: Bearer USER_ACCESS_TOKEN' \
  https://www.bijeljina.org/bdbox/api/v1/auth/logout

GET /api/v1/me

Autentifikacija: user access Bearer token sa me:read scope-om. Standardni API client token nije dovoljan.

Vraca minimalan skup javnih polja trenutno prijavljenog korisnika: id, username, display_name, store_name i profile_image_url. Email, password hash i interna polja se ne izlažu.

curl -i -H 'Authorization: Bearer USER_ACCESS_TOKEN' \
  https://www.bijeljina.org/bdbox/api/v1/me

GET /api/v1/me/listings

Autentifikacija: Bearer token sa listings:read_own scope-om i autentifikovanim korisnikom. Podrzani su user access token i server API client vezan za korisnika.

Vraca paginiranu listu oglasa autentifikovanog vlasnika, ukljucujuci approved, pending, completed i trashed oglase. user_id se ne salje kao parametar.

Query parametri: page, per_page (maksimalno 50), status, category_id, q i sort. Statusi: approved, pending, completed, trashed. Paginacija je u meta.total, meta.page, meta.per_page i meta.total_pages.

curl -i -H 'Authorization: Bearer USER_ACCESS_TOKEN' \
  'https://www.bijeljina.org/bdbox/api/v1/me/listings?per_page=20'

GET /api/v1/me/listings/{id}

Autentifikacija: isti ownership auth i listings:read_own scope.

Vraca detalj samo ako oglas pripada autentifikovanom korisniku. Nepostojeci i tudji oglas vracaju isti 404 not_found. Odgovor ne sadrzi kontakt, IP, payment, plan ili sirovi userid.

curl -i -H 'Authorization: Bearer USER_ACCESS_TOKEN' \
  https://www.bijeljina.org/bdbox/api/v1/me/listings/123

GET /api/v1/me/conversations

Autentifikacija: user access token ili server API client vezan za korisnika, sa messages:read scope-om.

Vraca paginiranu listu privatnih razgovora trenutnog korisnika. Odgovor sadrzi sagovornika, zadnju poruku, broj neprocitanih markera i ukupan broj poruka u razgovoru. Ne vraca email, telefon, IP ili sirove korisnicke redove.

Query parametri: page i per_page (maksimalno 50). Uspješan odgovor vraća paginaciju u meta.total, meta.page, meta.per_page i meta.total_pages.

curl -i -H 'Authorization: Bearer USER_OR_SERVER_TOKEN' \
  'https://www.bijeljina.org/bdbox/api/v1/me/conversations?per_page=20'

GET /api/v1/me/conversations/{partner_id}/messages

Autentifikacija: user access token ili server API client vezan za korisnika, sa messages:read scope-om.

Vraca poruke razgovora samo ako je trenutni korisnik posiljalac ili primalac. Odgovor je sortiran order=desc po ID-u i koristi next_before_id za ucitavanje starijih poruka.

Query parametri: limit (maksimalno 50) i before_id.

curl -i -H 'Authorization: Bearer USER_OR_SERVER_TOKEN' \
  'https://www.bijeljina.org/bdbox/api/v1/me/conversations/123/messages?limit=20'

POST /api/v1/me/conversations/{partner_id}/read

Autentifikacija: user access token ili server API client vezan za korisnika, sa messages:write scope-om.

Oznacava razgovor procitanim brisanjem unread markera iz messages_procitane. Akcija je idempotentna. Ne mijenja poruke i ne zahtijeva verifikovan telefon.

curl -i -X POST \
  -H 'Authorization: Bearer USER_OR_SERVER_TOKEN' \
  https://www.bijeljina.org/bdbox/api/v1/me/conversations/123/read

POST /api/v1/me/conversations/{partner_id}/messages

Autentifikacija: user access token ili server API client vezan za korisnika, sa messages:write scope-om.

Salje privatnu poruku sagovorniku. Trenutni korisnik mora imati verifikovan telefon (phone_status=1). Ako nema, endpoint vraca 403 phone_verification_required.

Obavezan header: Idempotency-Key sa 16-128 ASCII znakova. Replay istog zahtjeva vraca isti message ID bez duplikata.

Payload dozvoljava samo body i opcioni context. U ovoj fazi podrzani su context=null i context.type=listing.

{
  "body": "Dobar dan, da li je oglas jos aktivan?",
  "context": {
    "type": "listing",
    "id": 18001
  }
}
curl -i -X POST \
  -H 'Authorization: Bearer USER_OR_SERVER_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000' \
  --data @message.json \
  https://www.bijeljina.org/bdbox/api/v1/me/conversations/123/messages

GET /api/v1/categories

Autentifikacija: Bearer token sa public:read ili listings:read scope-om.

Vraca aktivne javne BDBOX kategorije. Opcioni query parametar: parent_id.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  https://www.bijeljina.org/bdbox/api/v1/categories

GET /api/v1/categories/{id}

Autentifikacija: Bearer token sa public:read ili listings:read scope-om.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  https://www.bijeljina.org/bdbox/api/v1/categories/1

GET /api/v1/categories/{id}/custom-fields

Autentifikacija: Bearer token sa public:read, listings:read ili listings:write scope-om.

Vraca aktivna globalna i kategorijska polja potrebna za formu oglasa. Kategorija mora biti aktivna leaf kategorija dostupna u web formi. Parent ili neaktivna kategorija ne moze se koristiti za unos.

id je ID polja koji se koristi kao ključ u custom_fields objektu. allowed_values sadrzi tekstualne kanonske vrijednosti koje treba poslati u create/update payload-u. Ne salju se ID-jevi opcija. Za checkbox se salje niz tekstualnih vrijednosti, a ostali tipovi koriste jednu vrijednost.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  https://www.bijeljina.org/bdbox/api/v1/categories/189/custom-fields
{
  "success": true,
  "data": {
    "category": {
      "id": 189,
      "name": "Stanovi",
      "slug": "prodaja-stanova",
      "parent_id": 174,
      "writable": true
    },
    "custom_fields": [
      {
        "id": 51,
        "name": "Povrsina",
        "type": "number",
        "required": true,
        "allowed_values": [],
        "tooltip": "",
        "order": 0
      }
    ]
  },
  "meta": {
    "request_id": "req_...",
    "api_version": "v1",
    "total": 1
  }
}

Nepostojeca ili neaktivna kategorija vraca 404 not_found. Aktivna kategorija koja nije dozvoljena za unos vraca 409 category_not_writable.

GET /api/v1/listings

Autentifikacija: Bearer token sa public:read ili listings:read scope-om.

Vraca samo javno vidljive oglase: status=approved i paid=1. Odgovor koristi samo javno dozvoljena polja i ne vraca interne kolone.

Cijene oglasa se u API response-u vracaju sa valutom BAM.

Query parametri: category_id, city_id, q, price_min, price_max, sort, page, per_page. Sljedeća stranica se traži kroz query parametre, npr. ?page=2&per_page=20.

Sort vrijednosti: date_desc, date_asc, price_asc, price_desc. Maksimalni per_page je 50.

Uspješan list response vraća paginaciju u meta.total, meta.page, meta.per_page i meta.total_pages. Filteri koji su primijenjeni vraćaju se u meta.filters.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  'https://www.bijeljina.org/bdbox/api/v1/listings?per_page=5'
curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  'https://www.bijeljina.org/bdbox/api/v1/listings?page=2&per_page=20'

GET /api/v1/listings/{id}

Autentifikacija: Bearer token sa public:read ili listings:read scope-om.

Vraca jedan javno vidljiv oglas po numerickom ID-u. Ako oglas nije aktivan/javan, endpoint vraca 404.

Detail response dodatno vraca description, short_description, price_info, categories, images, custom_fields i javni seller objekat.

currency i price_info.currency su uvijek BAM za oglase.

description je sirovi tekst sacuvan u oglasu, bez HTML renderovanja. Za checkbox i multiselect custom fields, value i display_value su uvijek nizovi.

Oglas bez slika ili custom fields vraca prazne nizove. Kod price_info.type=no_price, i price i price_info.amount su null.

Ne vracaju se interna polja kao userid, paid, plan, credits_uniq_id, contact_email, ip_address ili filesystem putanje slika.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  https://www.bijeljina.org/bdbox/api/v1/listings/123

GET /api/v1/locations/cities

Autentifikacija: Bearer token sa public:read ili listings:read scope-om.

Vraca gradove uz pripadajucu regiju/state. Odgovor koristi samo javno dozvoljena polja.

Query parametri: state_id, q, sort, page, per_page.

Sort vrijednosti: name_asc, id_asc. Maksimalni per_page je 200.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  'https://www.bijeljina.org/bdbox/api/v1/locations/cities?q=bijeljina'

GET /api/v1/locations/cities/{id}

Autentifikacija: Bearer token sa public:read ili listings:read scope-om.

Vraca jedan grad po numerickom city_id.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  https://www.bijeljina.org/bdbox/api/v1/locations/cities/108401

GET /api/v1/analize/series

Autentifikacija: Bearer token sa public:read ili analize:read scope-om.

Vraca aktivne serije iz modula Analize, uz oblast, lokaciju i zadnju aktivnu vrijednost. Odgovor koristi samo javno dozvoljena polja.

Query parametri: oblast_id, lokacija_id, tip_podatka, izvor, q, sort, page, per_page.

Sort vrijednosti: name_asc, id_asc, latest_desc. Maksimalni per_page je 100.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  'https://www.bijeljina.org/bdbox/api/v1/analize/series?per_page=10'

GET /api/v1/analize/series/{id}

Autentifikacija: Bearer token sa public:read ili analize:read scope-om.

Vraca jednu aktivnu seriju po numerickom ID-u. Ako serija, oblast ili lokacija nisu aktivni, endpoint vraca 404.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  https://www.bijeljina.org/bdbox/api/v1/analize/series/1

GET /api/v1/analize/series/{id}/values

Autentifikacija: Bearer token sa public:read ili analize:read scope-om.

Vraca aktivne vrijednosti za jednu seriju, sortirane po measured_at. Polje meta_json se ne vraca kroz javni API.

Query parametri: from, to, order, limit. Datumi mogu biti YYYY-MM-DD ili YYYY-MM-DD HH:MM:SS. Maksimalni limit je 2000.

curl -i -H 'Authorization: Bearer bdbox_test_xxx' \
  'https://www.bijeljina.org/bdbox/api/v1/analize/series/1/values?limit=20&order=desc'

Sljedeće faze

  • Prijava oglasa kroz API.
  • Favoriti i dodatni korisnički podaci za mobilnu aplikaciju.
  • Push notifikacije i napredniji brojači nepročitanih poruka.
  • Dodatni context-i poruka za smještaj i događaje.
  • OpenAPI specifikacija za automatsko generisanje klijenata i testova.