FlexyAPI documentation

Request schema

Payment signature

Every field of the POST /api/v1/signatures/ body, with its values and constraints.

The fields below are the body of POST /api/v1/signatures/, wrapped in {"signature": …} — the signature that ties a card payment on a POS terminal to the document, as in step 3.

Request bodyPOST /api/v1/signatures/{ "signature": … }

  • Requiredthe API rejects the request without it.
  • Conditionalrequired only in the cases the field itself describes.
  • Optionalyou can leave it out.
  • Not used by flexythe field is accepted, but Flexy never reads it.
providerstringRequiredThe payment signature provider that will issue the signature: `flexy` means Flexy acting as the in-house ΥΠΑΗΕΣ payment signature provider (with our own key, A.1112 Article 8), while `oxygen` means the third-party Oxygen provider, kept for older signatures.#

The payment signature provider that will issue the signature: `flexy` means Flexy acting as the in-house ΥΠΑΗΕΣ payment signature provider (with our own key, A.1112 Article 8), while `oxygen` means the third-party Oxygen provider, kept for older signatures.

When it is used

Send `flexy` for new signatures; `oxygen` is still accepted but is meant only for verifying older signatures.

  • up to 50 characters

Allowed values

ValueMeaning
flexyFlexy (in-house ΥΠΑΗΕΣ, A.1112 Article 8)
oxygenOxygen (third-party provider, for older signatures)

Example

{
  "provider": "flexy"
}
nspstringRequiredThe network service provider (NSP) that will run the POS charge; it accepts a name (`Viva`, `WebEcr`, `WorldLine`, `Edps`, `EpaySoftPos`) or its number (1-5), case-insensitively.#

The network service provider (NSP) that will run the POS charge; it accepts a name (`Viva`, `WebEcr`, `WorldLine`, `Edps`, `EpaySoftPos`) or its number (1-5), case-insensitively. The choice changes the order of the amounts and the format of the `unsigned_text` that gets signed.

When it is used

Send the NSP that will charge the card on the POS; with provider `flexy` the value changes the order of the amounts and the date format inside `unsigned_text`.

  • up to 50 characters

Allowed values

Both the names (`Viva`, `WebEcr`, `WorldLine`, `Edps`, `EpaySoftPos`) and the numbers 1-5 are accepted, in upper or lower case. Anything else returns 400 "Unknown nsp". On the Oxygen sandbox it was verified live on 2026-10-04 that the same names and numbers are recognised, case-insensitively, and that anything else is rejected with 422 "The selected nsp is invalid".

ValueMeaning
1Viva: PAYMENT;NET;VAT;TOTAL, cents, YYYYMMDDHHMMSS
2WebEcr: NET;VAT;TOTAL;PAYMENT, cents, YYYYMMDDHHMMSS
3WorldLine: NET;VAT;TOTAL;PAYMENT, cents, YYYYMMDDHHMMSS
4Edps: PAYMENT;NET;VAT;TOTAL, cents, YYYYMMDDHHMMSS
5EpaySoftPos: PAYMENT;NET;VAT;TOTAL, euros ("0.62"), YYYY-MM-DDTHH:MM:SS.000

Example

{
  "nsp": "Viva"
}
markstringOptionalThe myDATA document's ΜΑΡΚ, which becomes the second field of `unsigned_text`, right after the UID.#

The myDATA document's ΜΑΡΚ, which becomes the second field of `unsigned_text`, right after the UID. If you do not have it yet (the ΜΑΡΚ is assigned only after issuance), send `null` or an empty string and the provider forwards an empty value to Oxygen.

When it is used

Optional; send it if the document has already been issued and you have a ΜΑΡΚ, otherwise leave it empty or `null`.

  • up to 50 characters
  • accepts null

Example

{
  "mark": ""
}
issuer_vat_numberstringRequiredThe issuer's ΑΦΜ, a 9-digit Greek VAT number with no `EL` prefix.#

The issuer's ΑΦΜ, a 9-digit Greek VAT number with no `EL` prefix. It is used to compute the document UID (the first field of `unsigned_text`) and must be **the same** VAT number you put on the document you issue afterwards.

  • up to 20 characters

Example

{
  "issuer_vat_number": "<VAT NUMBER>"
}
branch_codeintegerOptionalThe issuer's branch code, with `0` for the head office.#

The issuer's branch code, with `0` for the head office. It is used to compute the document UID, so it must match the branch code you put on the document you issue afterwards.

When it is used

Send `0` for the head office, or the branch code if the signature is for a branch, with the same value the document that follows will carry.

  • minimum -2147483648
  • maximum 2147483647

Example

{
  "branch_code": 0
}
invoice_seriesstringRequiredThe document series (for example `A`).#

The document series (for example `A`). It must be **the same** as the series of the document you issue afterwards; any mismatch changes the UID and AADE rejects the document.

  • up to 50 characters

Example

{
  "invoice_series": "A"
}
invoice_numberstringRequiredThe document number (`aa`, for example `20261004171639` in the form `YYYYMMDDHHMMSS`).#

The document number (`aa`, for example `20261004171639` in the form `YYYYMMDDHHMMSS`). It must be **the same** as the number of the document you issue afterwards; any mismatch changes the UID.

  • up to 50 characters

Example

{
  "invoice_number": "20261004171639"
}
invoice_issued_atdatetimeRequiredThe document's issue date and time, with a timezone (ISO 8601, for example `2026-10-04T17:16:39+03:00`).#

The document's issue date and time, with a timezone (ISO 8601, for example `2026-10-04T17:16:39+03:00`). It must be **the same** as the date of the document you issue afterwards; any mismatch changes the UID.

Example

{
  "invoice_issued_at": "2026-10-04T17:16:39+03:00"
}
invoice_typestringRequiredThe myDATA document type code (for example `1.1` sales invoice, `11.1` retail receipt, `11.4` retail return and food service).#

The myDATA document type code (for example `1.1` sales invoice, `11.1` retail receipt, `11.4` retail return and food service). It must match the type of the document you issue afterwards, otherwise the UID changes.

When it is used

Send the same type as the document you will issue; for food service (`11.4`) the validity window is 2 hours instead of 60.

  • up to 10 characters

Example

{
  "invoice_type": "1.1"
}
invoice_net_amountdecimalRequiredThe document's net value, excluding VAT, in euros.#

The document's net value, excluding VAT, in euros. It goes into `unsigned_text` in cents as an integer for the NSPs `Viva`, `WebEcr`, `WorldLine` and `Edps`, or in euros with 2 decimals for `EpaySoftPos`, and it must match the corresponding value on the document.

  • 12 digits in total
  • 2 decimal places

Example

{
  "invoice_net_amount": "10.00"
}
invoice_vat_amountdecimalRequiredThe document's VAT amount, in euros.#

The document's VAT amount, in euros. It goes into `unsigned_text` in cents as an integer for the NSPs `Viva`, `WebEcr`, `WorldLine` and `Edps`, or in euros with 2 decimals for `EpaySoftPos`, and it must match the corresponding VAT on the document.

  • 12 digits in total
  • 2 decimal places

Example

{
  "invoice_vat_amount": "2.40"
}
invoice_total_amountdecimalRequiredThe document's total value, including VAT, in euros.#

The document's total value, including VAT, in euros. It goes into `unsigned_text` in cents as an integer for the NSPs `Viva`, `WebEcr`, `WorldLine` and `Edps`, or in euros with 2 decimals for `EpaySoftPos`, and it must match the corresponding value on the document.

  • 12 digits in total
  • 2 decimal places

Example

{
  "invoice_total_amount": "12.40"
}
payment_amountdecimalRequiredThe amount charged on the POS for this signature; it goes into `unsigned_text` in cents for the NSPs `Viva`, `WebEcr`, `WorldLine`, `Edps` and in euros with 2 decimals for `EpaySoftPos`.#

The amount charged on the POS for this signature; it goes into `unsigned_text` in cents for the NSPs `Viva`, `WebEcr`, `WorldLine`, `Edps` and in euros with 2 decimals for `EpaySoftPos`. It usually equals `invoice_total_amount`, but is lower when part is paid in cash or across several charges.

  • 12 digits in total
  • 2 decimal places

Example

{
  "payment_amount": "12.40"
}
durationintegerRequiredNot used by flexyThe validity of the payment token in **days** (for example `1` for one day), forwarded to Oxygen as it is.#

The validity of the payment token in **days** (for example `1` for one day), forwarded to Oxygen as it is. With provider `flexy` the actual validity comes from `invoice_type`: 60 hours normally and 2 hours for type `11.4` (food service).

When it is used

The API requires it, but provider `flexy` ignores it and the real validity comes from `invoice_type`; send `1` for compatibility with Oxygen.

  • minimum -2147483648
  • maximum 2147483647

Example

{
  "duration": 1
}
terminal_idstringRequiredThe ID of the POS terminal that will charge the card, placed as the last field of `unsigned_text`, after the amounts.#

The ID of the POS terminal that will charge the card, placed as the last field of `unsigned_text`, after the amounts. With provider `flexy` it is also stored as `issued_to_terminal_id` (Article 8 §5: the EFT/POS the signature was handed to).

  • up to 100 characters

Example

{
  "terminal_id": "<TID>"
}