> ## Documentation Index
> Fetch the complete documentation index at: https://api.housera.ro/llms.txt
> Use this file to discover all available pages before exploring further.

# Moderarea și stările anunțului

> Ce se întâmplă cu un anunț după ce îl trimiți, ce poți schimba prin API și cum afli rezultatul.

Pe Housera, fiecare anunț nou e verificat de un om înainte să apară în căutare. Prin API nu există o scurtătură: anunțul pe care îl creezi intră în moderare, exact ca unul adăugat din formular.

## Stările

Câmpul `status` al unui anunț are una din valorile de mai jos.

| Stare | Ce înseamnă | Apare în căutare |
| - | - | - |
| `draft` | Ciornă începută în portal și netrimisă. Prin API nu se creează ciorne. | Nu |
| `pending` | Trimis, așteaptă moderarea. | Nu |
| `active` | Aprobat și publicat. | Da |
| `rejected` | Respins de moderare, cu un motiv. Îl poți corecta și retrimite. | Nu |
| `paused` | Pus pe pauză de tine. Îl reactivezi oricând, fără moderare nouă. | Nu |
| `unconfirmed` | Scos din căutare pentru că nu ai confirmat la timp că proprietatea e încă disponibilă. Confirmarea se face din cont. | Nu |
| `hidden` | Ascuns de moderare. | Nu |
| `sold` | Vândut sau închiriat. Pagina anunțului rămâne accesibilă, dar anunțul nu mai apare în căutare. | Nu |

## Ce se moderează

**Un anunț nou.** `POST /listings` și `PUT /listings/ref/{ref}` cu un id nou creează anunțul cu starea `pending`. După aprobare devine `active`; dacă e respins, devine `rejected`.

**O editare pe un anunț publicat.** Când editezi un anunț `active` (sau `paused`, `unconfirmed`), versiunea publică rămâne neschimbată, iar editarea ta așteaptă aprobarea:

* primești `202 Accepted` în loc de `200`;
* `moderation.edit_pending` devine `true`;
* după aprobare, editarea se aplică pe anunț și `edit_pending` revine la `false`;
* dacă editarea e respinsă, anunțul rămâne cu versiunea veche, `edit_pending` revine la `false`, iar motivul apare în `moderation.rejection_reason`.

Pozele trimise pentru un anunț publicat urmează același drum: se alătură editării care așteaptă moderarea.

**Ce nu se moderează.** Un anunț încă nepublicat (`pending`) se modifică direct și rămâne în coada de moderare. Pauza, reactivarea și marcarea ca vândut nu trec prin moderare.

## Tranzițiile prin API

| Acțiune | Endpoint | Din starea | În starea |
| - | - | - | - |
| Creare | `POST /listings` | – | `pending` |
| Editare | `PATCH /listings/{code}` | `pending` | rămâne `pending` |
| Retrimitere | `PATCH /listings/{code}` | `rejected`, `draft` | `pending` |
| Editare cu moderare | `PATCH /listings/{code}` | `active`, `paused`, `unconfirmed` | aceeași stare, cu `edit_pending: true` |
| Pauză | `POST /listings/{code}/pause` | `active` | `paused` |
| Reactivare | `POST /listings/{code}/resume` | `paused` | `active` |
| Vândut sau închiriat | `POST /listings/{code}/sold` | `active`, `paused` | `sold` |
| Ștergere | `DELETE /listings/{code}` | `draft`, `rejected`, `paused`, `unconfirmed` | șters (`204`) |

Câteva reguli de reținut:

* **Starea greșită înseamnă `404`.** De exemplu, `POST /listings/{code}/resume` pe un anunț `active` sau `DELETE` pe un anunț `active`. Un anunț activ îl pui întâi pe pauză, apoi îl ștergi.
* **Un refuz cu motiv înseamnă `409 listing_action_refused`.** De exemplu, un anunț cu raportări deschise nu se poate șterge până când raportările sunt închise. Motivul e în `detail`.
* **Un anunț `hidden` sau `sold` nu se mai editează.**
* **O retrimitere fără nicio schimbare e refuzată** (`422`): un anunț respins, trimis înapoi identic, ar fi respins din nou pentru același motiv.
* **Marcarea ca vândut renunță la editarea** care aștepta moderarea, dacă exista una.

## Respingerea

Un anunț respins are în `moderation`:

```json theme={null}
{
  "moderation": {
    "edit_pending": false,
    "rejection_reason": "Pozele nu corespund proprietății. Te rugăm să încarci fotografii ale apartamentului.",
    "rejection_codes": ["photos"]
  }
}
```

`rejection_reason` e textul pentru oameni. `rejection_codes` sunt coduri stabile, pe care le poți folosi în sistemul tău:

| Cod | Motiv |
| - | - |
| `photos` | Pozele nu corespund proprietății. |
| `content` | Titlul sau descrierea nu au conținut real. |
| `contact_in_text` | Date de contact în titlu sau în descriere. |
| `price` | Preț nerealist. |
| `fake` | Suspiciune de anunț fals. |

Lista poate fi goală când moderatorul a scris doar un motiv liber. Ca să retrimiți anunțul, îl corectezi cu `PATCH /listings/{code}`: anunțul revine în `pending`.

## Cum afli rezultatul

Ai trei căi, de la cea mai bună la cea mai simplă:

<CardGroup cols={3}>
  <Card title="Webhook-uri" icon="bell" href="/ro/webhooks">
    Primești pe loc `listing.published`, `listing.rejected` și celelalte evenimente.
  </Card>

  <Card title="Evenimente" icon="clock-rotate-left" href="/ro/webhooks#recuperarea-evenimentelor">
    `GET /events?after=` îți dă tot ce s-a întâmplat din ultimele 35 de zile.
  </Card>

  <Card title="Citire directă" icon="magnifying-glass">
    `GET /account/listings/{code}` îți arată `status` și `moderation` în orice moment.
  </Card>
</CardGroup>

Evenimentele care corespund schimbărilor de stare:

| Schimbare | Eveniment |
| - | - |
| Anunțul devine `active` după moderare | `listing.published` |
| Anunțul e respins | `listing.rejected` (cu `reason` și `rejection_codes`) |
| Anunțul e pus pe pauză | `listing.paused` |
| Anunțul revine din pauză | `listing.reactivated` |
| Anunțul e marcat vândut sau închiriat | `listing.sold` |
| Anunțul e ascuns de moderare | `listing.withdrawn` cu `by: "moderation"` |
| Anunțul e șters | `listing.withdrawn` cu `by: "owner"` |

<Note>
  Rezultatul moderării unei **editări** pe un anunț deja publicat nu schimbă starea anunțului, deci nu produce un eveniment de stare. Îl afli citind anunțul: `moderation.edit_pending` redevine `false`, iar o respingere apare în `moderation.rejection_reason`. Un CRM care trimite editări pe anunțuri active verifică periodic anunțurile cu `edit_pending: true`.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.