Dacă ai un catalog propriu (o agenție imobiliară, un CRM) și vrei să publici anunțuri fără să le introduci manual, poți folosi API-ul public al Listara, o platformă românească de anunțuri. Mai jos parcurgem cu curl și JSON tot fluxul: token, câmpuri dinamice, creare, verificarea rezultatului, actualizare. Endpointurile și câmpurile sunt cele din documentația publică.
Ce ai nevoie
- un cont cu acces API (dacă rolul contului nu îl permite, primești 403);
- un token Bearer creat din contul tău, la secțiunea Acces API;
-
curlșijq.
export API="https://listara.ro/api/v1" export LISTARA_TOKEN="tokenul-tau-din-acces-api" Cererile protejate cer headerele Authorization: Bearer {token}, Content-Type: application/json și Accept: application/json. Fără ultimul, unele endpointuri pot răspunde cu redirect în loc de 401 JSON.
Reguli de la început
-
POST /listingsacceptăcategory_id1 (Anunțuri), 2 (Imobiliare), 3 (Locuri de muncă) sau 5 (Licitații). Valoarea 4 (Magazin) este respinsă: produsele au endpoint separat,POST /products. -
subcategory_idșichild_category_idtrebuie să aparțină categoriei alese. - La categoria 1,
purposeeste obligatoriu (sell,buy,service_offer,service_seek); la joburi,hiringsauseeking; la imobiliare și licitații se omite.
Pasul 1: citește câmpurile categoriei
Endpointul este public. Exemplu pentru Imobiliare → De vânzare → Apartament:
curl -s "$API/categories/2/fields?child_category_id=24" -H "Accept: application/json" Răspunsul (scurtat) arată cheile din attributes:
{ "data": { "category_id": 2, "sub_category_id": 6, "child_category_id": 24, "child_category": { "id": 24, "name": "Apartament" }, "fields": [ { "key": "etaj", "type": "number", "required": false }, { "key": "an_constructie", "type": "number", "required": false }, { "key": "camere", "type": "number", "required": false }, { "key": "bai", "type": "number", "required": false }, { "key": "suprafata_utila", "type": "number", "required": false } ] } } La alte subcategorii există câmpuri obligatorii (la Autoturisme, de exemplu, marca, model, an_fabricatie, kilometraj), iar la câmpurile select trimiți value din options. Verifică endpointul înainte să construiești payload-ul.
Pasul 2: creează anunțul
Fișierul apartament.json:
{ "category_id": 2, "subcategory_id": 6, "child_category_id": 24, "title": "Apartament 3 camere Florești", "description": "<p>Apartament luminos, finisat modern.</p>", "price": 95000, "price_currency_code": "EUR", "price_type": "fixed", "reference": "APT-0001", "location": { "judet": "Cluj", "oras": "Florești", "adresa": "Str. Eroilor 5" }, "attributes": { "camere": "3", "bai": "2", "suprafata_utila": "72" }, "images": ["https://example.com/apartament-living.jpg"] } description este HTML cu text vizibil; price_type poate fi fixed, negotiable sau standard; price_currency_code (RON sau EUR) este opțional, implicit RON; images sunt URL-uri HTTPS publice (maximum 20), obligatorii la creare; reference este un identificator al tău, returnat pentru mapare.
curl -s -X POST "$API/listings" \ -H "Authorization: Bearer $LISTARA_TOKEN" \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d @apartament.json Răspunsul este HTTP 202 Accepted: anunțul intră într-o coadă de procesare.
{ "message": "Listing creation queued successfully.", "data": { "job_id": "00000000-0000-4000-8000-000000000001", "status": "pending", "listing_id": null, "error": null } } Pasul 3: urmărește jobul
GET /listing-jobs/{job_id} până când status devine completed (cu listing_id) sau failed (cu error):
JOB_ID=$(curl -s -X POST "$API/listings" \ -H "Authorization: Bearer $LISTARA_TOKEN" \ -H "Content-Type: application/json" -H "Accept: application/json" \ -d @apartament.json | jq -r '.data.job_id') until [ "$STATUS" = "completed" ] || [ "$STATUS" = "failed" ]; do sleep 5 R=$(curl -s "$API/listing-jobs/$JOB_ID" \ -H "Authorization: Bearer $LISTARA_TOKEN" -H "Accept: application/json") STATUS=$(echo "$R" | jq -r '.data.status') echo "status: $STATUS" done echo "$R" | jq '.data | {status, listing_id, error}' Pasul 4: actualizează anunțul
Cu listing_id din pasul anterior:
curl -s -X PUT "$API/listings/1234" \ -H "Authorization: Bearer $LISTARA_TOKEN" \ -H "Content-Type: application/json" -H "Accept: application/json" \ -d '{ "title": "Apartament 3 camere Florești, preț actualizat", "price": 92000, "price_type": "negotiable", "location": { "judet": "Cluj", "oras": "Florești", "adresa": "Str. Eroilor 5" }, "attributes": { "suprafata_utila": "72" } }' La actualizare, images este opțional.
Erori și limite
- 401: token lipsă sau invalid. 403: rolul nu are acces API. 422: validare eșuată (câmpuri obligatorii, imagini, taxonomie nepotrivită).
- Maximum 150 de joburi în așteptare per cont; global, aproximativ 60 de joburi procesate pe minut.
- Pentru volum mare:
POST /listings/bulk(până la 100 de anunțuri pe request) sau import CSV/JSON, până la 5.000 de anunțuri pe fișier. Detaliile sunt în documentație.
Fluxul e același la orice categorie: alegi taxonomia, citești câmpurile, trimiți POST, urmărești jobul.
Notă de transparență: lucrez la Listara.ro, platforma al cărei API este folosit aici. Pentru modificări, consultă documentația oficială.

