# Prețuri și limite (/ro/docs/resolve/pricing-and-limits)

Cotații fixe de 7 €, 19 € sau 49 € blocate în portofelul în euro și păstrate doar la un fix verificat; trei remedieri gratuite; alimentare la 402; plafoane per utilizator și timeout-uri.

Resolve pune preț pe **rezultat**, nu pe tokeni — **fără fix, fără plată**. Triajul cotează unul din trei praguri fixe; plătești acea sumă dacă — și doar dacă — job-ul se termină `resolved` cu o atestare. Refuzurile, eșecurile și erorile de infrastructură sunt mereu **0 €**, iar primele tale **3 remedieri verificate sunt gratuite**.

## Praguri [#praguri]

| Prag | Preț | Forma tipică |
| --- | --- | --- |
| `t7` | **7 €** | Bug mic, bine delimitat: un fișier, reproducere clară. |
| `t19` | **19 €** | Moderat: mai multe fișiere, are nevoie de investigație. |
| `t49` | **49 €** | Greu dar plauzibil: subtil, transversal. |
| `free` | **0 €** | Primele tale 3 remedieri verificate, indiferent de dificultate. |

Prețurile sunt în **euro**, aceleași 7 € / 19 € / 49 € afișate pe [codai.ro/ro/pricing](https://codai.ro/ro/pricing). Job-urile plătite se blochează în portofelul tău codai preplătit, ținut în EUR. Nu se aplică niciun curs de schimb nicăieri în pipeline.

<Callout type="info">
Câmpurile de bani pe fir sunt întregi în **micro-unități** și își păstrează numele istorice `_micro_usd` pentru stabilitatea API-ului: `quote_micro_usd: 19000000` înseamnă o cotație de 19,00, care blochează **19 €** în portofel.
</Callout>

## Nivelul gratuit [#nivelul-gratuit]

**3 remedieri verificate per utilizator**, peste toate cheile tale. Este revendicat atomic când sosește un job cotabil: job-ul este creat deja `accepted` cu `tier: "free"` și `quote_micro_usd: 0`, iar `free_tier_remaining` îți spune ce rămâne după. Un job gratuit care se termină `failed` sau `error` **își returnează locul**. Odată consumate cele trei, job-urile cotabile revin ca `quoted` și așteaptă acceptul tău.

Job-urile gratuite rulează un singur candidat de fix (greedy); cele plătite se pot ramifica în până la patru — vezi [Cum funcționează](./how-it-works.mdx).

## Cum plătești: o blocare în portofel [#cum-plătești-o-blocare-în-portofel]

<Steps>
<Step>

### Acceptul plasează o blocare [#acceptul-plasează-o-blocare]

`POST /v1/resolve/jobs/{id}/accept` debitează cotația din portofelul tău în aceeași tranzacție care mută job-ul în `accepted`. Dacă debitarea nu se poate face, se anulează și schimbarea de status — nu ai niciodată un job pornit fără fonduri blocate, nici fonduri blocate pentru un job care nu a pornit. Job-urile gratuite sar complet peste acest pas.

</Step>
<Step>

### Fix verificat: blocarea devine plata [#fix-verificat-blocarea-devine-plata]

Când job-ul se rezolvă, worker-ul scrie întâi rândul de atestare și abia apoi înregistrează plata pe baza blocării. Debitarea pur și simplu rămâne în portofel — nu există o a doua plată, nicio taxare de card și nicio linie separată de factură pentru Resolve. Fără atestare, fără plată: ordinea este impusă în cod.

</Step>
<Step>

### Orice altceva: rambursare integrală [#orice-altceva-rambursare-integrală]

Un job care se termină `failed` (niciun fix verificat în buget) sau `error` (infrastructură, inclusiv un worker pierdut și preluat de watchdog) îți returnează întreaga sumă blocată în portofel, ca intrare de rambursare. Rambursările sunt idempotente per job, deci o decontare reîncercată nu te plătește și nu te taxează de două ori.

</Step>
</Steps>

### Sold insuficient: `402` și un link de alimentare [#sold-insuficient-402-și-un-link-de-alimentare]

Dacă portofelul nu acoperă cotația, accept răspunde **`402`**, iar job-ul **rămâne `quoted`** — nu se debitează nimic:

```json
{
  "error": "insufficient_funds",
  "balance": 5000000,
  "required": 19000000,
  "currency": "micro_eur",
  "topup_url": "https://pay.codai.ro/checkout?topup=14"
}
```

`balance` și `required` sunt în **micro-EUR**. `topup_url` deschide checkout-ul pay.codai.ro pentru diferență, rotunjită în sus la euro întregi și încadrată în limitele checkout-ului: **minimum 10 €**, **maximum 1000 €**. Alimentezi, apoi apelezi din nou `/accept` pe același id de job. [Acțiunea GitHub](./github-action.mdx) publică acest link pe issue în locul tău.

Pentru un job `t7`, `402` conține și `"bundle_url": "https://pay.codai.ro/checkout?bundle=resolve10"` — cumpărarea [pachetului de fix-uri](#pachet-de-fix-uri) este o alternativă la alimentare.

## Preț de introducere [#preț-de-introducere]

**Prima ta remediere plătită costă 1 €.** La primul tău accept plătit — oricare dintre `t7`, `t19` sau `t49` — Resolve blochează **1 €** în loc de prețul de listă. Cât timp ești eligibil, cotația `201` îți spune asta:

```json
{ "status": "quoted", "tier": "t19", "quote_micro_usd": 19000000,
  "intro_price_micro_eur": 1000000, "list_price_micro_eur": 19000000 }
```

- Introducerea se **consumă doar la un fix verificat**. Dacă acel job se termină `failed` sau `error`, 1 € se rambursează ca orice blocare, iar introducerea îți este **oferită din nou** la următorul accept plătit.
- Ești eligibil cât timp **nu ai niciun job plătit verificat** și **niciun alt job de introducere în zbor** (`accepted` / `running`) — deci două acceptări paralele nu pot primi amândouă 1 €.
- Răspunsul de accept raportează `"paid_with": "intro"` și `"held_micro_eur": 1000000`.

## Pachet de fix-uri [#pachet-de-fix-uri]

**49 € cumpără 10 credite de fix** — circa 4,90 € per fix `t7` în loc de 7 €. Îl cumperi la [pay.codai.ro/checkout?bundle=resolve10](https://pay.codai.ro/checkout?bundle=resolve10).

- Creditele plătesc **doar job-uri `t7`**. `t19` și `t49` folosesc mereu prețul de introducere sau portofelul.
- Un credit se **ia la accept în locul blocării în portofel** (`"paid_with": "credit"`, `"held_micro_eur": 0`), se **returnează la eșec sau eroare** și se consumă doar la un fix verificat.
- `GET /v1/resolve/balance` întoarce `fix_credits`, `intro_available` și `wallet_micro_eur`.

### Ce plătește: ordinea [#ce-plătește-ordinea]

La accept, Resolve alege prima variantă aplicabilă: **nivel gratuit > preț de introducere > credit de fix (doar t7) > portofel**. `paid_with` din răspunsul de accept (și din `GET /v1/resolve/jobs/{id}` după accept) îți spune ce s-a folosit. O excepție te scutește de un `402` inutil: dacă blocarea de 1 € a introducerii nu încape în portofel, dar pe acel job `t7` se poate folosi un credit, se folosește creditul.

Poți vedea costul upstream de model per job (nu ce plătești tu — ce a cheltuit Resolve) ca `cost_micro_usd` pe `GET /v1/resolve/jobs/{id}`; este suma utilizării gateway-ului sub id-urile de sesiune ale job-ului.

Nu cheltuim niciodată mai mult de **2× cotația ta** pe apeluri de model pentru un job (un plafon fix de 2 $ pentru job-urile gratuite). Acel plafon este al nostru de suportat — nu schimbă niciodată ce plătești.

## Limite [#limite]

Toate limitele sunt **per utilizator**, numărate peste fiecare cheie pe care o deții.

| Limită | Valoare | Ce vezi când o atingi |
| --- | --- | --- |
| Trimiteri | **6 pe minut** | `429 rate limited: too many resolve submissions, retry in a minute` |
| Job-uri în zbor (`accepted` / `running`) | **2** | `429 too many resolve jobs in flight, wait for one to finish` |
| Job-uri pe zi | **10** | `429 daily resolve job cap reached, retry tomorrow` |
| Remedieri verificate gratuite | **3**, pe viață (un job gratuit eșuat sau cu eroare nu consumă una) | Cotațiile revin `quoted` în loc de `accepted` |
| Sold în portofel la accept | ≥ cotația, în EUR | `402 insufficient_funds` cu `topup_url`; job-ul rămâne `quoted` |
| Text de issue | 50 000 de caractere (acțiunea trunchiază) | — |

Plafoanele sunt verificate înaintea triajului, așa că o trimitere respinsă nu costă nici un loc, nici un apel de triaj. Ziua se resetează la 00:00 **UTC**; fiecare body `429` are forma plată `{ "error": "<mesaj>" }` de mai sus, fără header `Retry-After`.

## Timeout-uri [#timeout-uri]

| Buget | Valoare | Efect |
| --- | --- | --- |
| Job întreg | **30 de minute** | Depășit, job-ul se termină `failed` (niciun fix verificat în buget) — 0 €. |
| O rulare în sandbox (setup + teste) | **15 minute** | O suită lentă încheie candidatul; job-ul poate încerca următorul. |
| Ture de agent per candidat | **4** | Editările peste acest număr nu sunt încercate. |
| Candidați de fix | **1** (gratuit) / **4** (plătit) | Primul succes verificat câștigă; restul sunt săriți. |
| Watchdog de orfani | buget job + **15 minute** | Un job al cărui worker a murit este marcat `error` (*watchdog: worker lost — not billed, safe to resubmit*) și un loc gratuit este returnat. |
| Interogarea acțiunii GitHub | **25 de minute** | Acțiunea nu mai așteaptă și comentează ultimul status; job-ul în sine continuă până la propriul buget. |

Triajul rulează inline în `POST`-ul tău și este limitat de timeout-ul de cerere al gateway-ului; un triaj lent returnează `declined` cu *triage unavailable, please retry* în loc să blocheze.

## Repository-uri suportate [#repository-uri-suportate]

- Doar `https://github.com/<owner>/<repo>` publice. Repo-urile private, alte host-uri și sub-căile de monorepo sunt respinse la trimitere cu `400`.
- **Python** cu pytest, sau **JavaScript/TypeScript** cu vitest, jest sau `node:test` (detectat din `package.json`).
- Suita repo-ului trebuie să ruleze dintr-o clonă curată plus manifestul de dependențe comis. Testele care au nevoie de secrete, servicii pornite sau pachete de sistem în afara imaginii runner-ului se termină de regulă în `declined` sau `error`.

<Cards>
  <Card title="Acțiunea GitHub" href="./github-action.mdx" description="auto-accept și max-tier controlează ce plătești." />
  <Card title="Limite și prețuri gateway" href="../gateway/limits-pricing.mdx" description="Cum se facturează restul codai." />
  <Card title="Referință API" href="../api/resolve.mdx" description="Fiecare câmp, inclusiv cost_micro_usd." />
</Cards>
