/api/v1/products/{id}
Requires authentication
Rate limited by the `api-global` limiter
v1
Send a bearer token, plus the X-Client-Id and X-Client-Secret headers in the Authorization header.
Përditëson një produkt ekzistues dhe kthen të dhënat e tij pas ndryshimit.
Body i kërkesës ka të njëjtin format dhe të njëjtat fusha të detyrueshme si POST /products,
me të njëjtat rregulla për unit_code dhe vat_rate.
- Emri ose kodi i ri nuk mund të përkojë me atë të një produkti tjetër; refuzohet me
409. - Ndryshimi i çmimit nuk prek faturat e lëshuara: ato mbajnë çmimin me të cilin u shitën.
- Një kërkesë e dytë nga i njëjti token, ndërsa e para nuk ka mbaruar, refuzohet menjëherë me
429.
URL-ja e plotë: https://fature.al/api/v1/products/{id}
Path parameters
| Name | Tipi | E detyrueshme | Përshkrimi |
|---|---|---|---|
| id | integer | yes | Id-ja e produktit në fature.al. |
Body parameters
| Name | Tipi | E detyrueshme | Përshkrimi |
|---|---|---|---|
| code | string, maxLength 255, nullable | no | Kodi i produktit, unik brenda kompanisë. Pa të gjenerohet vetë. |
| name | string, maxLength 255 | yes | Emri i produktit. I detyrueshëm. |
| description | string, maxLength 255, nullable | no | Përshkrimi. Pa të merret emri. |
| unit_code | string | yes | Kodi i njësisë matëse që mban dokumenti fiskal, p.sh. `XPP` copë, `KGM` kg, `LTR` litër, `HUR` orë, `MTK` m². I detyrueshëm; njësia si tekst derivohet prej tij dhe nuk dërgohet. Kuptimi i të 49 kodeve është te hyrja, "Kodet e njësive matëse". |
| last_price | number, min 0 | yes | Çmimi i shitjes për njësi. I detyrueshëm. |
| cost_price | number, min 0, nullable | no | Çmimi i blerjes për njësi. |
| vat_rate | string, one of 0, 6, 10, 20 | yes | Norma e TVSH-së në përqindje: `0`, `6`, `10` ose `20`. E detyrueshme. |
| vat_exempt_type | string, one of TYPE_1, TYPE_2, EXPORT_OF_GOODS, TAX_FREE, nullable | no | Lloji i përjashtimit nga TVSH-ja, për një produkt të përjashtuar: `TYPE_1`, `TYPE_2`, `EXPORT_OF_GOODS` ose `TAX_FREE`. |
| currency | string, maxLength 10, nullable | no | Monedha e çmimit, kod ISO 4217; pa të merret ALL. |
| service | boolean | no | `true` për një shërbim, `false` për një artikull që mbahet në inventar. Pa të merret `true`. |
| id_category | integer, nullable | no | Id-ja e kategorisë, nga `GET /product/categories`. |
Përgjigjet
200 Produkti pas ndryshimit te `product`.
| Field | Tipi | Përshkrimi |
|---|---|---|
| status | boolean | |
| data | object | |
| data.product | object | |
| data.product.id | integer | Id-ja e produktit në fature.al |
| data.product.code | string, nullable | Kodi unik i produktit |
| data.product.name | string | Emri i produktit |
| data.product.description | string, nullable | Përshkrimi i produktit |
| data.product.unit | string, nullable | Njësia matëse, e nxjerrë nga `unit_code` |
| data.product.unit_code | string, nullable | Kodi i njësisë matëse, p.sh. `C62`, `XPP`, `LTR` |
| data.product.last_price | number | Çmimi i shitjes |
| data.product.cost_price | number, nullable | Çmimi i blerjes, kur është regjistruar |
| data.product.vat_rate | number | Norma e TVSH-së në përqind: 0, 6, 10 ose 20 |
| data.product.vat_exempt_type | string, nullable | Tipi i përjashtimit nga TVSH-ja, kur produkti është i përjashtuar |
| data.product.vat_exempt_description | string, nullable | Përjashtimi i shkruar në gjuhën e llogarisë |
| data.product.currency | string, nullable | Monedha e çmimit |
| data.product.id_category | integer, nullable | Id-ja e kategorisë, ose null kur produkti nuk ka |
| data.product.service | boolean | true për një shërbim, false për një artikull që ndiqet në magazinë |
| data.product.category | object, nullable | Kategoria e produktit, ose null kur nuk ka |
| data.product.category.id | integer | Id-ja e kategorisë |
| data.product.category.name | string | Emri i kategorisë |
| data.product.category.color | string, nullable | Ngjyra në hex që përdor rrjeta e produkteve në POS |
| data.product.created_at | string, nullable | Data dhe ora e krijimit, ISO 8601 |
401 Unauthenticated
| Field | Tipi | Përshkrimi |
|---|---|---|
| message | string |
403 Abonimi ka mbaruar, ose veprimi nuk lejohet për këtë llogari.
| Field | Tipi | Përshkrimi |
|---|---|---|
| status | boolean | Gjithmonë false. Një përgjigje e suksesshme mban `status: true` dhe objektin `data` |
| message | string | Përshkrimi i gabimit. Bosh kur dështimi nuk mban ndonjë mesazh të vetin |
| errors | array | Mesazhe për t'u shfaqur te përdoruesi ose për t'u ruajtur në log. Mungon kur nuk ka gjë për të shtuar përtej `message` |
404 Produkti nuk u gjet, ose nuk i përket kompanisë suaj.
| Field | Tipi | Përshkrimi |
|---|---|---|
| status | boolean | Gjithmonë false. Një përgjigje e suksesshme mban `status: true` dhe objektin `data` |
| message | string | Përshkrimi i gabimit. Bosh kur dështimi nuk mban ndonjë mesazh të vetin |
| errors | array | Mesazhe për t'u shfaqur te përdoruesi ose për t'u ruajtur në log. Mungon kur nuk ka gjë për të shtuar përtej `message` |
409 Ekziston tashmë një produkt tjetër me këtë emër ose me këtë kod.
| Field | Tipi | Përshkrimi |
|---|---|---|
| status | boolean | Gjithmonë false. Një përgjigje e suksesshme mban `status: true` dhe objektin `data` |
| message | string | Përshkrimi i gabimit. Bosh kur dështimi nuk mban ndonjë mesazh të vetin |
| errors | array | Mesazhe për t'u shfaqur te përdoruesi ose për t'u ruajtur në log. Mungon kur nuk ka gjë për të shtuar përtej `message` |
422 Të dhënat nuk kaluan validimin. Kjo përgjigje përdor fushën `success`, jo `status`, dhe `errors` është objekt sipas fushës.
| Field | Tipi | Përshkrimi |
|---|---|---|
| success | boolean | Gjithmonë false |
| message | string | Një rresht përmbledhës, i njëjtë për çdo dështim validimi |
| errors | object | Fushat që nuk kaluan validimin, secila me mesazhet e veta. Çelësat me pikë tregojnë brenda objekteve dhe elementëve të array-ve, p.sh. `lines.0.quantity` |
429 Kufiri i kërkesave u arrit. Nga kufiri i përgjithshëm përgjigja mban vetëm `message` dhe header-in `Retry-After`; nga kufiri i endpoint-it mban formatin standard të gabimit.
| Field | Tipi | Përshkrimi |
|---|---|---|
| status | boolean | Gjithmonë false. Një përgjigje e suksesshme mban `status: true` dhe objektin `data` |
| message | string | Përshkrimi i gabimit. Bosh kur dështimi nuk mban ndonjë mesazh të vetin |
| errors | array | Mesazhe për t'u shfaqur te përdoruesi ose për t'u ruajtur në log. Mungon kur nuk ka gjë për të shtuar përtej `message` |
500 Gabim i papritur në server.
| Field | Tipi | Përshkrimi |
|---|---|---|
| status | boolean | Gjithmonë false. Një përgjigje e suksesshme mban `status: true` dhe objektin `data` |
| message | string | Përshkrimi i gabimit. Bosh kur dështimi nuk mban ndonjë mesazh të vetin |
| errors | array | Mesazhe për t'u shfaqur te përdoruesi ose për t'u ruajtur në log. Mungon kur nuk ka gjë për të shtuar përtej `message` |
Shembull kërkese
curl -X PUT 'https://fature.al/api/v1/products/42' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'X-Client-Id: YOUR_CLIENT_ID' \
-H 'X-Client-Secret: YOUR_CLIENT_SECRET' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"code": "P001",
"name": "Kafe Espresso",
"description": "Kafe espresso e peshuar 18g",
"unit_code": "XPP",
"last_price": 150,
"cost_price": 80,
"vat_rate": 20,
"vat_exempt_type": "TAX_FREE",
"currency": "ALL",
"service": true,
"id_category": 3
}'
use Illuminate\Support\Facades\Http;
$response = Http::withHeaders([
'Authorization' => 'Bearer YOUR_TOKEN',
'X-Client-Id' => 'YOUR_CLIENT_ID',
'X-Client-Secret' => 'YOUR_CLIENT_SECRET',
'Accept' => 'application/json',
'Content-Type' => 'application/json',
])->put('https://fature.al/api/v1/products/42', [
'code' => 'P001',
'name' => 'Kafe Espresso',
'description' => 'Kafe espresso e peshuar 18g',
'unit_code' => 'XPP',
'last_price' => 150,
'cost_price' => 80,
'vat_rate' => 20,
'vat_exempt_type' => 'TAX_FREE',
'currency' => 'ALL',
'service' => true,
'id_category' => 3,
]);
$data = $response->json();
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('PUT', 'https://fature.al/api/v1/products/42', [
'headers' => [
'Authorization' => 'Bearer YOUR_TOKEN',
'X-Client-Id' => 'YOUR_CLIENT_ID',
'X-Client-Secret' => 'YOUR_CLIENT_SECRET',
'Accept' => 'application/json',
'Content-Type' => 'application/json',
],
'json' => [
'code' => 'P001',
'name' => 'Kafe Espresso',
'description' => 'Kafe espresso e peshuar 18g',
'unit_code' => 'XPP',
'last_price' => 150,
'cost_price' => 80,
'vat_rate' => 20,
'vat_exempt_type' => 'TAX_FREE',
'currency' => 'ALL',
'service' => true,
'id_category' => 3,
],
]);
$data = json_decode((string) $response->getBody(), true);
const response = await fetch('https://fature.al/api/v1/products/42', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_TOKEN',
'X-Client-Id': 'YOUR_CLIENT_ID',
'X-Client-Secret': 'YOUR_CLIENT_SECRET',
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"code": "P001",
"name": "Kafe Espresso",
"description": "Kafe espresso e peshuar 18g",
"unit_code": "XPP",
"last_price": 150,
"cost_price": 80,
"vat_rate": 20,
"vat_exempt_type": "TAX_FREE",
"currency": "ALL",
"service": true,
"id_category": 3
})
});
const data = await response.json();
Shembull përgjigjeje
{
"status": true,
"data": {
"product": {
"id": 314,
"code": "SRV-MNT",
"name": "Orë pune mirëmbajtje",
"description": "Mirëmbajtje e sistemit, faturohet për orë",
"unit": "Orë",
"unit_code": "HUR",
"last_price": 300,
"cost_price": 150,
"vat_rate": 20,
"vat_exempt_type": "TYPE_1",
"vat_exempt_description": "Përjashtim i llojit 1. (Përjashtim në bazë të nenit 51 të Ligjit për TVSH-në.)",
"currency": "EUR",
"id_category": 12,
"service": true,
"category": {
"id": 12,
"name": "Shërbime",
"color": "dd9f52"
},
"created_at": "2026-01-15T09:00:00+01:00"
}
}
}
{
"message": "Unauthenticated."
}
{
"status": false,
"message": "Te dhenat jo te sakta.",
"errors": [
"errors"
]
}
{
"status": false,
"message": "Te dhenat jo te sakta.",
"errors": [
"errors"
]
}
{
"status": false,
"message": "Te dhenat jo te sakta.",
"errors": [
"errors"
]
}
{
"success": false,
"message": "Te dhena jo te sakta",
"errors": []
}
{
"status": false,
"message": "Te dhenat jo te sakta.",
"errors": [
"errors"
]
}
{
"status": false,
"message": "Te dhenat jo te sakta.",
"errors": [
"errors"
]
}