Diferenţe de curs
Câştigul sau pierderea din curs pe o sumă în valută, între două date, la cursul oficial BNR.
Aceeaşi mişcare de curs dă rezultate opuse după ce ai. Pe 100.000 EUR, între ianuarie 2025 şi
august 2026, cursul a urcat cu 0,2786 lei — 27.860 lei. La o creanţă e câştig: încasezi mai
mulţi lei. La o datorie e pierdere: plăteşti mai mulţi. Cifra e identică, semnul e invers.
De aceea pozitie e obligatorie, fără valoare implicită: o implicită ar face tăcut greşită
jumătate dintre răspunsuri.
Cotaţiile urmează regulile de la /curs: ziua fără publicare primeşte ultima cotaţie
anterioară, marcată cu exact: false şi zile_inapoi. Aceeaşi zi la ambele capete dă diferenţă
zero, nu eroare — cine rulează un raport pe o listă de facturi nu trebuie să trateze cazul separat.
cont_orientativ dă contul din planul general (765 favorabile, 665 nefavorabile). E orientativ:
încadrarea ţine de politica contabilă şi de natura operaţiunii, nu de datele noastre.
Parametri de interogare
EUR, USD).
max 3 car.
creanta (ai de încasat) sau datorie (ai de plătit). Nu are implicit.
creantadatorie
YYYY-MM-DD. Data iniţială — tipic data facturii.
ex. 2024-06-15ex. 2024-01-15
YYYY-MM-DD. Data finală — tipic data încasării sau plăţii. Poate fi egală cu de_la.
ex. 2024-06-15ex. 2024-06-14
Cum se comportă
- Câştigul sau pierderea din curs pe o sumă în valută, între două date, la cursul oficial BNR.
- Aceeaşi mişcare de curs dă rezultate OPUSE după ce ai. Pe 100.000 EUR, între ianuarie 2025 şi august 2026, cursul a urcat cu 0,2786 lei — 27.860 lei. La o creanţă e câştig: încasezi mai mulţi lei. La o datorie e pierdere: plăteşti mai mulţi. Cifra e identică, semnul e invers, iar aici se greşeşte cel mai des.
pozitiee obligatorie, fără valoare implicită. Un implicit ar face tăcut greşită jumătate dintre răspunsuri, iar greşeala n-ar sări în ochi: cifra ar fi corectă ca mărime. Aceeaşi decizie ca latipde la/termen/civil, unde lipsa unui implicit e deliberată fiindcă alegerea schimbă rezultatul.diferenta.valoaree cifra CONTABILĂ, cu semnul potrivit poziţiei.diferenta.variatie_valoare_leie simpla variaţie a valorii în lei, aceeaşi indiferent de poziţie — ambele sunt în răspuns tocmai ca relaţia dintre ele să fie vizibilă.- Cotaţiile urmează regulile de la
/curs: ziua fără publicare primeşte ultima cotaţie anterioară, marcată cuexact: falseşizile_inapoi, la fiecare capăt separat. Nu se inventează cotaţii şi nu se ascunde substituirea. - Aceeaşi zi la ambele capete dă diferenţă zero, nu eroare. Cine rulează un raport peste o listă de facturi nu trebuie să trateze cazul separat. Felul e atunci
neutra, iar contul lipseşte. cont_orientativdă contul din planul general (OMFP 1802/2014): 765 pentru diferenţe favorabile, 665 pentru nefavorabile. E orientativ, şi e marcat ca atare: încadrarea ţine de politica contabilă şi de natura operaţiunii — decontare sau reevaluare — nu de datele noastre.- Nu tratează plăţi parţiale sau decontări eşalonate: o sumă, două date. Un flux de plăţi e altă întrebare, cu altă formă de răspuns.
- Pentru reevaluarea unui SOLD la închiderea perioadei se foloseşte cursul de închidere, nu cel al unei zile oarecare:
/curs-inchidere?luna=AAAA-LL.
La ce folosește
- Diferenţa de curs la încasarea unei facturi emise în valută.
- Diferenţa la plata unei datorii în valută.
- Verificarea semnului într-un calcul făcut de altcineva.
Structura răspunsului
false când ziua cerută n-a avut publicare şi s-a folosit una anterioară.
favorabila, nefavorabila sau neutra.
765 sau 665. Orientativ — vezi nota.
data e null, iar aici stă motivul. Cotaţia există la BNR, dar importul nostru e în urmă. Data cerută e anterioară lui 2005-01-03, unde cotaţiile sunt în lei vechi.
fara_date e proză şi se poate reformula, ăsta nu.
Exemple de răspuns
{
"data": {
"suma": "1000",
"valuta": "EUR",
"pozitie": "creanta",
"initial": {
"data_ceruta": "2024-06-15",
"data_cotatiei": "2024-06-14",
"exact": false,
"zile_inapoi": 1,
"curs": "4.9771",
"valoare_lei": "4977.10"
},
"final": {
"data_ceruta": "2024-06-15",
"data_cotatiei": "2024-06-14",
"exact": false,
"zile_inapoi": 1,
"curs": "4.9771",
"valoare_lei": "4977.10"
},
"miscare_curs": {
"lei_pe_unitate": "0",
"procent": "0.00"
},
"diferenta": {
"valoare": "0.00",
"valoare_exacta": "0",
"fel": "neutra",
"variatie_valoare_lei": "0.00",
"cont_orientativ": null
}
},
"meta": {
"sursa": "BNR — cursul de referinţă.",
"nota_pozitie": "Cursul nu s-a mişcat între cele două date: diferenţa e zero, indiferent de poziţie.",
"nota_substituire": "Cel puţin una dintre zile n-a avut publicare; s-a folosit ultima cotaţie anterioară. Vezi `exact` şi `zile_inapoi` la fiecare capăt.",
"reevaluare": "Pentru reevaluarea unui sold la închiderea perioadei se foloseşte cursul de închidere: /financiar/v1/curs-inchidere?luna=AAAA-LL."
}
}
{
"data": {
"suma": "2500.75",
"valuta": "EUR",
"pozitie": "creanta",
"initial": {
"data_ceruta": "2024-06-15",
"data_cotatiei": "2024-06-14",
"exact": false,
"zile_inapoi": 1,
"curs": "4.9771",
"valoare_lei": "12446.48"
},
"final": {
"data_ceruta": "2024-06-15",
"data_cotatiei": "2024-06-14",
"exact": false,
"zile_inapoi": 1,
"curs": "4.9771",
"valoare_lei": "12446.48"
},
"miscare_curs": {
"lei_pe_unitate": "0",
"procent": "0.00"
},
"diferenta": {
"valoare": "0.00",
"valoare_exacta": "0",
"fel": "neutra",
"variatie_valoare_lei": "0.00",
"cont_orientativ": null
}
},
"meta": {
"sursa": "BNR — cursul de referinţă.",
"nota_pozitie": "Cursul nu s-a mişcat între cele două date: diferenţa e zero, indiferent de poziţie.",
"nota_substituire": "Cel puţin una dintre zile n-a avut publicare; s-a folosit ultima cotaţie anterioară. Vezi `exact` şi `zile_inapoi` la fiecare capăt.",
"reevaluare": "Pentru reevaluarea unui sold la închiderea perioadei se foloseşte cursul de închidere: /financiar/v1/curs-inchidere?luna=AAAA-LL."
}
}
{
"data": {
"suma": "10000",
"valuta": "USD",
"pozitie": "datorie",
"initial": {
"data_ceruta": "2024-01-15",
"data_cotatiei": "2024-01-15",
"exact": true,
"zile_inapoi": 0,
"curs": "4.5481",
"valoare_lei": "45481.00"
},
"final": {
"data_ceruta": "2024-06-14",
"data_cotatiei": "2024-06-14",
"exact": true,
"zile_inapoi": 0,
"curs": "4.6576",
"valoare_lei": "46576.00"
},
"miscare_curs": {
"lei_pe_unitate": "0.1095",
"procent": "2.41"
},
"diferenta": {
"valoare": "-1095.00",
"valoare_exacta": "-1095",
"fel": "nefavorabila",
"variatie_valoare_lei": "1095.00",
"cont_orientativ": "665"
}
},
"meta": {
"sursa": "BNR — cursul de referinţă.",
"nota_pozitie": "Rezultatul depinde de `pozitie`: aceeaşi mişcare de curs e pierdere la datorie şi câştig la creanţă.",
"nota_cont": "Contul 665 e ORIENTATIV (plan general OMFP 1802/2014). Încadrarea ţine de politica contabilă şi de natura operaţiunii — decontare sau reevaluare — nu de datele noastre.",
"reevaluare": "Pentru reevaluarea unui sold la închiderea perioadei se foloseşte cursul de închidere: /financiar/v1/curs-inchidere?luna=AAAA-LL."
}
}
Coduri de eroare
| Cod | Slug | Când apare |
|---|---|---|
| 401 | neautentificat | Token lipsă, invalid, expirat sau revocat. |
| 403 | feature_indisponibil | Planul curent nu include funcţia de care ţine ruta. |
| 404 | negasit | Valuta n-a fost cotată niciodată; delistata — nu mai e cotată, cu ultima zi. |
| 422 | validare | pozitie lipsă sau invalidă; sumă, valută ori date malformate; dată în viitor; pana_la înainte de de_la. |
| 429 | cota_depasita | Cota lunară a planului a fost depăşită (vezi Retry-After). |
Toate erorile au aceeași formă. eroare.cod e stabil și e cel după care trebuie să ramifici în cod — nu după textul din mesaj, care se poate schimba.
{
"eroare": {
"cod": "validare",
"mesaj": "pozitie lipsă sau invalidă; sumă, valută ori date malformate; dată în viitor; pana_la înainte de de_la.",
"detalii": {
"suma": [
"Valoarea trimisă nu respectă regula parametrului."
]
}
}
}