Κωδικοί καυσίμων myDATA (fuel_code): έκδοση παραστατικών πρατηρίου μέσω API
Τι κάνει ένα παραστατικό «παραστατικό καυσίμων», ποια πεδία στέλνεις και πού ακριβώς μπαίνει το καθένα, οι 29 τιμές του fuel_code, οι τρεις κανόνες επικύρωσης της ΑΑΔΕ, και έτοιμα JSON payloads για πρατήριο και για πετρέλαιο θέρμανσης.
Ένα πρατήριο υγρών καυσίμων εκδίδει τα ίδια παραστατικά με κάθε άλλη επιχείρηση, με μία διαφορά: το myDATA θέλει να ξέρει ποιο καύσιμο πουλήθηκε σε κάθε γραμμή. Αυτό γίνεται με δύο πεδία, έναν διακόπτη στο header και έναν κωδικό ανά γραμμή.
{
"fuel_invoice": true,
"invoice_lines": [
{ "fuel_code": 20 }
]
}
Αυτά τα δύο είναι όλη η βάση. Τα υπόλοιπα του άρθρου είναι το πού μπαίνει το καθένα, τι δέχεται, τι απορρίπτει η ΑΑΔΕ, και δύο πλήρη payloads που μπορείς να αντιγράψεις.
Πριν τα πεδία: επιτρέπεται η λιανική μέσω παρόχου;
Η συνηθισμένη υπόθεση είναι ότι το πρατήριο είναι δεμένο με ΦΗΜ και ότι ο πάροχος αφορά μόνο χονδρική και στόλους. Δεν είναι έτσι, και η απάντηση βρίσκεται στο ίδιο το κείμενο της απόφασης.
Η Α.1060/2021, όπως η παρ. 2 του άρθρου 1 αντικαταστάθηκε από την Α.1155/2021 (ΦΕΚ Β΄ 3132/19.7.2021), ορίζει ότι οι υπόχρεες οντότητες διαβιβάζουν «είτε με τη χρήση Φ.Η.Μ., είτε με τη χρήση υπηρεσιών παρόχου ηλεκτρονικής τιμολόγησης».
Και η αμέσως επόμενη παράγραφος απαριθμεί τα διαβιβαζόμενα δεδομένα δύο φορές: μία για τα «λογιστικά στοιχεία χονδρικής πώλησης (τιμολόγια)» και μία για τα «λογιστικά στοιχεία λιανικής πώλησης». Η λιανική δηλαδή δεν εξαιρείται από τη διαδρομή του παρόχου.
Δύο διευκρινίσεις που αξίζουν όσο και το ίδιο το συμπέρασμα. Πρώτον, η απόφαση αυτή ρυθμίζει τη διαβίβαση. Το δικαίωμα να εκδώσεις σεσημασμένο παραστατικό λιανικής προϋποθέτει αδειοδοτημένο πάροχο ΥΠΑΗΕΣ, κάτι διαφορετικό από μια απλή σύνδεση στο myDATA. Η διάκριση αναλύεται στο άρθρο για τη σύνδεση SaaS και ERP με το myDATA.
Δεύτερον, και είναι το σημείο που μπερδεύει τους περισσότερους: το σύστημα εισροών-εκροών είναι ξεχωριστή υποχρέωση και δεν την αγγίζει τίποτα από τα παραπάνω. Ο πάροχος αναλαμβάνει τη σήμανση και τη διαβίβαση του παραστατικού. Τη μέτρηση του καυσίμου στις δεξαμενές και στις αντλίες την κάνει το σύστημα εισροών-εκροών, όπως και πριν.
Τα τέσσερα πεδία και πού ζει το καθένα
Η θέση κάθε πεδίου είναι το μισό της δουλειάς εδώ, γιατί ένα πεδίο στο λάθος επίπεδο δεν βγάζει σφάλμα. Απλώς αγνοείται.
| Πεδίο | Πού μπαίνει | Τι κάνει |
|---|---|---|
fuel_invoice |
Header | Boolean. Ο γενικός διακόπτης. Χωρίς αυτό, κάθε fuel_code απορρίπτεται |
fuel_code |
Γραμμή, μέσα στο invoice_lines |
Ακέραιος. Το καύσιμο της συγκεκριμένης γραμμής |
supply_account_no |
Μέσα στο counterpart |
Ο Αριθμός Παροχής Ηλεκτρικού Ρεύματος. Στο header αγνοείται σιωπηλά |
special_invoice_category |
Header | Ακέραιος. Η τιμή 11 είναι η ένδειξη «Επίδομα Θέρμανσης» |
Οι κωδικοί καυσίμων του myDATA
Είκοσι οκτώ κωδικοί καυσίμων, συν την τιμή 999 για λοιπές χρεώσεις υπηρεσιών. Στέλνονται ως ακέραιοι, όχι ως κείμενο. Ένας κωδικός εκτός λίστας απορρίπτεται από τη Wrapp κατά τη δημιουργία του draft, με HTTP 422.
| Τιμή | Περιγραφή |
|---|---|
10 | Benzine 95RON |
11 | Benzine 95RON+ |
12 | Benzine 100RON |
13 | Benzine LRP |
14 | Βενζίνη αεροπλάνων |
15 | Ειδικό καύσιμο αεριωθουμένων |
20 | Diesel |
21 | Diesel premium |
30 | Diesel Heat |
31 | Diesel Heat premium |
32 | Diesel Light |
33 | Diesel άλλων χρήσεων |
34 | Diesel ναυτιλίας |
35 | Κηροζίνη JP1 |
36 | Κηροζίνη άλλων χρήσεων |
37 | Μαζούτ |
38 | Μαζούτ ναυτιλίας |
40 | LPG (υγραέριο) |
41 | Υγραέριο (LPG) και μεθάνιο βιομηχανικό / εμπορικό κινητήρων (χύδην) |
42 | Υγραέριο (LPG) και μεθάνιο θέρμανσης και λοιπών χρήσεων (χύδην) |
43 | Υγραέριο (LPG) και μεθάνιο βιομηχανικό / εμπορικό κινητήρων (σε φιάλες) |
44 | Υγραέριο (LPG) και μεθάνιο θέρμανσης και λοιπών χρήσεων (σε φιάλες) |
50 | CNG (πεπιεσμένο φυσικό αέριο) |
60 | Αρωματικοί Υδρογονάνθρακες Δασμολογικής Κλάσης 2707 |
61 | Κυκλικοί Υδρογονάνθρακες Δασμολογικής Κλάσης 2902 |
70 | Ελαφρύ πετρέλαιο (WHITE SPIRIT) |
71 | Ελαφριά λάδια |
72 | Βιοντίζελ |
999 | Λοιπές χρεώσεις υπηρεσιών |
Πρατήριο: απόδειξη λιανικής με δύο καύσιμα και μία υπηρεσία
Το τυπικό παραστατικό αντλίας: ΑΛΠ (τύπος 11.1), αντισυμβαλλόμενος μόνο με όνομα, περισσότερα από ένα καύσιμα στην ίδια απόδειξη, και μία γραμμή 999 για ό,τι δεν είναι καύσιμο. Αντικατέστησε το billing_book_id με το id της δικής σου σειράς, από το GET /billing_books.
{
"invoice_type_code": "11.1",
"billing_book_id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"payment_method_type": 1,
"fuel_invoice": true,
"net_total_amount": 91.00,
"vat_total_amount": 21.84,
"total_amount": 112.84,
"payable_total_amount": 112.84,
"counterpart": {
"name": "Λιανική πώληση",
"country_code": "GR"
},
"invoice_lines": [
{
"line_number": 1,
"name": "Αμόλυβδη 95",
"quantity": 40,
"unit_price": 1.40,
"net_total_price": 56.00,
"vat_rate": 24,
"vat_total": 13.44,
"subtotal": 69.44,
"classification_category": "category1_1",
"classification_type": "E3_561_003",
"fuel_code": 10
},
{
"line_number": 2,
"name": "Diesel κίνησης",
"quantity": 20,
"unit_price": 1.50,
"net_total_price": 30.00,
"vat_rate": 24,
"vat_total": 7.20,
"subtotal": 37.20,
"classification_category": "category1_1",
"classification_type": "E3_561_003",
"fuel_code": 20
},
{
"line_number": 3,
"name": "Πλύσιμο",
"quantity": 1,
"unit_price": 5.00,
"net_total_price": 5.00,
"vat_rate": 24,
"vat_total": 1.20,
"subtotal": 6.20,
"classification_category": "category1_3",
"classification_type": "E3_561_003",
"fuel_code": 999
}
]
}
Πρόσεξε τη γραμμή 999. Επιτρέπεται μία ανά παραστατικό, και η καθαρή της αξία (5,00) δεν πρέπει να ξεπερνά το άθροισμα των καθαρών αξιών των υπόλοιπων γραμμών (56,00 + 30,00). Οι κωδικοί κατάταξης και ο κωδικός τρόπου πληρωμής είναι δικές σου φορολογικές επιλογές ανά περίπτωση: οι αποδεκτές τιμές είναι στην τεκμηρίωση του API.
Οι τρεις κανόνες επικύρωσης της ΑΑΔΕ
Η ΑΑΔΕ επιβάλλει τρεις κανόνες γύρω από αυτά τα πεδία, και οι τρεις ελέγχονται κατά την έκδοση, όχι στη δημιουργία του draft.
| Κωδικός | Μήνυμα | Πότε |
|---|---|---|
247 |
fuelCode is forbidden | fuel_code σε παραστατικό χωρίς fuel_invoice: true |
270 |
only one line can have fuelCode equal with 999 | Πάνω από μία γραμμή με 999 |
269 |
the net value of the invoice line with fuelCode 999 must be less or equal than sum of net values of the other invoice lines | Η γραμμή 999 είναι μεγαλύτερη από το άθροισμα των υπολοίπων |
Η πρακτική συμβουλή: έλεγξε και τους τρεις κανόνες από τη δική σου πλευρά, παρόλο που τους επιβάλλει η ΑΑΔΕ. Ένας κωδικός εκτός λίστας πιάνεται νωρίτερα, στη δημιουργία του draft, με HTTP 422. Αυτοί οι τρεις πιάνονται στην έκδοση.
Πετρέλαιο θέρμανσης: τέσσερα υποχρεωτικά δεδομένα
Εδώ το σχήμα γίνεται απαιτητικό, και η απαίτηση δεν είναι δική μας. Η Α.1139/2025 (ΦΕΚ Β΄ 5464/13.10.2025) πρόσθεσε παράγραφο στην Α.1138/2020 και ορίζει ότι, στην περίπτωση διαβίβασης μέσω Παρόχου Υπηρεσιών Ηλεκτρονικής Έκδοσης Στοιχείων, τα παραστατικά αγοράς πετρελαίου θέρμανσης για τη χορήγηση του επιδόματος διαβιβάζουν υποχρεωτικά τέσσερα επιπλέον δεδομένα.
| Τι απαιτεί η απόφαση | Πού πάει στο payload |
|---|---|
| Ο ΑΦΜ του αγοραστή | counterpart.vat |
| Ο κωδικός και η ποσότητα καυσίμου, «30-Diesel Heating» ή «31-Diesel Heating premium» | fuel_code και quantity στη γραμμή |
| Ο Αριθμός Παροχής Ηλεκτρικού Ρεύματος | counterpart.supply_account_no |
| Η ένδειξη «Επίδομα Θέρμανσης» της στήλης 40 | special_invoice_category: 11 |
Το τέταρτο είναι εκείνο που παρερμηνεύεται. Η απόφαση λέει «επιλέγεται η ένδειξη «Επίδομα Θέρμανσης» της στήλης 40 [Παρατηρήσεις - Επισημάνσεις]», και διαβάζεται κυριολεκτικά: πρόκειται για διακριτή τιμή σε κωδικοποιημένη στήλη, όχι για ελεύθερο κείμενο. Αν τη γράψεις στα notes, η υποχρέωση δεν καλύπτεται. Η απόφαση κατονομάζει τους τύπους παραστατικών 1.1, 1.4, 1.6, 5.1, 5.2, 11.1 και 11.4.
{
"invoice_type_code": "11.1",
"billing_book_id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"payment_method_type": 1,
"fuel_invoice": true,
"special_invoice_category": 11,
"net_total_amount": 800.00,
"vat_total_amount": 192.00,
"total_amount": 992.00,
"payable_total_amount": 992.00,
"counterpart": {
"name": "Γιάννης Ιωάννου",
"country_code": "GR",
"vat": "123456789",
"supply_account_no": "12345678"
},
"invoice_lines": [
{
"line_number": 1,
"name": "Πετρέλαιο θέρμανσης",
"quantity": 800,
"unit_price": 1.00,
"net_total_price": 800.00,
"vat_rate": 24,
"vat_total": 192.00,
"subtotal": 992.00,
"classification_category": "category1_1",
"classification_type": "E3_561_003",
"fuel_code": 30
}
]
}
Για πώληση σε επιχείρηση αντί σε ιδιώτη, η δομή είναι η ίδια και αλλάζει η κατάταξη: τιμολόγιο 1.1 με classification_type E3_561_001, γιατί το τιμολόγιο είναι χονδρική. Τα τέσσερα δεδομένα της απόφασης παραμένουν, και καλύπτονται και τα πιστωτικά.
Ο ΑΦΜ του αγοραστή είναι το τελευταίο πράγμα που πρέπει να μείνει δοκιμαστικό. Στο staging περνά οτιδήποτε, στην παραγωγή χρειάζεται ο πραγματικός ΑΦΜ, και εδώ δεν είναι απλώς ένα πεδίο: είναι ένα από τα τέσσερα δεδομένα από τα οποία εξαρτάται το επίδομα του πελάτη σου.
Το λάθος που δεν βγάζει σφάλμα
Ένα payload αξίζει να δεις και ανάποδα. Παρακάτω είναι το πιο συχνό λάθος του σχήματος: το supply_account_no στο ανώτερο επίπεδο, αντί μέσα στο counterpart.
{
"fuel_invoice": true,
"special_invoice_category": 11,
"supply_account_no": "12345678",
"counterpart": {
"name": "Γιάννης Ιωάννου",
"vat": "123456789"
}
}
Το παραστατικό εκδίδεται κανονικά. Δεν παίρνεις σφάλμα, και ο Αριθμός Παροχής Ηλεκτρικού Ρεύματος απλώς λείπει: το API αγνοεί άγνωστα πεδία στο ανώτερο επίπεδο αντί να τα απορρίψει. Η υποχρέωση της Α.1139/2025 μένει ακάλυπτη χωρίς κανένα ορατό σημάδι. Ο μόνος τρόπος να το πιάσεις είναι να διαβάσεις πίσω το παραστατικό και να επιβεβαιώσεις ότι το πεδίο επέστρεψε.
Πώς διαβάζεις τα πεδία πίσω
Τα fuel_invoice και fuel_code επιστρέφουν από το find_invoice_by_id και από το find_all_invoices. Το supply_account_no επιστρέφει μέσα στο counterpart, εκεί ακριβώς όπου το έστειλες. Το GET /invoices/{id} είναι σκόπιμα λιτό, μια προβολή φορολογικής κατάστασης με ΜΑΡΚ, UID, QR, σειρά και αριθμό, οπότε δεν είναι το σωστό endpoint για αυτόν τον έλεγχο.
Χρήσιμο για idempotency: το external_id είναι μοναδικό ανά λογαριασμό και ένα διπλότυπο απορρίπτεται κατά τη δημιουργία του draft, οπότε μια επανάληψη κλήσης μετά από timeout δεν παράγει δεύτερο παραστατικό. Το ίδιο πεδίο δέχεται και το find_invoice_by_id στη θέση του id, οπότε μπορείς να διαβάσεις πίσω ένα παραστατικό με το δικό σου αναγνωριστικό.
Τι δείχνει το ίδιο το παραστατικό
Τα πεδία δεν μένουν στο myDATA. Στο παραστατικό που λαμβάνει ο πελάτης τυπώνονται η ένδειξη «(Παραστατικό Καυσίμων)» δίπλα στον τίτλο, ο κωδικός με την περιγραφή του σε κάθε γραμμή, για παράδειγμα «(30 - Diesel Heat)», η «Ειδική Κατηγορία Παραστατικού: Επίδομα Θέρμανσης» και ο «Αρ. Παροχής Ηλ. Ρεύματος».
Πώς ξεκινάς
Για πρόσβαση στο staging περιβάλλον, συμπλήρωσε τη φόρμα στη σελίδα συνεργασίας μέσω API με το ΑΦΜ σου. Ο staging λογαριασμός σου δημιουργείται αυτόματα και θα επανέλθουμε άμεσα με τα credentials σου, ώστε να δοκιμάσεις κάθε τύπο παραστατικού πριν βγει σε παραγωγή. Το πλήρες σχήμα των πεδίων είναι στην τεκμηρίωση του REST API.
Αν το ερώτημα πίσω από όλα αυτά είναι ευρύτερο, δηλαδή τι αλλάζει συνολικά στην έκδοση παραστατικών από την 1η Οκτωβρίου 2026, το χρονοδιάγραμμα και οι υποχρεώσεις είναι εκεί.
Συχνές ερωτήσεις
Μπορεί ένα πρατήριο να εκδίδει απόδειξη λιανικής μέσω παρόχου, ή χρειάζεται οπωσδήποτε ΦΗΜ;
Οι δύο δρόμοι είναι εναλλακτικοί. Η Α.1060/2021, όπως αντικαταστάθηκε από την Α.1155/2021 (ΦΕΚ Β΄ 3132/19.7.2021), ορίζει ότι οι υπόχρεες οντότητες διαβιβάζουν «είτε με τη χρήση Φ.Η.Μ., είτε με τη χρήση υπηρεσιών παρόχου ηλεκτρονικής τιμολόγησης». Η ίδια απόφαση απαριθμεί χωριστά τα δεδομένα για τα στοιχεία χονδρικής και για τα στοιχεία λιανικής πώλησης, οπότε η λιανική δεν εξαιρείται από τη διαδρομή του παρόχου. Πρόσεξε το εύρος: η απόφαση αφορά τη διαβίβαση. Το δικαίωμα έκδοσης σεσημασμένου παραστατικού λιανικής προϋποθέτει αδειοδοτημένο πάροχο ΥΠΑΗΕΣ.
Καταργεί ο πάροχος το σύστημα εισροών-εκροών;
Όχι. Είναι δύο διαφορετικές υποχρεώσεις και δεν αλληλοκαλύπτονται. Ο πάροχος αναλαμβάνει τη σήμανση και τη διαβίβαση του παραστατικού. Το σύστημα εισροών-εκροών μετρά το καύσιμο στις δεξαμενές και στις αντλίες και παραμένει ως έχει. Η σύγχυση των δύο είναι ο βασικός λόγος που πολλοί πρατηριούχοι θεωρούν ότι η λιανική είναι κλειστή για τους παρόχους.
Τι ακριβώς κάνει ένα παραστατικό «παραστατικό καυσίμων»;
Το πεδίο fuel_invoice στο header, με τιμή true. Είναι ο γενικός διακόπτης: χωρίς αυτό, το fuel_code στη γραμμή απορρίπτεται από την ΑΑΔΕ με τον κωδικό 247 (fuelCode is forbidden). Με αυτό ενεργοποιημένο, κάθε γραμμή μπορεί να δηλώσει το δικό της fuel_code.
Πόσοι κωδικοί καυσίμων υπάρχουν;
Είκοσι οκτώ κωδικοί καυσίμων, από το 10 (Benzine 95RON) έως το 72 (Βιοντίζελ), συν την τιμή 999 για λοιπές χρεώσεις υπηρεσιών. Δηλαδή 29 αποδεκτές τιμές συνολικά. Ο πλήρης πίνακας είναι στο άρθρο και στην τεκμηρίωση του API.
Γιατί το supply_account_no δεν αποθηκεύεται όταν το στέλνω;
Επειδή ανήκει στο αντικείμενο counterpart, όχι στο header. Σταλμένο στο ανώτερο επίπεδο του payload αγνοείται σιωπηλά: το παραστατικό εκδίδεται κανονικά, δεν παίρνεις σφάλμα, και ο Αριθμός Παροχής Ηλεκτρικού Ρεύματος απλώς λείπει. Είναι το πιο συχνό λάθος σε αυτό το σχήμα, γιατί δεν εκδηλώνεται σαν λάθος. Έλεγξέ το διαβάζοντας πίσω το παραστατικό.
Τι απαιτεί η Α.1139/2025 για το πετρέλαιο θέρμανσης;
Η απόφαση (ΦΕΚ Β΄ 5464/13.10.2025) προσθέτει τέσσερα υποχρεωτικά δεδομένα στα παραστατικά αγοράς πετρελαίου θέρμανσης για το επίδομα: τον ΑΦΜ του αγοραστή, τον κωδικό και την ποσότητα καυσίμου (30 ή 31), τον Αριθμό Παροχής Ηλεκτρικού Ρεύματος, και την ένδειξη «Επίδομα Θέρμανσης». Η υποχρέωση ισχύει ρητά «στην περίπτωση διαβίβασης μέσω Παρόχου Υπηρεσιών Ηλεκτρονικής Έκδοσης Στοιχείων». Δεν καθιστά τον πάροχο υποχρεωτικό: αφορά όσους ήδη εκδίδουν μέσω παρόχου.
Πού μπαίνει η ένδειξη «Επίδομα Θέρμανσης»;
Στο πεδίο special_invoice_category, με τιμή 11. Η απόφαση αναφέρει «την ένδειξη «Επίδομα Θέρμανσης» της στήλης 40 [Παρατηρήσεις - Επισημάνσεις]», και αυτό διαβάζεται κυριολεκτικά: είναι διακριτή τιμή σε κωδικοποιημένη στήλη, όχι ελεύθερο κείμενο σε πεδίο σχολίων. Αν τη γράψεις στα notes, η υποχρέωση δεν καλύπτεται.
Ποιους κανόνες επικύρωσης επιβάλλει η ΑΑΔΕ στα πεδία καυσίμων;
Τρεις: ο 247 (fuel_code χωρίς fuel_invoice), ο 270 (πάνω από μία γραμμή με fuel_code 999) και ο 269 (η καθαρή αξία της γραμμής 999 ξεπερνά το άθροισμα των υπολοίπων). Και οι τρεις ελέγχονται κατά την έκδοση. Ένας κωδικός εκτός λίστας πιάνεται νωρίτερα, στη δημιουργία του draft, με HTTP 422. Αξίζει να ελέγχεις και τους τρεις κανόνες από τη δική σου πλευρά πριν στείλεις.
Πώς δοκιμάζω πριν βγω σε παραγωγή;
Για πρόσβαση στο staging περιβάλλον, συμπλήρωσε τη φόρμα στο wrapp.ai/el/api/becomeapartner με το ΑΦΜ σου. Ο staging λογαριασμός σου δημιουργείται αυτόματα και θα επανέλθουμε άμεσα με τα credentials σου για να ξεκινήσεις τις δοκιμές.
Χρειάζεσαι βοήθεια;
Αν έχεις απορία για αυτό το θέμα ή θέλεις να σιγουρευτείς ότι όλα ρυθμίστηκαν σωστά, επικοινώνησε μαζί μας και θα το δούμε μαζί.