Schede lavoro

Schede, righe, pagamenti e stati di lavorazione.

16 endpoint Versione v1 · revisione 2026-07-20

Gli endpoint sono relativi a https://api.officina.it e richiedono l'header Authorization: Bearer con la chiave API e X-API-Version: 2026-07-20. L'header della revisione è obbligatorio: differenza fra v1 e revisione.

GET /v1/work-categories
Permesso richiesto settings.read

Elenca i tipi di intervento

I tipi di intervento configurati dall'officina, da usare per valorizzare work_category_id. È una voce di Impostazioni, quindi richiede il permesso settings.read.
Risposte
200
I tipi di intervento configurati.
401
Chiave API mancante, non valida, revocata o scaduta.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl https://api.officina.it/v1/work-categories \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20"
Risposta
{
  "object": "list",
  "data": [
    {
      "object": "work_category",
      "id": "3a8e5c21-9d76-4f03-b418-2c6a9e7d5b40",
      "name": "Tagliando"
    },
    {
      "object": "work_category",
      "id": "5f2b7d94-1a63-48ec-9207-8d4e3c1f6a52",
      "name": "Freni"
    }
  ],
  "has_more": false,
  "next_starting_after": null,
  "url": "/v1/work-categories"
}
GET /v1/worksheets
Permesso richiesto worksheets.read

Elenca le schede lavoro

Le schede lavoro dell'officina, dalla più recente. Filtra per stato con status, per cliente con customer_id, per veicolo con vehicle_id e per periodo con from / to. La paginazione usa un cursore opaco: passa next_starting_after invariato in starting_after e fermati quando has_more è false.
Risposte
200
Una pagina di schede lavoro.
401
Chiave API mancante, non valida, revocata o scaduta.
415
Il Content-Type deve essere application/json e Accept deve accettare JSON.
422
Un campo della richiesta manca o non è valido: «param» indica quale.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl https://api.officina.it/v1/worksheets \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20"
Risposta
{
  "object": "list",
  "data": [
    {
      "object": "worksheet",
      "id": "a5d21e64-8f37-4b90-ae12-3c7d6b048f95",
      "seq_number": 412,
      "status": "started",
      "title": "Tagliando 60.000 km",
      "customer_id": "4c911f08-7713-4e83-bdf6-a0692a1b43fd",
      "customer_name": "Mario Rossi",
      "vehicle_id": "8821f0ac-5d2b-41e7-9a10-6c3f2b7d4e55",
      "vehicle_name": "Fiat Panda",
      "vehicle_license": "AB123CD",
      "work_category_id": null,
      "work_category_name": "Tagliando",
      "km": 61240,
      "total_before_tax": 233.9,
      "total_tax": 51.46,
      "total_after_tax": 285.36,
      "total_discount": 0,
      "total_payments": 150.0,
      "outstanding_payments": 135.36,
      "fiscal_document_type": "fattura",
      "frozen": false,
      "invoice_id": null,
      "receipt_id": null,
      "started_at": "2026-07-15T08:30:00Z",
      "completed_at": null,
      "delivered_at": null,
      "created_at": "2026-07-15T08:12:00Z",
      "updated_at": "2026-07-16T10:02:00Z"
    }
  ],
  "has_more": true,
  "next_starting_after": "eyJvIjoyMH0",
  "url": "/v1/worksheets",
  "date_filter": {
    "object": "date_filter",
    "preset": "year",
    "from": "2026-01-01",
    "to": "2026-12-31"
  }
}
POST /v1/worksheets
Permesso richiesto worksheets.write

Crea una scheda lavoro

Crea una scheda lavoro in stato draft. Il numero progressivo (seq_number) è assegnato dal server. Le righe non si passano qui: crea la scheda, poi aggiungile con POST /v1/worksheets/{id}/line-items/batch.
Risposte
201
La scheda lavoro creata.
400
Corpo della richiesta non leggibile o JSON non valido.
401
Chiave API mancante, non valida, revocata o scaduta.
415
Il Content-Type deve essere application/json e Accept deve accettare JSON.
422
Un campo della richiesta manca o non è valido: «param» indica quale.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl -X POST https://api.officina.it/v1/worksheets \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20" \
  -H "Content-Type: application/json" \
  -d '{
  "customer_id": "4c911f08-7713-4e83-bdf6-a0692a1b43fd",
  "vehicle_id": "8821f0ac-5d2b-41e7-9a10-6c3f2b7d4e55",
  "title": "Tagliando 60.000 km",
  "km": 61240
}'
Risposta
{
  "object": "worksheet",
  "id": "a5d21e64-8f37-4b90-ae12-3c7d6b048f95",
  "seq_number": 412,
  "status": "started",
  "title": "Tagliando 60.000 km",
  "customer_id": "4c911f08-7713-4e83-bdf6-a0692a1b43fd",
  "customer_name": "Mario Rossi",
  "vehicle_id": "8821f0ac-5d2b-41e7-9a10-6c3f2b7d4e55",
  "vehicle_name": "Fiat Panda",
  "vehicle_license": "AB123CD",
  "work_category_id": null,
  "work_category_name": "Tagliando",
  "km": 61240,
  "total_before_tax": 233.9,
  "total_tax": 51.46,
  "total_after_tax": 285.36,
  "total_discount": 0,
  "total_payments": 150.0,
  "outstanding_payments": 135.36,
  "fiscal_document_type": "fattura",
  "frozen": false,
  "invoice_id": null,
  "receipt_id": null,
  "started_at": "2026-07-15T08:30:00Z",
  "completed_at": null,
  "delivered_at": null,
  "created_at": "2026-07-15T08:12:00Z",
  "updated_at": "2026-07-16T10:02:00Z"
}
GET /v1/worksheets/status-counts
Permesso richiesto worksheets.read

Conta le schede per stato

Il numero di schede in ciascuno stato, con gli stessi filtri dell'elenco. Serve a popolare i contatori senza scaricare le schede.
Risposte
200
Il numero di schede per stato.
401
Chiave API mancante, non valida, revocata o scaduta.
422
Un campo della richiesta manca o non è valido: «param» indica quale.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl https://api.officina.it/v1/worksheets/status-counts \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20"
Risposta
{
  "object": "worksheet_status_counts",
  "draft": 3,
  "waiting": 5,
  "started": 2,
  "completed": 8,
  "delivered": 41,
  "archived": 120,
  "date_filter": {
    "object": "date_filter",
    "preset": "year",
    "from": "2026-01-01",
    "to": "2026-12-31"
  }
}
GET /v1/worksheets/{id}
Permesso richiesto worksheets.read

Recupera una scheda lavoro

Restituisce la scheda con le righe (line_items), i documenti allegati e i totali calcolati. frozen indica che la scheda ha già generato un documento fiscale e non è più modificabile; linked_invoices e linked_receipt puntano ai documenti emessi.
Risposte
200
La scheda lavoro richiesta.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
415
Il Content-Type deve essere application/json e Accept deve accettare JSON.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl https://api.officina.it/v1/worksheets/{id} \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20"
Risposta
{
  "object": "worksheet",
  "id": "a5d21e64-8f37-4b90-ae12-3c7d6b048f95",
  "seq_number": 412,
  "status": "started",
  "title": "Tagliando 60.000 km",
  "customer_id": "4c911f08-7713-4e83-bdf6-a0692a1b43fd",
  "customer_name": "Mario Rossi",
  "vehicle_id": "8821f0ac-5d2b-41e7-9a10-6c3f2b7d4e55",
  "vehicle_name": "Fiat Panda",
  "vehicle_license": "AB123CD",
  "work_category_id": null,
  "work_category_name": "Tagliando",
  "km": 61240,
  "total_before_tax": 233.9,
  "total_tax": 51.46,
  "total_after_tax": 285.36,
  "total_discount": 0,
  "total_payments": 150.0,
  "outstanding_payments": 135.36,
  "fiscal_document_type": "fattura",
  "frozen": false,
  "invoice_id": null,
  "receipt_id": null,
  "started_at": "2026-07-15T08:30:00Z",
  "completed_at": null,
  "delivered_at": null,
  "created_at": "2026-07-15T08:12:00Z",
  "updated_at": "2026-07-16T10:02:00Z",
  "comments": "Sostituire anche il filtro abitacolo.",
  "line_items": [
    {
      "object": "work_line_item",
      "id": "7c0f6c4e-9b1a-4c2e-9a5d-2f3b1e8a4d10",
      "article_id": null,
      "description": "Olio motore 5W30",
      "quantity": 4,
      "unit_type": "pz",
      "unit_price": 18.5,
      "unit_discount_rate": 0,
      "tax_rate": 22,
      "vat_code": "22",
      "total_before_tax": 74.0,
      "total_tax": 16.28,
      "total_after_tax": 90.28,
      "created_at": "2026-07-15T08:31:00Z"
    },
    {
      "object": "work_line_item",
      "id": "0b4a2d6f-1c3e-4f5a-8b9c-7d6e5f4a3b2c",
      "article_id": null,
      "description": "Manodopera tagliando",
      "quantity": 2,
      "unit_type": "pz",
      "unit_price": 79.95,
      "unit_discount_rate": 0,
      "tax_rate": 22,
      "vat_code": "22",
      "total_before_tax": 159.9,
      "total_tax": 35.18,
      "total_after_tax": 195.08,
      "position": 1,
      "created_at": "2026-07-15T08:31:00Z"
    }
  ],
  "documents": []
}
PATCH /v1/worksheets/{id}
Permesso richiesto worksheets.write

Aggiorna una scheda lavoro

Aggiorna solo i campi presenti nel corpo: gli altri restano invariati, e null svuota il campo. Una scheda frozen (già fatturata) rifiuta la modifica con 409.
Risposte
200
La scheda lavoro aggiornata.
400
Corpo della richiesta non leggibile o JSON non valido.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
409
L'operazione è in conflitto con lo stato attuale della risorsa.
415
Il Content-Type deve essere application/json e Accept deve accettare JSON.
422
Un campo della richiesta manca o non è valido: «param» indica quale.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl -X PATCH https://api.officina.it/v1/worksheets/{id} \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "Tagliando 60.000 km — completato",
  "km": 61310,
  "internal_comments": null
}'
Risposta
{
  "object": "worksheet",
  "id": "a5d21e64-8f37-4b90-ae12-3c7d6b048f95",
  "seq_number": 412,
  "status": "started",
  "title": "Tagliando 60.000 km",
  "customer_id": "4c911f08-7713-4e83-bdf6-a0692a1b43fd",
  "customer_name": "Mario Rossi",
  "vehicle_id": "8821f0ac-5d2b-41e7-9a10-6c3f2b7d4e55",
  "vehicle_name": "Fiat Panda",
  "vehicle_license": "AB123CD",
  "work_category_id": null,
  "work_category_name": "Tagliando",
  "km": 61240,
  "total_before_tax": 233.9,
  "total_tax": 51.46,
  "total_after_tax": 285.36,
  "total_discount": 0,
  "total_payments": 150.0,
  "outstanding_payments": 135.36,
  "fiscal_document_type": "fattura",
  "frozen": false,
  "invoice_id": null,
  "receipt_id": null,
  "started_at": "2026-07-15T08:30:00Z",
  "completed_at": null,
  "delivered_at": null,
  "created_at": "2026-07-15T08:12:00Z",
  "updated_at": "2026-07-16T10:02:00Z",
  "comments": "Sostituire anche il filtro abitacolo.",
  "line_items": [
    {
      "object": "work_line_item",
      "id": "7c0f6c4e-9b1a-4c2e-9a5d-2f3b1e8a4d10",
      "article_id": null,
      "description": "Olio motore 5W30",
      "quantity": 4,
      "unit_type": "pz",
      "unit_price": 18.5,
      "unit_discount_rate": 0,
      "tax_rate": 22,
      "vat_code": "22",
      "total_before_tax": 74.0,
      "total_tax": 16.28,
      "total_after_tax": 90.28,
      "created_at": "2026-07-15T08:31:00Z"
    },
    {
      "object": "work_line_item",
      "id": "0b4a2d6f-1c3e-4f5a-8b9c-7d6e5f4a3b2c",
      "article_id": null,
      "description": "Manodopera tagliando",
      "quantity": 2,
      "unit_type": "pz",
      "unit_price": 79.95,
      "unit_discount_rate": 0,
      "tax_rate": 22,
      "vat_code": "22",
      "total_before_tax": 159.9,
      "total_tax": 35.18,
      "total_after_tax": 195.08,
      "position": 1,
      "created_at": "2026-07-15T08:31:00Z"
    }
  ],
  "documents": []
}
DELETE /v1/worksheets/{id}
Permesso richiesto worksheets.write

Elimina una scheda lavoro

Eliminazione logica. Una scheda che ha già generato una fattura o uno scontrino non può essere eliminata: la richiesta risponde 409 finché il documento fiscale esiste.
Risposte
200
Conferma di eliminazione.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
409
L'operazione è in conflitto con lo stato attuale della risorsa.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl -X DELETE https://api.officina.it/v1/worksheets/{id} \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20"
Risposta
{
  "object": "worksheet",
  "id": "a5d21e64-8f37-4b90-ae12-3c7d6b048f95",
  "seq_number": 412,
  "status": "started",
  "title": "Tagliando 60.000 km",
  "deleted_at": "2026-07-20T11:04:00Z"
}
GET /v1/worksheets/{id}/checkins
Permesso richiesto checkins.read

Accettazioni collegate alla scheda

Le accettazioni da cui la scheda è stata generata. Restituisce accettazioni, quindi richiede il permesso checkins.read e non worksheets.read.
Risposte
200
Le accettazioni collegate alla scheda.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl https://api.officina.it/v1/worksheets/{id}/checkins \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20"
Risposta
{
  "object": "list",
  "data": [
    {
      "object": "checkin",
      "id": "1c7a9e04-5f83-4b26-8d10-6e2b4a9c7f31",
      "status": "convertita",
      "vehicle_id": "8821f0ac-5d2b-41e7-9a10-6c3f2b7d4e55",
      "customer_id": "4c911f08-7713-4e83-bdf6-a0692a1b43fd",
      "created_at": "2026-07-15T07:55:00Z"
    }
  ],
  "has_more": false,
  "next_starting_after": null,
  "url": "/v1/worksheets/a5d21e64-8f37-4b90-ae12-3c7d6b048f95/checkins"
}
POST /v1/worksheets/{id}/documents
Permesso richiesto worksheets.write

Allega un documento alla scheda

Carica un file fra i documenti della scheda. La richiesta è multipart/form-data con il file nel campo file, non JSON.
Risposte
201
Il documento allegato.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
422
Un campo della richiesta manca o non è valido: «param» indica quale.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl -X POST https://api.officina.it/v1/worksheets/{id}/documents \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20" \
  -F "file=@/percorso/documento.pdf"
Risposta
{
  "object": "worksheet_document",
  "id": "6b3e9f10-2c84-4d57-91ab-5e8f0a2d7c63",
  "name": "preventivo-firmato.pdf",
  "content_type": "application/pdf",
  "description": "Preventivo firmato",
  "file_size_bytes": 92418,
  "url": "/v1/worksheets/a5d21e64-8f37-4b90-ae12-3c7d6b048f95/documents/6b3e9f10-2c84-4d57-91ab-5e8f0a2d7c63/download",
  "created_at": "2026-07-15T09:40:00Z"
}
DELETE /v1/worksheets/{id}/documents/{documentID}
Permesso richiesto worksheets.write

Elimina un documento della scheda

Rimuove definitivamente il file allegato.
Risposte
200
Conferma di eliminazione.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl -X DELETE https://api.officina.it/v1/worksheets/{id}/documents/{documentID} \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20"
Risposta
{
  "object": "worksheet_document",
  "id": "6b3e9f10-2c84-4d57-91ab-5e8f0a2d7c63",
  "name": "preventivo-firmato.pdf",
  "content_type": "application/pdf",
  "file_size_bytes": 92418,
  "created_at": "2026-07-15T09:40:00Z"
}
GET /v1/worksheets/{id}/documents/{documentID}/download
Permesso richiesto worksheets.read

Scarica un documento della scheda

Restituisce il contenuto del file, non JSON. È il percorso indicato dal campo url di ogni documento.
Risposte
200
success
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl https://api.officina.it/v1/worksheets/{id}/documents/{documentID}/download \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20"
POST /v1/worksheets/{id}/line-items/batch
Permesso richiesto worksheets.write

Modifica le righe in blocco

Aggiunge, aggiorna, rimuove e riordina le righe in una sola richiesta, applicata come singola transazione: se una operazione fallisce non viene applicata nessuna. I totali della scheda vengono ricalcolati e restituiti. Collega una riga al magazzino valorizzando article_id; lasciandolo null la riga resta libera.
Risposte
200
La scheda con le righe aggiornate e i totali ricalcolati.
400
Corpo della richiesta non leggibile o JSON non valido.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
409
L'operazione è in conflitto con lo stato attuale della risorsa.
415
Il Content-Type deve essere application/json e Accept deve accettare JSON.
422
Un campo della richiesta manca o non è valido: «param» indica quale.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl -X POST https://api.officina.it/v1/worksheets/{id}/line-items/batch \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20" \
  -H "Content-Type: application/json" \
  -d '{
  "add": [
    {
      "description": "Brake pads (front)",
      "quantity": 1,
      "unit_type": "kit",
      "unit_price": 89.9,
      "unit_discount_rate": 0,
      "vat_code": "22",
      "article_id": null
    }
  ],
  "update": [
    {
      "id": "7c0f6c4e-9b1a-4c2e-9a5d-2f3b1e8a4d10",
      "description": "Labour — brake service",
      "quantity": 1.5,
      "unit_type": "pz",
      "unit_price": 40,
      "unit_discount_rate": 10,
      "vat_code": "22"
    }
  ],
  "remove": [
    "0b4a2d6f-1c3e-4f5a-8b9c-7d6e5f4a3b2c"
  ],
  "reorder": [
    {
      "id": "9d8c7b6a-5f4e-3d2c-1b0a-9e8d7c6b5a40",
      "position": 1
    }
  ]
}'
Risposta
{
  "object": "worksheet",
  "id": "a5d21e64-8f37-4b90-ae12-3c7d6b048f95",
  "seq_number": 412,
  "status": "started",
  "title": "Tagliando 60.000 km",
  "customer_id": "4c911f08-7713-4e83-bdf6-a0692a1b43fd",
  "customer_name": "Mario Rossi",
  "vehicle_id": "8821f0ac-5d2b-41e7-9a10-6c3f2b7d4e55",
  "vehicle_name": "Fiat Panda",
  "vehicle_license": "AB123CD",
  "work_category_id": null,
  "work_category_name": "Tagliando",
  "km": 61240,
  "total_before_tax": 233.9,
  "total_tax": 51.46,
  "total_after_tax": 285.36,
  "total_discount": 0,
  "total_payments": 150.0,
  "outstanding_payments": 135.36,
  "fiscal_document_type": "fattura",
  "frozen": false,
  "invoice_id": null,
  "receipt_id": null,
  "started_at": "2026-07-15T08:30:00Z",
  "completed_at": null,
  "delivered_at": null,
  "created_at": "2026-07-15T08:12:00Z",
  "updated_at": "2026-07-16T10:02:00Z",
  "comments": "Sostituire anche il filtro abitacolo.",
  "line_items": [
    {
      "object": "work_line_item",
      "id": "7c0f6c4e-9b1a-4c2e-9a5d-2f3b1e8a4d10",
      "article_id": null,
      "description": "Olio motore 5W30",
      "quantity": 4,
      "unit_type": "pz",
      "unit_price": 18.5,
      "unit_discount_rate": 0,
      "tax_rate": 22,
      "vat_code": "22",
      "total_before_tax": 74.0,
      "total_tax": 16.28,
      "total_after_tax": 90.28,
      "created_at": "2026-07-15T08:31:00Z"
    },
    {
      "object": "work_line_item",
      "id": "0b4a2d6f-1c3e-4f5a-8b9c-7d6e5f4a3b2c",
      "article_id": null,
      "description": "Manodopera tagliando",
      "quantity": 2,
      "unit_type": "pz",
      "unit_price": 79.95,
      "unit_discount_rate": 0,
      "tax_rate": 22,
      "vat_code": "22",
      "total_before_tax": 159.9,
      "total_tax": 35.18,
      "total_after_tax": 195.08,
      "position": 1,
      "created_at": "2026-07-15T08:31:00Z"
    }
  ],
  "documents": []
}
GET /v1/worksheets/{id}/payments
Permesso richiesto worksheets.read

Elenca i pagamenti della scheda

Gli incassi registrati sulla scheda. Il residuo da incassare è outstanding_payments sulla scheda stessa.
Risposte
200
I pagamenti della scheda.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl https://api.officina.it/v1/worksheets/{id}/payments \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20"
Risposta
{
  "object": "list",
  "data": [
    {
      "object": "payment",
      "id": "d47c0b58-3e91-42a6-8f05-1b9d6a3e2c74",
      "amount": 150.0,
      "payment_method": "MP01",
      "payment_date": "2026-07-16",
      "created_at": "2026-07-16T10:02:00Z"
    }
  ],
  "has_more": false,
  "next_starting_after": null,
  "url": "/v1/worksheets/a5d21e64-8f37-4b90-ae12-3c7d6b048f95/payments"
}
POST /v1/worksheets/{id}/payments
Permesso richiesto worksheets.write

Registra un pagamento

Registra un incasso sulla scheda. payment_method usa i codici ministeriali (MP01 contanti, MP02 assegno, MP05 bonifico, MP08 carta). L'importo può essere parziale: registra più pagamenti fino a coprire il totale.
Risposte
201
Il pagamento registrato.
400
Corpo della richiesta non leggibile o JSON non valido.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
415
Il Content-Type deve essere application/json e Accept deve accettare JSON.
422
Un campo della richiesta manca o non è valido: «param» indica quale.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl -X POST https://api.officina.it/v1/worksheets/{id}/payments \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20" \
  -H "Content-Type: application/json" \
  -d '{
  "amount": 150.0,
  "payment_method": "MP01",
  "payment_date": "2026-07-16"
}'
Risposta
{
  "object": "payment",
  "id": "d47c0b58-3e91-42a6-8f05-1b9d6a3e2c74",
  "amount": 150.0,
  "payment_method": "MP01",
  "payment_date": "2026-07-16",
  "created_at": "2026-07-16T10:02:00Z"
}
DELETE /v1/worksheets/{id}/payments/{paymentID}
Permesso richiesto worksheets.write

Elimina un pagamento

Rimuove l'incasso e riporta il residuo della scheda al valore precedente.
Risposte
200
Conferma di eliminazione.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl -X DELETE https://api.officina.it/v1/worksheets/{id}/payments/{paymentID} \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20"
Risposta
{
  "object": "payment",
  "id": "d47c0b58-3e91-42a6-8f05-1b9d6a3e2c74",
  "amount": 150.0,
  "payment_method": "MP01",
  "payment_date": "2026-07-16",
  "created_at": "2026-07-16T10:02:00Z"
}
POST /v1/worksheets/{id}/transitions
Permesso richiesto worksheets.write

Cambia stato alla scheda

Applica una transizione di stato e registra la data corrispondente (started_at, completed_at, delivered_at, archived_at). È il modo corretto di far avanzare una scheda: non impostare status via PATCH, perché non aggiornerebbe le date.
Risposte
200
La scheda dopo la transizione.
400
Corpo della richiesta non leggibile o JSON non valido.
401
Chiave API mancante, non valida, revocata o scaduta.
404
La risorsa non esiste, è stata eliminata o non appartiene alla tua officina.
409
L'operazione è in conflitto con lo stato attuale della risorsa.
415
Il Content-Type deve essere application/json e Accept deve accettare JSON.
422
Un campo della richiesta manca o non è valido: «param» indica quale.
500
Errore imprevisto del server. Il dettaglio finisce nei log, non nella risposta.
Richiesta
curl -X POST https://api.officina.it/v1/worksheets/{id}/transitions \
  -H "Authorization: Bearer ofk_live_LA_TUA_CHIAVE" \
  -H "X-API-Version: 2026-07-20" \
  -H "Content-Type: application/json" \
  -d '{
  "action": "started"
}'
Risposta
{
  "object": "worksheet",
  "id": "a5d21e64-8f37-4b90-ae12-3c7d6b048f95",
  "seq_number": 412,
  "status": "started",
  "title": "Tagliando 60.000 km",
  "customer_id": "4c911f08-7713-4e83-bdf6-a0692a1b43fd",
  "customer_name": "Mario Rossi",
  "vehicle_id": "8821f0ac-5d2b-41e7-9a10-6c3f2b7d4e55",
  "vehicle_name": "Fiat Panda",
  "vehicle_license": "AB123CD",
  "work_category_id": null,
  "work_category_name": "Tagliando",
  "km": 61240,
  "total_before_tax": 233.9,
  "total_tax": 51.46,
  "total_after_tax": 285.36,
  "total_discount": 0,
  "total_payments": 150.0,
  "outstanding_payments": 135.36,
  "fiscal_document_type": "fattura",
  "frozen": false,
  "invoice_id": null,
  "receipt_id": null,
  "started_at": "2026-07-15T08:30:00Z",
  "completed_at": null,
  "delivered_at": null,
  "created_at": "2026-07-15T08:12:00Z",
  "updated_at": "2026-07-16T10:02:00Z",
  "comments": "Sostituire anche il filtro abitacolo.",
  "line_items": [
    {
      "object": "work_line_item",
      "id": "7c0f6c4e-9b1a-4c2e-9a5d-2f3b1e8a4d10",
      "article_id": null,
      "description": "Olio motore 5W30",
      "quantity": 4,
      "unit_type": "pz",
      "unit_price": 18.5,
      "unit_discount_rate": 0,
      "tax_rate": 22,
      "vat_code": "22",
      "total_before_tax": 74.0,
      "total_tax": 16.28,
      "total_after_tax": 90.28,
      "created_at": "2026-07-15T08:31:00Z"
    },
    {
      "object": "work_line_item",
      "id": "0b4a2d6f-1c3e-4f5a-8b9c-7d6e5f4a3b2c",
      "article_id": null,
      "description": "Manodopera tagliando",
      "quantity": 2,
      "unit_type": "pz",
      "unit_price": 79.95,
      "unit_discount_rate": 0,
      "tax_rate": 22,
      "vat_code": "22",
      "total_before_tax": 159.9,
      "total_tax": 35.18,
      "total_after_tax": 195.08,
      "position": 1,
      "created_at": "2026-07-15T08:31:00Z"
    }
  ],
  "documents": []
}