openapi: 3.1.0
info:
  title: Dokumentacja techniczna integracji z systemem transakcyjnym Axepta.
  version: 1.0.2
  release: |
    #1.0.1
    Dodanie API Raportowego - Rozdziała 10.
    #1.0.2
    Dodanie kanału płatności click2pay dla kart.
    Dodanie funkcjonalności z blickCode. - Rozdział 1.4.3.
    Dodanie opisu sandbox dla BLIK.  - Rozdział 11.2.
    #1.0.3
    Dodanie kanału płatności bnpparibascorpo dla pbl
    Dodanie kolekcji postman

  # --- --- --- --- INTRODUCTION
  description: |
    # Dokumentacja zawiera informacje na temat RESTful API systemu płatności Axepta.
    <br>
    Komunikacja odbywa się poprzez wymianę informacji zapisanych w formacie JSON. 
    <br>
    Każde zapytanie powinno zawierać odpowiednią metodę autoryzacji.
    <br>
    Każdy poprawny adres składa się z trzech części:
      - adresu bazowego zapytania `https://api.axepta.pl/v1`,
      - identyfikatora klienta `/merchant/{merchantId}`,
      - funkcji jednoznacznie określającej zakres danych, których dotyczy zapytanie ( np. `/transaction` lub `/payment`). 

    Każde zapytanie do serwera powinno zawierać dane autoryzacyjne w nagłówkach (**Token autoryzacyjny**).
    > Dane do integracji dostępne są w [panelu administracyjnym Axepta](https://axepta.bnpparibas.pl/)

  # --- --- --- --- CONTAKT
  contact:
    name: Wsparcie techniczne
    email: wsparcie@axepta.pl

# --- --- --- --- EXTERNAL LINKS
x-externalLinks:
- label: Axepta.pl
  url: https://axepta.pl/

# --- --- --- --- SERVERS
servers:
- url: https://api.axepta.pl/v1
  description: Serwer produkcyjny.
- url: https://api.sandbox.axepta.pl/v1
  description: Sandbox - serwer testowy.

# --- --- --- --- SECURITY
security:
- "Token autoryzacyjny": []

# --- --- --- --- TAGS
tags:
- name: transaction
  description: |
    Działania na transakcjach
- name: payment-link
  description: |
    Działania na linkach płatności
- name: refund
  description: |
    Działania związane z wykonaniem zwrotu
- name: profile
  description: |
    Zarządzanie istniejącym profilem
- name: paymentId
  description: |
    Działania na linkach płatności
- name: report
  description: |
    Działania na raportach.
# --- --- --- --- COMPONENTS
components:
  securitySchemes:
    "Token autoryzacyjny":
      type: http
      scheme: bearer
      bearerFormat: http
      # example: rfnqddfumcjcuwrrbzqdgtgj4kbifau5s0n026d43tniao7nfwyu1a5gmg78akl3
  schemas:
    payment-link:
      type: object
      required: [ serviceId, amount, currency, orderId, customer ]
      properties:
        serviceId:
          type: string
          example: 000eec9b-7248-4dae-98f2-56aab6a53927
          maxLength: 36
          format: uuid
          pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
          description: |
            Identyfikator sklepu jako `UUID v4`
        amount:
          type: integer
          description: |
            Kwota transakcji w najmniejszej jednostce waluty np. **grosze**
        currency:
          type: string
          maxLength: 3
          enum: [ PLN, EUR ]
          description: |
            Waluta transakcji w standardzie `ISO 4217`
        orderId:
          type: string
          maxLength: 100
          pattern: "^[A-Za-z0-9#_\\-\\.\\/ \\u00C0-\\u02C0]+$"
          description: |
            Numer zamówienia akceptanta,
            **dopuszczalne znaki**: A-Za-z0-9#_-.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)
        title:
          type: string
          maxLength: 255
          pattern: "^[A-Za-z0-9#_\\-\\.\\/ \\u00C0-\\u02C0]+$"
          description: |
            Tytuł zamówienia, dopuszczalne znaki: A-Za-z0-9#&_-"',./ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne).
        customer:
          type: object
          required: [ firstName, lastName, email ]
          properties:
            firstName:
              type: string
              maxLength: 100
              pattern: "^[A-Za-z0-9#_\\-\\.\\/ \\u00C0-\\u02C0\\u0400-\\u04FF]+$"
              description: |
                Imię klienta,<br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne), 0400 - 04FF (cyrylica)
            lastName:
              type: string
              maxLength: 100
              pattern: "^[A-Za-z0-9#_\\-\\,\\.\\\\\\\\/ \\u00C0-\\u02C0\\u0400-\\u04FF\"']+$"
              description: |
                Nazwisko klienta,<br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne), 0400 - 04FF (cyrylica)
            email:
              type: string
              maxLength: 200
              format: email
              description: |
                Adres e-mail w formacie zgodnym ze standardem `RFC 5322` oraz `RFC 6531`
            phone:
              type: string
              maxLength: 20
              pattern: "^[0-9\\+\\- ]+$"
              description: |
                Numer telefonu,<br> **dopuszczalne znaki**: 0-9+- oraz znak spacji (0x20)
            cid:
              type: string
              maxLength: 36
              pattern: "^[A-Za-z0-9\\x2D]+$"
              description: |
                Identyfikator klienta. (Wymagane podczas płatności `oneclick`, `recurring`), <br> **dopuszczalne znaki**: A-Za-z0-9 oraz myślnik (0x2D)
        returnUrl:
          type: string
          maxLength: 300
          format: uri
          description: |
            Adres powrotu z zewnętrznej strony obsługującej płatność w przypadku nie rozstrzygnięcia statusu transakcji
        successReturnUrl:
          type: string
          maxLength: 300
          format: uri
          description: |
            Adres powrotu z zewnętrznej strony obsługującej płatność w przypadku dokonania płatności z powodzeniem
        failureReturnUrl:
          type: string
          maxLength: 300
          format: uri
          description: |
            Adres powrotu z zewnętrznej strony obsługującej płatność w przypadku wystąpienia błędu płatności
        visibleMethod:
          type: array
          description: |
            Widoczność metod płatności, domyślnie widoczne są wszystkie dostępne dla sklepu. [Opis w punkcie 5.3 Widoczność metod płatności](https://bump.sh/pgw/doc/axepta-api/topic/topic-5-3-widocznosc-metod-platnosci)
        paywall.forceCardChannel:
          type: string
          description: |
            Wymuszenie trybu płatności kartą. Pozwala na inicjalizację płatności kartą w trybie zapisywania profilu kartowego.
            Dostępne wartości: ecom3ds, oneclick, recurring. W przypadku korzystania z oneclick lub recurring. wymagane jest przekazanie parametru customer.cid.
        activeTo:
          type: integer, null
          description: |
            Data ważności transakcji jako unix timestamp w sekundach (czas mierzony w sekundach od początku 1970 roku UTC) (wartość musi być większa, bądz równa: 1 i mniejsza bądź równa 4294967295). Jeżeli nie jest przekazana lub jest null to transakcja ważna jest zawsze. Brak realizacji płatności do tego czasu spowoduje jej anulowanie.
        distributor:
          type: string
          description: |
            Nazwa dystybutora, wartość dopuszczalna: "shoper".
        surcharge:
          type: boolean
          description: |
            Flaga determinujaca czy zostanie użyte obciazenie platnika dla danego zamowienia. Wartość dopuszczalna: 'true', 'false' (wymagane ustawienie flagi surcharge w procesie boardingu).

    deactivate-profile:
      # Dezaktywuje profil
      type: object
      required: [ paymentProfileId ]
      properties:
        paymentId:
          type: string
          maxLength: 36
          format: uuid
          pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
          description: |
            Identyfikator profilu jako `UUID v4`

    transactionId:
      # Pobiera dane transakcji
      type: object
      required: [ paymentId ]
      properties:
        paymentId:
          type: string
          example: 805f9c2c-e7ee-4606-b201-ee09032c49b0
          maxLength: 36
          format: uuid
          pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
          description: |
            Unikalny identyfikator transakcji (UUID v4)

    cancel:
      # Anuluje płatność
      type: object
      required: [ serviceId, paymentId ]
      properties:
        serviceId:
          type: string
          example: 000eec9b-7248-4dae-98f2-56aab6a53927
          maxLength: 36
          format: uuid
          pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
          description: |
            Identyfikator sklepu jako `UUID v4`
        paymentId:
          type: string
          example: 805f9c2c-e7ee-4606-b201-ee09032c49b0
          maxLength: 36
          format: uuid
          pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
          description: |
            Identyfikator linku płatności

    refund:
      # Zwrot
      type: object
      required: [ type, serviceId, amount ]
      properties:
        type:
          type: string
          enum: [ refund ]
          description: |
            Typ akcji
        serviceId:
          type: string
          maxLength: 36
          format: uuid
          pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
          description: |
            Identyfikator sklepu jako `UUID v4`
        amount:
          type: integer
          description: |
            Kwota transakcji w najmniejszej jednostce waluty np. **grosze**

    transaction:
      type: object
      required: [ type, serviceId, clientIp, amount, currency, orderId, paymentMethod, paymentMethodChannel, customer, successReturnUrl, failureReturnUrl ]
      properties:
        type:
          type: string
          enum: [ sale ]
          example: sale
          description: |
            Typ transakcji. Dopuszczalne wartości: sale
        serviceId:
          type: string
          maxLength: 36
          format: uuid
          pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
          description: |
            Identyfikator sklepu jako `UUID v4`
        amount:
          type: integer
          description: |
            Kwota transakcji w najmniejszej jednostce waluty np. **grosze**
        currency:
          type: string
          maxLength: 3
          enum: [ PLN, EUR ]
          description: |
            Waluta transakcji w standardzie `ISO 4217`
        orderId:
          type: string
          maxLength: 100
          pattern: "^[A-Za-z0-9#_\\-\\.\\/ \\u00C0-\\u02C0]+$"
          description: |
            Numer zamówienia akceptanta, dopuszczalne znaki: A-Za-z0-9#_-./ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)        
        title:
          type: string
          maxLength: 255
          pattern: "^[A-Za-z0-9#_\\-\\.\\/ \\u00C0-\\u02C0]+$"
          description: |
            Tytuł transakcji, dopuszczalne znaki: A-Za-z0-9#&_-"',./ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)
        paymentMethod:
          type: string
          description: |
            Metoda realizacji zamówienia. Więcej informacji w rozdziale [1.4 Metody i kanały realizacji transakcji]
        paymentMethodChannel:
          type: string
          description: |
            Oznaczenie kanału płatności. Więcej informacji w rozdziale [1.4 Metody i kanały realizacji transakcji]
        successReturnUrl:
          type: string
          maxLength: 300
          format: uri
          description: |
            Adres powrotu z zewnętrznej strony obsługującej płatność w przypadku dokonania płatności z powodzeniem
        failureReturnUrl:
          type: string
          maxLength: 300
          format: uri
          description: |
            Adres powrotu z zewnętrznej strony obsługującej płatność w przypadku wystąpienia błędu płatności
        returnUrl:
          type: string
          maxLength: 300
          format: uri
          description: |
            Domyślny adres powrotu.
        clientIp:
          type: string
          format: ipv4, ipv6
          description: |
            Rzeczywisty adres IP płatnika podany w protokole `IPv4` lub `IPv6`. Wymagany przy podaniu [blikCode](#operation-post-parameter-transaction-body-application-json-blikCode).
        activeTo:
          type: integer, null
          description: |
            Data ważności transakcji jako unix timestamp w sekundach (czas mierzony w sekundach od początku 1970 roku UTC) (wartość musi być większa, bądz równa: 1 i mniejsza bądź równa 4294967295). Jeżeli nie jest przekazana lub jest null to transakcja ważna jest zawsze. Brak realizacji płatności do tego czasu spowoduje jej anulowanie.
        blikCode:
          type: integer
          maxLength: 6
          description: |
            Wartość kodu blik dla transakcji z przekazaniem kodu po API.
        distributor:
          type: string
          description: |
            Nazwa dystybutora, wartość dopuszczalna: "shoper".
        customer:
          type: object
          required: [ firstName, lastName, email ]
          properties:
            firstName:
              type: string
              maxLength: 100
              description: |
                Imię klienta,<br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne), 0400 - 04FF (cyrylica)
            lastName:
              type: string
              maxLength: 100
              description: |
                Nazwisko klienta,<br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne), 0400 - 04FF (cyrylica)
            email:
              type: string
              maxLength: 200
              format: email
              description: |
                Adres e-mail w formacie zgodnym ze standardem `RFC 5322` oraz `RFC 6531`
            phone:
              type: string
              maxLength: 20
              pattern: "^[0-9\\+\\- ]+$"
              description: |
                Numer telefonu,<br> **dopuszczalne znaki**: 0-9+- oraz znak spacji (0x20)
            cid:
              type: string
              maxLength: 36
              pattern: "^[A-Za-z0-9\\x2D]+$"
              description: |
                Identyfikator klienta/płatnika nadany przez akceptanta, dopuszczalne znaki: A-Za-z0-9 oraz myślnik (0x2D)
            locale:
              type: string
              description: |
                Lokalizacja płatnika, określa język wysyłanej wiadomości mailowej, informującej o rozpoczęciu procesu płatności, dopuszczalne wartości: pl, en.
        card:
          type: object
          required: [ firstName, lastName, number, month, year, cvv ]
          description: |
            Dane dot. płatności kartą. (Wymagane podczas płatności card)   
          properties:
            firstName:
              type: string
              maxLength: 100
              description: |
                Imię właściciela karty, dopuszczalne znaki: A-Za-z0-9#&_-"',./ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)            
            lastName:
              type: string
              maxLength: 100
              description: |
                Nazwisko właściciela karty, dopuszczalne znaki: A-Za-z0-9#&_-"',./ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)
            number:
              type: string
              maxLength: 16
              description: Numer karty
            month:
              type: string
              maxLength: 2
              description: Ważność karty - miesiąc
            year:
              type: string
              maxLength: 4
              description: Ważność karty - rok
            cvv:
              type: string
              maxLength: 4
              description: Kod cvv karty
        additionalData:
          type: object
          description: |
            Informacje o przeglądarce płatnika, wymagane podczas wykonywania płatności kartą z autoryzacją 3ds.

    # --- REPORT--->>

    report:
      type: object
      required: [ uuid, taskName, type, status, settings ]
      properties:
        uuid:
          type: string
          description: |
            UUID raportu
        plannedReportUuid:
          type: string
          description: |
            UUID zaplanowanego raportu (jeśli raport został wygenerowany z zaplanowanego raportu). Będzie `null` dla raportów jednorazowych.
        taskName:
          type: string
          description: |
            Typ zadania raportu
        type:
          type: string
          description: |
            Typ raportu
        status:
          type: string
          description: |
            Status raportu
        settings:
          type: object
          description: |
            Ustawienia raportu
        generatedAt:
          type: number
          description: |
            Timestamp wygenerowania raportu

# --- --- --- --- PATHS --- --- --- --- ENDPOINTS 
paths:
  /merchant/{merchantId}/transaction:
    post:
      tags: [ transaction ]
      summary: Utworzenie transakcji
      description: |
        Zgodnie z wymaganiami PCI DSS (ustalonymi przez organizacje płatnicze) zabronione jest przetwarzanie, przekazywanie czy przechowywanie numerów i innych danych dotyczących kart płatniczych. Jeśli posiadasz właściwy certyfikat PCI DSS i chcesz udostępnić formatkę płatności kartami na stronie Twojego sklepu - prosimy o kontakt z obsługą Axepta.
        W przypadku bezpośredniego przekierowania na formatkę płatności kartami Axepta nie ma takiego wymogu.
      parameters:
      - in: path
        name: merchantId
        schema:
          type: string
        description: Identyfikator klienta
        required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/transaction"
            example:
              type: sale
              serviceId: a3a5b7ad-ab73-46f0-97f2-3238f8bd450d
              amount: 100
              currency: PLN
              title: Title 123
              orderId: 123-123
              paymentMethod: blik
              paymentMethodChannel: blik
              blickCode: 777000
              successReturnUrl: https://domain.com/success
              failureReturnUrl: https://domain.com/failure
              customer:
                firstName: Jan
                lastName: Kowalski
                phone: 48123123123
                email: jan.kowalski@example.com

  /merchant/{merchantId}/transaction/{transactionId}:
    get:
      tags: [ transaction ]
      summary: Pobiera dane transakcji
      description: |
        Pobiera dane transakcji
      parameters:
      - in: path
        name: merchantId
        required: true
        schema:
          type: string
        description: Identyfikator klienta
        example: 000eec9b-7248-4dae-98f2-56aab6a53927
      - in: path
        name: transactionId
        schema:
          type: string
          maxLength: 36
          format: uuid
          pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
        description: Unikalny identyfikator transakcji (UUID v4),
        required: true
        example: 805f9c2c-e7ee-4606-b201-ee09032c49b0

  /merchant/{merchantId}/profile/cid/{cid}:
    get:
      tags: [ profile ]
      summary: Pobranie profilu o podanym cid
      parameters:
      - in: path
        name: merchantId
        schema:
          type: string
        description: Identyfikator klienta
        required: true
      - in: path
        name: cid
        required: true
        schema:
          type: string
          maxLength: 36
          pattern: "^[A-Za-z0-9\\x2D]+$"
        description: Identyfikator płatnika nadany przez akceptanta.

  /merchant/{merchantId}/profile/id/{paymentProfileId}:
    parameters:
    - in: path
      name: merchantId
      schema:
        type: string
      description: Identyfikator klienta
      required: true
    - in: path
      name: paymentProfileId
      required: true
      schema:
        type: string
        maxLength: 36
        pattern: "^[A-Za-z0-9\\x2D]+$"
      description: Identyfikator profilu kartowego,
    get:
      tags: [ profile ]
      summary: Pobranie profilu kartowego o podanym id

    delete:
      tags: [ profile ]
      summary: Dezaktywowanie profilu kartowego o podanym id.
      description: Dezaktywowanie profilu OneClick lub recurring o podanym paymentProfileId.

  /merchant/{merchantId}/profile/deactivate:
    post:
      tags: [ profile ]
      summary: Dezaktywuje profil o podanym w żądaniu identyfikatorze
      parameters:
      - in: path
        name: merchantId
        schema:
          type: string
        description: Identyfikator klienta
        required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/deactivate-profile"
            example:
              paymentProfileId: 000eec9b-7248-4dae-98f2-56aab6a53927

  /merchant/{merchantId}/payment-link:
    post:
      tags: [ payment-link ]
      summary: Utworzenie zamówienia linku płatności
      description: ""
      parameters:
      - in: path
        name: merchantId
        schema:
          type: string
        description: Identyfikator klienta
        required: true
        example: 3hqitucfo8jh5kqlp7s6
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/payment-link"
            example:
              serviceId: a3a5b7ad-ab73-46f0-97f2-3238f8bd450d
              amount: 3000
              currency: PLN
              orderId: 123
              returnUrl: https://domain.com/return
              successReturnUrl: https://domain.com/success
              failureReturnUrl: https://domain.com/failure
              notificationUrl: https://domain.com/notification
              customer:
                firstName: Jan
                lastName: Kowalski
                email: jan.kowalski@example.com

  /merchant/{merchantId}/payment/{paymentId}:
    get:
      tags: [ payment-link ]
      summary: Pobiera dane płatności
      parameters:
      - in: path
        name: merchantId
        schema:
          type: string
        description: Identyfikator klienta
        required: true
      - in: path
        name: paymentId
        schema:
          type: string
        description: Unikalny identyfikator płatności której dotyczy zwrot.
        required: true

  /merchant/{merchantId}/payment/{paymentId}/refund:
    post:
      tags: [ refund ]
      summary: Wykonanie zwrotu płatności
      parameters:
      - in: path
        name: merchantId
        schema:
          type: string
        description: Identyfikator klienta
        required: true
      - in: path
        name: paymentId
        required: true
        schema:
          type: string
          maxLength: 36
          format: uuid
          pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
          description: |
            Identyfikator transakcji jako `UUID v4`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/refund"
            example:
              type: refund
              serviceId: 000eec9b-7248-4dae-98f2-56aab6a53927
              amount: 100

  /merchant/{merchantId}/payment/cancel:
    post:
      tags: [ payment-link ]
      summary: Anuluje link płatności
      parameters:
      - in: path
        name: merchantId
        schema:
          type: string
        description: Identyfikator klienta
        required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/cancel"
            example:
              type: cancel
              serviceId: 000eec9b-7248-4dae-98f2-56aab6a53927
              paymentId: 805f9c2c-e7ee-4606-b201-ee09032c49b0

x-topics:
# --- --- --- --- 1. Statusy

- title: 1.1. Statusy transakcji (transaction).
  content: |
    Transakcje oraz linki płatności mogą przyjmować następujące statusy:

    | Status       | Opis                                               |
    |--------------|----------------------------------------------------|
    | `new`        | Nowa, nieobsłużona transakcja                      |
    | `pending`    | Oczekiwanie na status                              |
    | `rejected`   | Transakcja odrzucona                               |
    | `settled`    | Transakcja zrealizowana                            |
    | `error`      | Błąd w transakcji                                  |
    | `cancelled`  | Transakcja anulowana                               |

- title: 1.2. Statusy zamówień linków płatności - (payment).
  content: |
    # Statusy zamówień linków płatności - (payment).
    Zamówienia mogą przyjmować następujące statusy:

    | Status       | Opis                                               |
    |--------------|----------------------------------------------------|
    | `new`        | Nowe, nieobsłużone zamówienie                      |
    | `pending`    | Oczekiwanie na status                              |
    | `rejected`   | Zamówienie odrzucone                               |
    | `settled`    | Zamówienie zrealizowane                            |
    | `error`      | Błąd zamówienia                                    |
    | `cancelled`  | Zamówienie anulowane                               |

- title: 1.3. Metody autoryzacji.
  content: |
    Nagłówki zapytania (metody autoryzacji)
    Integracja pozwala na autoryzację za pomocą tokenu autoryzacyjnego. 
    Token można znaleźć w [panelu administracyjnym Axepta](https://axepta.bnpparibas.pl/), w części `Ustawienia` a następnie w zakładce `Klucze API`.
    Aby dokonać autoryzacji zapytania należy w nagłówkach żądania do serwera umieścić dane autoryzacyjne:

    ```
    Accept: application/json
    Content-Type: application/json
    Authorization: Bearer {token}
    ```

    Kody odpowiedzi HTTP:

    | Kod HTTP | Znaczenie                                                             |
    |----------|-----------------------------------------------------------------------|
    | `200`    | Autoryzacja poprawna                                                  |
    | `401`    | Nieautoryzowany dostęp, żądanie zasobu, który wymaga uwierzytelnienia |
    | `500`    | Błąd serwera                                                          |

    >Przykładowy nagłówek zapytania
    ```
    Accept: application/json
    Content-Type: application/json
    Authorization: Bearer ad8y3hdoashco8fh49fhiahfb237f8hoihsd0f2hfikljf023h8
    ```

- title: 1.4. Metody i kanały realizacji transakcji
  content: |
    Transakcje można realizować następującymi metodami:

    | Nazwa            | Wartość parametru `paymentMethod` | Wartość parametru `paymentMethodChannel`|
    |------------------|-----------------------------------|-----------------------|
    | Przelewy online. | `pbl`                             | Tabela poniżej        |
    | Płatność kart.   | `card`                            | Tabela poniżej        |
    | Płatność BLIK.   | `blik`                            | `blik`                |

- title: 1.4.1. Przelew online Pay By Link
  content: |
    Przelewy Pay By Link można realizować za pomocą następujących usług banków:

    | Wartość parametru   | Nazwa usługi                                                 |
    |---------------------|--------------------------------------------------------------|
    | `bnpparibas`        | Płacę z BNP Paribas (GOonline)                               |
    | `bnpparibascorpo`   | Płacę z BNP Paribas (GOonline Biznes)                        |
    | `mtransfer`         | mTransfer - mBank                                            |
    | `bzwbk`             | Przelew24 - Erste                                                   |
    | `pekao24`           | Pekao24Przelew - Bank Pekao                                  |
    | `inteligo`          | Płacę z Inteligo                                             |
    | `ing`               | Płać z ING                                                   |
    | `ipko`              | Płać z iPKO                                                  |
    | `getin`             | Płacę z Velo Bank                                            |
    | `creditagricole`    | Credit Agricole e-przelew                                    |
    | `alior`             | Płacę z Alior Bankiem                                        |
    | `pbs`               | Bank Nowy BFG                                                |
    | `millennium`        | Millennium - płatności internetowe                           |
    | `citi`              | Przelew z Citi Handlowego                                    |
    | `bos`               | Płać z BOŚ                                                   |
    | `pocztowy`          | Pocztowy24                                                   |
    | `plusbank`          | Płacę z Plus Bank                                            |
    | `bs`                | Bank Spółdzielczy                                            |
    | `bspb`              | Bank Spółdzielczy w Brodnicy                                 |
    | `nest`              | nestPrzelew                                                  |

- title: 1.4.2. Płatność kartą.
  content: |
    Płatność kartą można realizować za pomocą następujących usług:

    | Wartość parametru   | Nazwa usługi                            |
    |---------------------|-----------------------------------------|
    | `ecom3ds`           | Płatność kartą 3DS                      |
    | `oneclick`          | Płatność za pomocą usługi `oneclick`    |
    | `recurring`         | Płatność za pomocą usługi `recurring`   |
    | `click2pay`         | Płatność za pomocą usługi `click2pay`   |

- title: 1.4.3. Płatność BLIK.
  content: |
    Płatność BLIK można realizować z pomocą następujących sposóbów:

    | Wartość parametru 'paymentMethod'        |	Wartość parametru 'paymentMethodChannel'  |
    |------------------------------------------|--------------------------------------------|
    | 'blik'                                   | 'blik'                                     |

    >Utworzenie transakcji z dodatkowym parametrem 'blikCode' spowoduje wysłanie kodu do BLIKa

    | Parametr                        |	Opis                                       |
    |---------------------------------|--------------------------------------------|
    | 'blikCode'                      | 6 znaków, znaki z zakresu 0-9              |

# --- --- --- --- 2. endpointy

- title: 2. Metody RESTful API
  content: |
    **Produkcyjny URL:** `https://api.axepta.pl` <br>
    **Sandbox URL:** `https://api.sandbox.axepta.pl`

    | Endpoint | Zastosowanie | Metoda |
    |----------|--------------|--------|
    | `/{merchantId}/transaction`                           | Tworzy nową transakcję                                                                                | `POST` |
    | `/{merchantId}/transaction/{transactionId}`           | Pobiera dane transakcji                                                                               | `GET`  |
    | `/{merchantId}/payment-link`                          | Tworzy nowy link płatności                                                                            | `POST` |
    | `/{merchantId}/payment/{paymentId}/refund`            | Wykonanie zwrot płatności                                                                            | `POST` |
    | `/{merchantId}/payment/{paymentId}`                   | Pobiera dane płatności                                                                                | `GET`  |
    | `/{merchantId}/transaction/profile`                   | Obciąża istniejący profil kartowy                                                                     | `POST` |
    | `/{merchantId}/profile/cid/{cid}`                     | Pobiera profile o podanym `cid`                                                                       | `GET`  |
    | `/{merchantId}/profile/id/{paymentProfileId}`         | Pobiera profil o podanym `id`                                                                         | `GET`  |
    | `/{merchantId}/profile/deactivate`                    | Dezaktywuje profil o podanym w żądaniu identyfikatorze                                                | `POST` |
    | `/{merchantId}/profile/id/{paymentProfileId}`         | Dezaktywuje profil o podanym `paymentProfileId`                                                       | `DELETE` |
    | `/{merchantId}/payment/cancel`                        | Anuluje link płatności                                                                                | `POST` |

    gdzie:

    - `merchantId` - identyfikator klienta,
    - `serviceId` - identyfikator sklepu z którym związane są określone metody realizacji transakcji (UUID v4),
    - `cid` - identyfikator klienta/płatnika nadany przez akceptanta,
    - `transactionId` - unikalny identyfikator transakcji (UUID v4),
    - `paymentProfileId` - identyfikator profilu kartowego,
    - `paymentId` - unikalny identyfikator linku płatności (UUID v4).

# --- --- --- --- 3. Transakcje

- title: 3. Tworzenie nowej transakcji przez API
  content: |
    
    > Zgodnie z wymaganiami PCI DSS (ustalonymi przez organizacje płatnicze) zabronione jest przetwarzanie, przekazywanie czy przechowywanie numerów i innych danych dotyczących kart płatniczych. Jeśli posiadasz właściwy certyfikat PCI DSS i chcesz udostępnić formatkę płatności kartami na stronie Twojego sklepu - prosimy o kontakt z obsługą Axepta.
    <br/>
    W przypadku bezpośredniego przekierowania na formatkę płatności kartami Axepta nie ma takiego wymogu.

    W celu utworzenia nowej transakcji należy za pomocą metody `POST` przesłać komunikat zawierający informacje o nowym zamówieniu na endpoint API:

    ```
    https://api.axepta.pl/v1/merchant/{merchantId}/transaction
    ```

    gdzie:
    - `merchantId` - identyfikator klienta.

- title: 3.1. HTTP Request transaction API
  content: |
    ### Przykładowy adres na który należy wysłać żądanie POST

    ```
    https://api.axepta.pl/v1/merchant/6yt3gjtm9p7b8h9xsdqz/transaction
    ```

    ### Payload zapytania

    ```json
    {
        "type": "sale",
        "serviceId": "62f574ed-d4ad-4a7e-9981-89ed7284aaba",
        "amount": 9900,
        "currency": "PLN",
        "orderId": "12",
        "clientIp": "192.168.10.2",
        "paymentMethod": "pbl",
        "paymentMethodChannel": "bnpparibas",
        "successReturnUrl": "https://domain.com/success",
        "failureReturnUrl": "https://domain.com/failure",
        "customer": {
            "firstName": "Maciej",
            "lastName": "Kowalski",
            "email": "jan.kowalski@example.com"
        }
    }
    ```

          
    ### Parametry payload


    | Parametr            | Typ         | Wymagany | Opis           |
    |---------------------|-------------|-------------------|----------------|
    | `type`              | string      | ✔️        | Typ transakcji. <br>**Dopuszczalne wartości**: `sale`. |
    | `serviceId`         | string(36)  | ✔️        | identyfikator sklepu jako UUID v4. |
    | `clientIp`          | string      | ✔️        | Adres IP klienta w standardzie IPv4 lub IPv6. |
    | `amount`            | integer(1-999999999)     | ✔️        | Kwota transakcji w najmniejszej jednostce waluty np. grosze. |
    | `currency`          | string(3)   | ✔️        | Waluta transakcji w standardzie ISO 4217. |
    | `orderId`           | string(100) | ✔️        | Numer zamówienia akceptanta, <br> **dopuszczalne znaki**: A-Za-z0-9#_-.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `title`             | string(255) | -             | Tytuł transakcji, <br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `paymentMethod`     | string      | ✔️        | Metoda realizacji zamówienia. Więcej informacji w rozdziale [1.4 Metody i kanały realizacji transakcji] |
    | `paymentMethodChannel` | string      | ✔️        | Oznaczenie kanału płatności. Więcej informacji w rozdziale [1.4 Metody i kanały realizacji transakcji]|
    | `successReturnUrl`  | string(300) | ✔️        | Adres powrotu z zewnętrznej strony obsługującej płatność w przypadku dokonania płatności z powodzeniem. |
    | `failureReturnUrl`  | string(300) | ✔️        | Adres powrotu z zewnętrznej strony obsługującej płatność w przypadku wystąpienia błędu płatności. |
    | `returnUrl`  | string(300) | ✔️        | Domyślny adres powrotu. |
    | `customer`          | object      | ✔️        | Dane klienta. |
    | `billing`           | object      | -             | Dane płatnika. |
    | `shipping`          | object      | -             | Dane dotyczące dostawy. |
    | `card`              | object      | -             | Dane dot. płatności kartą. (Wymagane podczas płatności `card`)|
    | `additionalData`    | object      | -             | Informacje o przeglądarce płatnika, wymagane podczas wykonywania płatności kartą z autoryzacją 3ds. |
    | `activeTo`           | integer, null       | -             | Data ważności transakcji jako unix timestamp w sekundach (czas mierzony w sekundach od początku 1970 roku UTC) <br>(**wartość musi być większa, bądz równa: 1 i mniejsza bądź równa 4294967295**). Jeżeli nie jest przekazana lub jest null to transakcja ważna jest zawsze. Brak realizacji płatności do tego czasu spowoduje jej anulowanie.
    | `distributor`           | string      | -             | Nazwa dystybutora, wartość dopuszczalna: "shoper".|
    | `surcharge`           | boolean      | -             | flaga determinujaca czy zostanie użyte obciazenie platnika dla danej transkacji. Wartość dopuszczalna: 'true', 'false'  (wymagane ustawienie flagi surcharge w procesie boardingu). |
    | `blikCode`           | integer(6)      | -             | Wartość kodu blik dla transakcji z przekazaniem kodu po API.|

    >Jeżeli w zapytaniu wystąpi parametr, `billing`, `shipping` lub `card` konieczne jest dostarczenie dodatkowych parametrów, opisanych poniżej.

    <br></br>

    #### customer

    | Parametr    | Typ         | Wymagany | Opis                   |
    |-------------|-------------|-------------------|------------------------|
    | `firstName` | string(100) | ✔️        | Imię klienta,<br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `lastName`  | string(100) | ✔️        | Nazwisko klienta,<br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `cid`       | string(36) | -             | Identyfikator klienta/płatnika nadany przez akceptanta, <br> **dopuszczalne znaki**: A-Za-z0-9 oraz myślnik (0x2D) |
    | `phone`     | string(20)  | -             | Numer telefonu,<br> **dopuszczalne znaki**: 0-9+- oraz znak spacji (0x20).        |
    | `email`     | string(200) | ✔️        | Adres email.           |
    | `locale`    | string(2)   | -             | Lokalizacja płatnika, określa język wysyłanej wiadomości mailowej, informującej o rozpoczęciu procesu płatności, <br> **dopuszczalne wartości**: `pl`, `en`. |

    Domyślnym językiem wysyłanej wiadomości mailowej jest język polski dla transakcji w PLN, oraz język angielski dla pozostałych walut.

    #### billing

    | Parametr            | Typ         | Wymagany | Opis              |
    |---------------------|-------------|-------------------|-------------------|
    | `firstName`         | string(100) | ✔️        | Imię klienta, <br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `lastName`          | string(100) | ✔️        | Nazwisko klienta, <br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `company`           | string(200) | -             | Nazwa firmy,<br>*Dopuszczalne znaki*: A-Za-z0-9-"'/,. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)      |
    | `street`            | string(200) | -             | Ulica, <br>*Dopuszczalne znaki*: A-Za-z0-9-"'/,. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)       |
    | `city`              | string(100) | -             | Miasto, <br>*Dopuszczalne znaki*: A-Za-z0-9-"'/,. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)             |
    | `region`            | string(100) | -             | Region, <br>*Dopuszczalne znaki*: A-Za-z0-9-"'/,. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)                 |
    | `postalCode`        | string(30)  | -             | Kod pocztowy, <br>*Dopuszczalne znaki*: A-Za-z0-9-"'/,. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)      |
    | `countryCodeAlpha2` | string(2)  | -             | Kod kraju Alpha2. |

    #### shipping

    | Parametr            | Typ         | Wymagany | Opis              |
    |---------------------|-------------|-------------------|-------------------|
    | `firstName`         | string(100) | ✔️        | Imię klienta, <br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `lastName`          | string(100) | ✔️        | Nazwisko klienta,<br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `company`           | string(200) | -             | Nazwa firmy,<br>*Dopuszczalne znaki*: A-Za-z0-9-"'/,. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)      |
    | `street`            | string(200) | -             | Ulica, <br>*Dopuszczalne znaki*: A-Za-z0-9-"'/,. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)           |
    | `city`              | string(100) | -             | Miasto, <br>*Dopuszczalne znaki*: A-Za-z0-9-"'/,. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)      |
    | `region`            | string(100) | -             | Region, <br>*Dopuszczalne znaki*: A-Za-z0-9-"'/,. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)                |
    | `postalCode`        | string(30)  | -             | Kod pocztowy, <br>*Dopuszczalne znaki*: A-Za-z0-9-"'/,. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne)       |
    | `countryCodeAlpha2` | string(2)   | -             | Kod kraju Alpha2. |

    #### card


    | Parametr            | Typ         | Wymagany | Opis              |
    |---------------------|-------------|-------------------|-------------------|
    `firstName`         | string(100) | ✔️        | Imię właściciela karty,<br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `lastName`          | string(100) | ✔️        | Nazwisko właściciela karty,<br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `number`            | string(16)  | ✔️        | Numer karty                    |
    | `month`             | string(2)   | ✔️        | Ważność karty - miesiąc        |
    | `year`              | string(4)   | ✔️        | Ważność karty - rok            |
    | `cvv`               | string(4)   | ✔️        | Kod cvv karty                  |   

- title: 3.2. Dane przeglądarki
  content: |
    W przypadku generowania płatności kartą, która wymaga autoryzacji metodą 3D Secure, należy pobrać i przekazać informacje na temat przeglądarki płatnika w dodatkowym obiekcie `additionalData`.

    Struktura wygląda w następujący sposób:

    | Parametr            | Typ         | Wymagany | Opis                           |
    |---------------------|-------------|-------------------|--------------------------------|
    |`browser`            | object| ✔️ | Informacje na temat przeglądarki płatnika |
    |`browser.ip`         | string | ✔️ |Adres IP. Dopuszczalne wartości: "ipv4", "ipv6" |
    |`browser.language`| string | ✔️ |Język przeglądarki określony w formacie UNICODE np. "pl-PL" |
    |`browser.jsEnabled`  | boolean | ✔️ |Określa, czy w przeglądarce włączona jest obsługa JavaScript|
    |`browser.timezoneOffset`| integer | ✔️ |Wartość Time-zone offset pomiędzy UTC, a lokalnym czasem przeglądarki cardholdera w minutach.|
    |`browser.userAgent`  | string | ✔️ |Informacja o używanej aplikacji klienckiej|
    |`browser.accept`     | string | ✔️ |Dokładna zawartość nagłówka http accept headers, typ MIME|
    |`browser.javaEnabled`| boolean | ✔️ |Określa, czy w przeglądarce włączona jest obsługa Java|
    |`browser.screenColorDepth`| integer | ✔️ |Bit głębi koloru dla wyświetlania obrazków w bitach na pixel, pozyskiwana z przeglądarki cardholdera, skala: 1-48 bits|
    |`browser.screenHeight`| integer | ✔️ |Wysokość okna przeglądarki w px|
    |`browser.screenWidth`| integer | ✔️ |Szerokość okna przeglądarki w px|




    #### Przykład przekazywanego obiektu

    ```json
    "additionalData": {
        "browser": {
                "ip": "127.0.0.1",
                "language": "pl-PL",
                "jsEnabled": true,
                "timezoneOffset": 100,
                "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome 87.0.4280.66 Safari/537.36",
                "accept": "application/json, text/javascript, */*; q=0.01",
                "javaEnabled": false,
                "screenColorDepth": 24,
                "screenHeight": 1080,
                "screenWidth": 2560
            }
        }
    ```

- title: 3.3. HTTP Response
  content: |
    ### Odpowiedź serwera

    W przypadku wykonania poprawnego zapytania rejestrującego nowe zamówienie serwer odpowie statusem HTTP `200` oraz informacją o nowo utworzonej transakcji:

    ```json
    {
        "status": "SUCCESS",
        "data": {
            "transaction": {
                "id": "21090680-8938-467b-a53e-a68862356e2e",
                "type": "sale",
                "status": "pending",
                "source": "api",
                "createdAt": 1688379004,
                "modifiedAt": 1688379004,
                "notificationUrl": "https://1234.requestcatcher.com/",
                "serviceId": "3283bb82-1203-4064-86ad-27868f985769",
                "amount": 10000,
                "currency": "PLN",
                "orderId": "1",
                "paymentMethod": "pbl",
                "paymentMethodChannel": "ing",
                "payment": {
                    "id": "8254d179-9063-47a2-adb4-5d8322679378",
                    "status": "new"
                }
            },
            "action": {
                "type": "redirect",
                "url": "https://paywall.sandbox.axepta.pl/sandbox/8254d179-9063-47a2-
                        adb4-5d8322679378/21090680-8938-467b-a53e-a68862356e2e",
                "method": "GET",
                "contentType": "",
                "contentBodyRaw": ""
            },
            "omG": "G9q"
        }
    }

    ```



    W odpowiedzi otrzymujemy obiekty: `transaction` oraz `action`.

    Obiekt `transaction` jest identyczny z wysłanym w zapytaniu rejestrującym zamówienie i zawiera kilka dodatkowych parametrów:

    | Parametr   | Typ     | Opis |
    |------------|---------|-------------------------------------------------------------------------------|
    | `id`       | string  | Identyfikator transakcji w formacie UUID v4. Unikalny dla każdego zamówienia. |
    | `status`   | string  | Status zamówienia.                                                            |
    | `source`   | string  | Źródło zamówienia. Może posiadać wartości: `api` lub `web`.                   |
    | `createdAt`  | integer | Data utworzenia zamówienia w formacie UNIX TIMESTAMP czasu UTC.               |
    | `notificationUrl` | string | Adres notyfikacji |
    | `modifiedAt` | integer | Data ostatniej zmiany statusu transakcji w formacji UNIX TIMESTAMP czasu UTC. |
    | `payment`  | object  | Dane płatności do której przypisana jest transakcja                           |

    Drugim dodatkowym obiektem jest `action`. Obiekt ten wystąpi tylko w przypadku konieczności przekierowania płatnika na zewnętrzną stronę jak to ma miejsce w przypadku płatności `Pay-By-Link`.
    Obiekt ten zawiera dodatkowe pola których znaczenie jest opisane poniżej:


    | Parametr         | Typ    | Opis                 |
    |------------------|--------|----------------------|
    | `type`           | string | Typ akcji. |
    | `url`            | string | W przypadku konieczności wykonania przekierowania płatnika na inną stronę (np. banku) adres URL. |
    | `method`         | string | Metoda POST lub GET. |
    | `contentType`    | string | Pozycja w nagłówku zapytania do banku określająca typ payloadu. |
    | `contentBodyRaw` | string | Payload zapytania.   |



    ### Statusy HTTP

    | Kod HTTP | Znaczenie                                                                |
    |----------|--------------------------------------------------------------------------|
    | `200`    | Zapytanie wykonane poprawnie. Utworzono transakcję                       |
    | `400`    | Błędne żądanie, niepoprawny payload żądania.                             |
    | `401`    | Nieautoryzowany dostęp. Żądanie zasobu, który wymaga uwierzytelnienia.   |
    | `403`    | Brak uprawnień do wykonania żądania.                                     |
    | `404`    | Nieznany zasób.                                                          |
    | `422`    | Payload jest poprawny ale nie zawiera wymaganaych parametrów.            |
    | `500`    | Błąd serwera.                                                            |
    | `503`    | System niedostępny.  

- title: 3.4 Multiwypłaty
  content: |
    Opcja dostępna w przypadku włączonej funkcji multiwypłaty. Tylko dla rachunków w banku BNP Paribas.
    Wykonujemy transakcje zgodnie z opisem punktu 3.1. z jednym dodatkowym parametrem w obiekcie `data.multipayout[]`:

    | Parametr   | Typ     | Wymagany | Opis |
    |------------|---------|-----|-------------------------------------------------------------------------------|
    | `iban`       | string  | ✔️ | Numer konta bankowego |
    | `amount`            | integer(1-999999999)     | ✔️        | Kwota transakcji w najmniejszej jednostce waluty np. grosze. |
    | `label`     | string  | ✔️ | Nazwa odbiorcy (max 35 znaków), *Dopuszczalne znaki*: A-Za-z0-9-"',. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne), |
    | `title`     | string  | - | Tytuł przelewu (max 105 znaków), *Dopuszczalne znaki*: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne), parametr opcjonalny. Jego obecność powoduje wyodrębnienie danej transakcji na koncie odbiorcy. *Ważne:* Podanie parametru dla jednego elementu warunkuje konieczność dostarczenia go dla pozostałych. |

    >W przypadku, gdy suma kwot z pól `amount`, w parametrze `multipayout` jest niższa niż całkowita suma zamówienia, reszta śródków trafi na domyślny rachunek właściciela sklepu.

    > Minimalna i maksymalna kwota transakcji jest podana w tabeli w punkcie [11. Minimalne i maksymalne wartości kwot transakcji, zwrotów].




    #### Przykład zapytania:

    ```json
    {
            "type": "sale",
            "serviceId": "62f574ed-d4ad-4a7e-9981-89ed7284aaba",
            "amount": 9900,
            "currency": "PLN",
            "orderId": "12",
            "clientIp": "192.168.10.2",
            "paymentMethod": "pbl",
            "paymentMethodChannel": "bnpparibas",
            "successReturnUrl": "https://domain.com/success",
            "failureReturnUrl": "https://domain.com/failure",
            "customer": {
                "firstName": "Maciej",
                "lastName": "Kowalski",
                "email": "jan.kowalski@example.com"
            },
              "data": {
                  "multipayout": [
              {
                  "iban": "PL55105000026800208114085773",
                  "amount": 100,
                  "label": "Nazwa firmy 0"
              },
                {
                  "iban": "PL55105000026800208114085773",
                  "amount": 200,
                  "label": "Nazwa firmy 1"
                }
            ]
        }
    }
    ```

# --- --- --- --- 4. Zwroty

- title: 4. Wykonanie zwrotu
  content: |
    > Podczas wykonywania wielu transakcji zwrotu jednocześnie, należy wprowadzić co najmniej 5-cio sekundowe opóźnienie pomiędzy kolejnymi transakcjami.

    > Zwrot wykonywany jest dla najwyższej wartością transakcji przypisanej do danej płatności. Akcję można wykonać, zanim dana płatność zostanie w całości zrealizowana.

    Poprawne wykonanie zwrotu polega na wysłaniu żądania metodą POST na adres: 

    ```
    https://api.axepta.pl/v1/merchant/{merchantId}/payment/{paymentId}/refund
    ```

    gdzie:  

    - `merchantId` - identyfikator klienta,
    - `paymentId` - unikalny identyfikator płatności której dotyczy zwrot.

- title: 4.1 HTTP Request dla wykonania zwrotu
  content: |
    ### Przykładowy adres na który należy wysłać żądanie POST

    ```
    https://api.axepta.pl/v1/merchant/6yt3gjtm9p7b8h9xsdqz/payment/925767db-962a-49ee-916e-783de9b62a73/refund
    ```

    ### Payload zapytania

    ```json
    {
      "type": "refund",
      "serviceId": "000eec9b-7248-4dae-98f2-56aab6a53927",
      "amount": 100
    }
    ```

    ### Parametry payload

    | Parametr            | Typ         | Wymagany | Opis  |
    |---------------------|-------------|-------------------|-------|
    | `type`              | string      | ✔️        | Typ transakcji. <br>**Dopuszczalne wartości**: `refund`. |
    | `serviceId`         | string(36)  | ✔️        | identyfikator sklepu jako UUID v4. |
    | `amount`            | integer(1-999999999)     | ✔️        | Kwota transakcji w najmniejszej jednostce waluty np. grosze. |

- title: 4.2 HTTP Response
  content: |
    ### Odpowiedź serwera

    W przypadku wykonania poprawnego zwrotu serwer odpowie statusem HTTP `200`:

    ```json
    {
        "status": "SUCCESS",
        "data": {
            "paymentRefundId": "e6853cef-7d1b-409f-81c4-bab92e4fb75z",
            "serviceId": "000eec9b-7248-4dae-98f2-56aab6a53927",
            "paymentId": "925767db-962a-49ee-916e-783de9b62a73",
            "amount": 100,
            "amountRefunded": 0,
            "status": "pending",
            "transactions": [
                {
                    "transaction": {
                        "id": "5023f30e-9909-41bd-a8a8-9cc9b161badf",
                        "type": "refund",
                        "status": "new",
                        "source": "api",
                        "createdAt": 1650024191,
                        "modifiedAt": 1650024191,
                        "serviceId": "000eec9b-7248-4dae-98f2-56aab6a53927",
                        "amount": 100,
                        "currency": "PLN",
                        "orderId": "1",
                        "paymentMethod": "blik",
                        "paymentMethodChannel": "blik",
                        "payment": {
                            "id": "925767db-962a-49ee-916e-783de9b62a73",
                            "status": "settled"
                        }
                    }
                }
            ]
        }
    }
    ```

# --- --- --- --- 5. Zamówienia

- title: 5. Tworzenie nowego linku płatności przez API
  content: |
    W celu utworzenia nowego linku płatności należy za pomocą metody `POST` przesłać komunikat zawierający informacje o nowym linku płatności na endpoint API:

    ```
    https://api.axepta.pl/v1/merchant/{merchantId}/payment-link
    ```

    gdzie:
    * `merchantId` - identyfikator klienta.

- title: 5.1. HTTP Request
  content: |
    ### Przykładowy adres na który należy wysłać żądanie POST

    ```
    https://api.axepta.pl/v1/merchant/6yt3gjtm9p7b8h9xsdqz/payment-link
    ```

    ### Payload zapytania

    ```json
    {
      "serviceId": "62f574ed-d4ad-4a7e-9981-89ed7284aaba",
      "amount": 1000,
      "currency": "PLN",
      "orderId": "139",
      "successReturnUrl": "https://domain.com/success",
      "failureReturnUrl": "https://domain.com/failure",
      "customer": {
          "firstName": "Jan",
          "lastName": "Kowalski",
          "email": "jan.kowalski@example.com"
        }
    }
    ```



    ### Parametry payload

    | Parametr            | Typ         | Wymagany | Opis  |
    |---------------------|-------------|-------------------|-------|
    | `serviceId`         | string(36)  | ✔️        | identyfikator sklepu jako UUID v4. |
    | `amount`            | integer(1-999999999)     | ✔️        | Kwota transakcji w najmniejszej jednostce waluty np. grosze. |
    | `currency`          | string(3)   | ✔️        | Waluta transakcji w standardzie ISO 4217. |
    | `orderID`           | string(100) | ✔️        | Numer zamówienia akceptanta, <br> **dopuszczalne znaki**: A-Za-z0-9#_-.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `title`             | string(255) | -             | Tytuł zamówienia, <br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `returnUrl`         | string(300) | -             | Adres powrotu z zewnętrznej strony obsługującej płatność w przypadku nie rozstrzygnięcia statusu transakcji. |
    | `successReturnUrl`  | string(300) | -             | Adres powrotu z zewnętrznej strony obsługującej płatność w przypadku dokonania płatności z powodzeniem. |
    | `failureReturnUrl`  | string(300) | -             | Adres powrotu z zewnętrznej strony obsługującej płatność w przypadku wystąpienia błędu płatności. |
    | `customer`          | object      | ✔️        | Dane klienta. |
    | `activeTo`           | integer, null       | -             | Data ważności transakcji jako unix timestamp w sekundach (czas mierzony w sekundach od początku 1970 roku UTC) <br>(**wartość musi być większa, bądz równa: 1 i mniejsza bądź równa 4294967295**). Jeżeli nie jest przekazana lub jest null to transakcja ważna jest zawsze. Brak realizacji płatności do tego czasu spowoduje jej anulowanie.|
    | `paywall.forceCardChannel`     | string  | -             | Wymuszenie trybu płatności kartą. Pozwala na inicjalizację płatności kartą w trybie zapisywania profilu kartowego. <br> **Dostępne wartości:** `ecom3ds`, `oneclick`, `recurring`. W przypadku korzystania z `oneclick` lub `recurring`. wymagane jest przekazanie parametru `customer.cid`. |
    | `distributor`           | string      | -             | Nazwa dystybutora, wartość dopuszczalna: "shoper".|
    | `visibleMethod`        | array      | -             | Widoczność metod płatności, domyślnie widoczne są wszystkiedostępne dla sklepu.Opis w punkcie 5.3 |
    | `surcharge`           | boolean      | -             | flaga determinujaca czy zostanie użyte obciazenie platnika dla danego zamowienia. Wartość dopuszczalna: 'true', 'false' (wymagane ustawienie flagi surcharge w procesie boardingu). |



    Parametry dla `customer`:

    | Parametr    | Typ         | Wymagany | Opis                   |
    |-------------|-------------|-------------------|------------------------|
    | `firstName` | string(100) | ✔️        | Imię klienta, <br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `lastName`  | string(100) | ✔️        | Nazwisko klienta, <br> **dopuszczalne znaki**: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    | `email`     | string(200) | ✔️        | Adres email.           |
    | `phone`     | string(20)  | -          | Numer telefonu, <br> **dopuszczalne znaki**: 0-9+- oraz  znak spacji (0x20). |
    | `cid`       | string(36) | -          | Identyfikator klienta/płatnika nadany przez akceptanta. (Wymagane podczas płatności oneclick, recurring),<br> **dopuszczalne znaki**: A-Za-z0-9 oraz myślnik (0x2D) |

- title: 5.2. HTTP Response
  content: |
    ### Odpowiedź serwera

    W przypadku wykonania poprawnego zapytania rejestrującego nowy link płatności serwer odpowie statusem HTTP `200` oraz informacją o nowo utworzonym linku płatności:

    ```json
    {
        "status": "SUCCESS",
        "data": {
            "paymentLink": {
                "paymentId": "58b1c723-d99d-4fb3-a597-eaac08846a90",
                "url": "https://paywall.int.axepta.pl/pay/58b1c723-d99d-4fb3-a597-eaac08846a90"
            }
        }
    }
    ```

    W odpowiedzi otrzymujemy obiekt `status` informujący o powodzeniu operacji, oraz `data.paymentLink` z zawartością:

    | Parametr   | Typ     | Opis                                              |
    |------------|---------|---------------------------------------------------|
    | `paymentId` | string  | Identyfikator płatności w formacie UUID v4. Unikalny dla każdego zamówienia. |
    | `url`      | string  | Adres URL linku płatności. |


    ### Statusy HTTP

    | Kod HTTP | Znaczenie                                                                |
    |----------|--------------------------------------------------------------------------|
    | `200`    | Zapytanie wykonane poprawnie. Utworzono transakcję                       |
    | `400`    | Błędne żądanie, niepoprawny payload żądania.                             |
    | `401`    | Nieautoryzowany dostęp. Żądanie zasobu, który wymaga uwierzytelnienia.   |
    | `403`    | Brak uprawnień do wykonania żądania.                                     |
    | `404`    | Nieznany zasób.                                                          |
    | `422`    | Payload jest poprawny ale nie zawiera wymaganaych parametrów.            |
    | `500`    | Błąd serwera.                                                            |
    | `503`    | System niedostępny.                                                      |

- title: 5.3. Widoczność metod płatności
  content: |
    Istnieje możliwośc zadeklarowania widocznych metod płatności na bramcę, przez użycie dodatkowego parametru `visibleMethod`. 
    <br>
    Domyślnie są widoczne wszytkie metody płatności dostępne na sklepie.

    | Wartość    |Opis |
    |------------|-----------------------------------|
    | `pbl`      |Szybkie przelewy|
    | `blik`     | Blik |
    | `card`     | Płatność kartami |
    | `wallet`   | Płatność portfelem GooglePay i ApplePay|


    #### Przykład struktury:

    ```json
        "visibleMethod": [
            "pbl",
            "blik",
            "card",
            "wallet"
            ]
    ```

- title: 5.4. Multiwypłaty
  content: |
    Opcja dostępna w przypadku włączonej funkcji multiwypłaty.
    Tworzymy link płatności zgodnie z opisem punktu 5. wraz z dodatkowym parametrem `multipayout`:

    | Parametr   | Typ     | Wymagany | Opis |
    |------------|---------|---------|-------------------------------------------------------------------------------|
    | `iban`       | string(28)  | ✔️  | Numer konta bankowego |
    | `amount`            | integer(1-999999999)     | ✔️        | Kwota transakcji w najmniejszej jednostce waluty np. grosze. |
    | `label`       | string(35)  |  ✔️  | Nazwa odbiorcy, <br>*Dopuszczalne znaki*: A-Za-z0-9-"',. oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne), |
    | `title`       | string(105)  |  -  | Tytuł przelewu, <br>*Dopuszczalne znaki*: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne), parametr opcjonalny. Jego obecność powoduje wyodrębnienie danej transakcji na koncie odbiorcy. <br/>**Ważne:** Podanie parametru dla jednego elementu warunkuje konieczność dostarczenia go dla pozostałych. |


    #### Przykład struktury:

    ```json
    {
        "multipayout": [
            {
                "iban": "PL55105000026800208114085773",
                "amount": 100,
                "label": "Nazwa firmy 0"
            },
            {
                "iban": "PL55105000026800208114085773",
                "amount": 200,
                "label": "Nazwa firmy 1"
            }
        ]
    }
    ```

- title: 5.6. Anulowanie linku płatności
  content: |
    W celu anulowania utworzonego linku płatności należy wysłać żądanie metodą `POST` na adres `https://api.axepta.pl/v1/merchant/{merchantId}/payment/cancel`

    Body zapytania powinno zawierać następujące parametry:

    | Nazwa       | Parametr wymagany | Typ    | Opis                          |
    |-------------|-------------------|--------|-------------------------------|
    | `serviceId` | **Tak**           | string | Identyfikator sklepu          |
    | `paymentId` | **Tak**           | string | Identyfikator linku płatności |

    ### Przykład żądania

    ```json
    {
        "serviceId": "000eec9b-7248-4dae-98f2-56aab6a53927",
        "paymentId": "805f9c2c-e7ee-4606-b201-ee09032c49b0"
    }
    ```

# --- --- --- --- 6. Notyfikacje

- title: 6. Notyfikacje
  content: |
    Aby poprawnie skonfigurować wysyłkę notyfikacji odnośnie transakcji do sklepu, należy wprowadzić url prowadzący do weryfikacji w panelu administracyjnym Axepta.

    W momencie zmiany statusu transakcji serwery Axepta wysyłają powiadomienia na wskazany przez akceptanta adres URL.
    Wymagane jest by serwer akceptanta (np. sklep) odpowiedział statusem `200 OK` z body `{"status":"ok"}`, który będzie oznaczał poprawne odebranie i przetworzenie notyfikacji przez serwer akceptanta.\
    Notyfikacje wysyłane są w następującym cyklu:

    * 3 razy co sekundę, następnie,
    * 5 razy co 5 minut, następnie,
    * 5 razy co 60 minut, następnie,
    * 5 razy co 360 minut, następnie,
    * 5 razy co 720 minut.

    > Jeśli serwer akceptanta zwróci status 200 OK, lub notyfikacja nie zostanie odebrana do czasu zakończenia trwania cyklu wysyłki, serwery Axepta zaprzestają powtórzeń wysyłki notyfikacji.

- title: 6.1. Zawartość BODY notyfikacji
  content: |
    Notyfikacje wysyłane są jako obiekt `JSON` metodą `POST` i mają następującą postać:


    ```json
    {
        "payment": {
            "id": "53a97f55-81af-46fa-921b-0a6eaf184c30",
            "title": "43",
            "amount": 100,
            "status": "settled",
            "created": 1689938459,
            "orderId": "43",
            "currency": "PLN",
            "modified": 1689938483,
            "serviceId": "3283bb82-1203-4064-86ad-27868f985769",
            "notificationUrl": "https://domain.com/",
            "amountPaid": 100,
            "amountRefunded": 0,
            "amountSubmittedRefund": 0,
            "transactions": [
                {
                    "id": "ab163b2e-0cf5-4478-a673-a1afb22c9535",
                    "type": "sale",
                    "status": "settled",
                    "source": "web",
                    "created": 1689938476,
                    "modified": 1689938483,
                    "notificationUrl": "https://domain.com/",
                    "serviceId": "3283bb82-1203-4064-86ad-27868f985769",
                    "amount": 100,
                    "currency": "PLN",
                    "title": "43",
                    "orderId": "43",
                    "paymentMethod": "blik",
                    "paymentMethodChannel": "blik"
                }
            ],
            "notifyTransactionData": {
                "id": "ab163b2e-0cf5-4478-a673-a1afb22c9535",
                "type": "sale"
            }
        }
    }
    ```

    Notyfikacja może składać się z następujących obiektów:

    - `payment` - zawiera informacje o utworzonym linku płatności,
    - `transaction` - zawiera informacje o transakcjach jeśli zostałt utworzone dla danego linku płatności
    - `notifyTransactionData` - określa, której dokładnie trasakcji dotyczy notyfikacja. Objekt pomocny przy transakcji z więcej niż jedną metodą płatności. 

- title: 6.2. Zawartość nagłówków notyfikacji
  content: |
    Dodatkowo w nagłówkach HTTP umieszczane są następujące parametry:

    ```
    Content-Type: application/json; charset=UTF-8
    X-Axepta-Signature: merchantid=6yt3gjtm9p7b8h9xsdqz;serviceid=63f574ed-d4ad-407e-9981-39ed7584a7b7;signature=20cdc8646eb268ea754842bdf0db1df21a2cf0b1c6e3e16e74ef7f7cca8f5450;alg=sha256
    ```

    gdzie:
    * `merchantid` - identyfikator klienta,
    * `serviceid` - identyfikator sklepu,
    * `signature` - podpis notyfikacji,
    * `alg` - algorytm funkcji skrótu (możliwe wartości: `sha256`).

    > Weryfikacja podpisu notyfikacji jest krytycznym elementem uwierzytelnienia informacji przesyłanych w pakiecie notyfikacji.

- title: 6.3. Metoda weryfikacji podpisu notyfikacji
  content: |
    Nagłówek zawierający podpis notyfikacji ma postać:

    ```
    X-axepta-Signature: merchantid=[...];serviceid=[...];signature=[...];alg=[...]
    ```

    Aby uwierzytelnić pochodzenie oraz zweryfikować integralność wiadomości powiadomienia należy wykonać następujące czynności:

    1. Z nagłówków pakietu przychodzącego na adres notyfikacji należy pobrać zawartość `X-Axepta-Signature`,
    2. Następnie należy pobrać wartość parametru `signature` oraz `alg`,
    3. W zależności od algorytmu funkcji skrótu określonego w parametrze `alg` należy obliczyć odpowiednią funkcją skrót:

        ```
        string incoming_signature = x_axepta_signature[signature]
        string body = notification_body
        string own_signature = hash(body + private_key, alg)
        ``` 

    4. Obliczoną wartość `own_signature` należy porównać z wartością `incoming_signature`, która została pobrana z nagłówka,
    5. Jeżeli wartości `own_signature` i `incoming_signature` są identyczne oznacza to, że wiadomość notyfikacji jest poprawna i pochodzi z zaufanego źródła.

    > Zmiany statusów transakcji należy dokonywać tylko gdy weryfikacja podpisu przebiegła poprawnie.

# --- --- --- --- 7.

- title: 7. Pobieranie danych transakcji
  content: |
    Aby pobrać dane zamówienia należy wysłać żądanie `GET` na adres:

    ``` 
    https://api.axepta.pl/v1/merchant/{merchantId}/transaction/{transactionId}
    ``` 
    gdzie:

    - `merchantId` - identyfikator klienta,
    - `transactionId` - unikalny identyfikator transakcji (UUID v4),

- title: 7.1. HTTP Request
  content: |
    ### Przykładowy adres na który należy wysłać żądanie GET

    ```
    https://api.axepta.pl/v1/merchant/6yt3gjtm9p7b8h9xsdqz/transaction/5013e9ff-ece1-452a-9bd9-3b867a952794
    ```

- title: 7.2. HTTP Response
  content: |
    W przypadku wykonania poprawnego zapytania dotyczącego pobrania danych transakcji serwer odpowie statusem HTTP `200` oraz informacją o transakcji.

    ### Odpowiedź serwera

    ```json
    {
        "status": "SUCCESS",
        "data": {
            "transaction": {
                "id": "5013e9ff-ece1-452a-9bd9-3b867a952794",
                "type": "sale",
                "status": "pending",
                "source": "api",
                "createdAt": 1631261710,
                "modifiedAt": 1631261710,
                "notificationUrl": "http://domain.com/",
                "serviceId": "33532abf-f5f7-42b7-aa68-d4f93ebad053",
                "amount": 100,
                "currency": "PLN",
                "orderId": "123456",
                "paymentMethod": "pbl",
                "paymentMethodChannel": "bnpparibas",
                "payment": {
                    "id": "41f9f9fa-c7d0-4f08-8fb9-007cc24428a6",
                    "status": "pending"
                }
            }
        }
    }
    ```

# --- --- --- --- 8. 

- title: 8. Płatność oneclick i rekurencyjna
  content: |
    Płatności `oneclick` polegają na obciążeniu zarejestrowanego już w systemie Axepta profilu klienta/płatnika. Pierwsza płatność wymaga weryfikacji i podania pełnych danych instrumentu płatniczego. Każda kolejna płatność odbywa się za pomocą obciążenia na podstawie przydzielonego do instrumentu płatniczego identyfikatora.

    Płatności `rekurencyjne` polegają na cyklicznym obciążaniu instrumentu płatniczego klienta bez weryfikacji. Rejestracja instrumentu płatniczego odbywa się podobnie jak w płatności `oneclick`. Zgodnie z regulacjami organizacji płatniczych płatność musi być powtarzalna co do kwoty oraz okresu czasu.

    Dokonując płatności należy pamiętać aby każdy instrument płatniczy posiadał swój unikalny identyfikator klienta/płatnika - `cid`.

- title: 8.1 Zarejestrowanie nowego profilu
  content: |
    > Rejestracja profilu po API dostępna jest tylko i wyłącznie dla akceptantów którzy posiadają certyfikat PCI-DSS. 
    > W przypadku braku certyfikatu PCI-DSS należy skorzytać z rejestracji poprzez link API zgodnie z punktem [5. Tworzenie nowego linku płatności przez API], gdzie należy dołączyć parametr - `paywall.forceCardChannel` wraz z odpowiednią wartością.

    Rejestracja nowego profilu po API odbywa się za pomocą utworzenia nowej transakcji kartowej (punkt 3.) z parametrem `paymentMethodChannel` o wartości `oneclick` lub `recurring`. 

    #### Odpowiedź serwera

    Gdy transakcja zostanie zaakceptowana, standardowa notyfikacja zostanie zwrócona wzbogacona o dodatkowe pole `statusCode` oraz sekcję `paymentProfile` o strukturze:

    ```json
    {
        "paymentProfile": {
            "id": "d6a5bd6c-8e9c-496e-beb2-f0ca08215645",
            "{merchantId}": "6yt3gjtm9p7b8h9xsdqz",
            "merchantCustomerId": "123",
            "firstName": "Jan",
            "lastName": "Kowalski",
            "maskedNumber": "****1791",
            "month": "10",
            "year": "2020",
            "organization": "MASTERCARD",
            "isActive": 1,
            "profile": "ONE_CLICK"
        }
    }
    ```



    gdzie:

    | Parametr         | Typ    | Opis                 |
    |------------------|--------|----------------------|
    | `id`  | string  | Identyﬁkator proﬁlu |
    | `{merchantId}`            | string    | Identyfikator klienta |
    | `merchantCustomerId`     | string(3)  | Identyfikator płatnika, dopuszczalne znaki: A-Za-z0-9_- |
    | `firstName`           | string | Imię posiadacza instrumentu płatniczego na który jest zarejestrowany profil |
    |`lastName`              |string          | Nazwisko posiadacza instrumentu płatniczego na który jest zarejestrowany profil |
    |`maskedNumber`              |integer          | Cztery gwiazdki oraz ostatnie cztery cyfry instrumentu płatniczego |
    |`month`             |string          | Data ważności karty: miesiąc |
    |`year`              |string          | Data ważności karty: rok |
    |`organization`              |string          | Organizacja płatnicza która wydała zarejestrowaną kartę |
    |`isActive`              |integer          | Aktywność profilu: 1 - aktywna, 0 - nieaktywna |
    |`profile`              |string          | Rodzaj profilu. |

- title: 8.2. Obciążenie istniejącego profilu
  content: |
    Po prawidłowej rejestracji profilu zwrotnie zostanie przesłany parametr 'paymentProfileId', który jest wymagany aby móc obciążyć dany profil.
    Aby obciążyć istniejący profil w systemie należy wysyłać żądanie `POST` na adres:
    ```
    https://api.axepta.pl/v1/merchant/{merchantId}/transaction/profile
    ```
    gdzie:
    * `merchantId` - identyfikator klienta.

    #### Przykładowy adres na który należy wysłać żądanie POST
    ```
    https://api.axepta.pl/v1/merchant/6yt3gjtm9p7b8h9xsdqz/transaction/profile
    ```

    #### Payload zapytania


    ```json
    {
        "serviceId": "63f574ed-d4ad-407e-9981-39ed7584a7b7",
        "paymentProfileId": "39ac1087-e632-41ff-acb8-8d661068a9d5",
        "amount": 100,
        "currency": "PLN",
        "orderId": "123456",
    }
    ```

    gdzie:

    | Parametr          | Typ         | Wymagany | Opis  |
    |-------------------|-----------------------------------------------|-|-|
    | `serviceId`         | string(36)  | ✔️        | identyfikator sklepu jako UUID v4. |
    | `paymentProfileId`  | string(36)  | ✔️        | identyﬁkator proﬁlu który ma zostać obciążony. |
    | `amount`            | integer(1-999999999)     | ✔️        | Kwota transakcji w najmniejszej jednostce waluty np. grosze. |
    | `currency`          | string(3)   | ✔️        | Waluta transakcji w standardzie ISO 4217. |
    | `orderID`           | string(100) | ✔️        | Numer zamówienia akceptanta - dopuszczalne znaki: A-Za-z0-9#_-.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |
    |`title`              |string(255)  | -             | Tytuł transakcji - dopuszczalne znaki: A-Za-z0-9#&_-"',.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |


    #### Możliwe statusy
    Próba obciążenia profilu może przyjąć dwa statusy:

    | Status         | Typ    | Opis                 |
    |------------------|--------|----------------------|
    | `Success`           | string | Powodzenie - obciążono profil |
    | `Fail`           | string | Błąd - profil nie został obciążony|

    #### Odpowiedź serwera

    W przypadku próby obciążenia nieaktywnego profilu odpowiedź będzie wyglądać:

    ```json
    {
        "status": "FAIL",
        "message": "Payment profile inactive.",
        "data": {
            "errorCode": "PAYMENT_PROFILE_INACTIVE",
            "errorId": 120301,
            "bqh": "6jO"
        }
    }
    ```
    gdzie:

    | Parametr         | Typ    | Opis                 |
    |------------------|--------|----------------------|
    | `code`           | string | Kod błędu walidacji treści żądania |
    | `message`           | string | Opis błędu |
    | `serviceId`         | string(36)  | identyfikator sklepu jako UUID v4. |
    | `paymentProfileId`  | string(36)  | identyﬁkator proﬁlu który ma zostać obciążony. |
    | `amount`            | integer(1-999999999)| Kwota transakcji w najmniejszej jednostce waluty np. grosze. |
    | `currency`          | string(3)   | Waluta transakcji w standardzie ISO 4217. |
    | `orderID`           | string(100) | Numer zamówienia akceptanta - dopuszczalne znaki: A-Za-z0-9#_-.\/ oraz znak spacji(0x20) i znaki z zakresu UNICODE 00C0 - 02C0 (m.in. polskie znaki diakrytyczne) |

    #### Opisy ErrorCode
    W przypadku otrzymania statusu "FAIL" w odpowiedzi serwera mogą wystąpić nastepujące błędy ("errorCode"):

    | errorCode         | Typ    | Opis                 |
    |------------------|--------|----------------------|
    | `PAYMENT_PROFILE_INACTIVE`           | string | Profil płatności dezaktywowany |
    | `PAYMENT_PROFILE_NOT_FOUND`           | string |  Profil płatności nie odnaleziony |
    | `SCHEMA_VALIDATION`           | string | Błąd walidacji znaków. Payload zapytania jest nie właściwy, lub nie spełnia wymagań znakowych |

- title: 8.3 Zarządzanie istniejącym profilem
  content: "Opis poszczególnych dostępnych funkcjonalności został w umieszczony podrozdziałach."
- title: 8.3.1 Multiwypłata
  content: |
    Istnieje możliwośc obciążenia istniejącego profilu kartowego z opcją multiwypłaty. Aby to zrobić do treści zapytania o obciążenie profilu kartowego należy dodać dane jak w punkcie 5.4 Multiwypłaty. 

    #### Przykładowy Payload

    ```json
    {
        "serviceId": "63f574ed-d4ad-407e-9981-39ed7584a7b7",
        "paymentProfileId": "39ac1087-e632-41ff-acb8-8d661068a9d5",
        "amount": 303,
        "currency": "PLN",
        "orderId": "test",
        "data": {
            "multipayout": [
                {
                    "label": "1",
                    "iban": "PL01100010100000001010010000",
                    "amount": 102
                },
                {
                    "label": "2",
                    "iban": "PL00101000000000001000100000",
                    "amount": 201
                }
            ]
        }
    }
    ```

- title: 8.3.2 Pobranie profilu o podanym `cid`
  content: |
    Aby pobrać profil płatnika o przypisanym numerze `cid`, należy wysłać zapytanie `GET`, na adres: 

    ```
    https://api.axepta.pl/v1/merchant/{merchantId}/profile/cid/{cid}
    ```

    gdzie:
    * `merchantId` - identyfikator klienta.
    * `cid` - identyfikator płatnika nadany przez akceptanta,

    #### Treść odpowiedzi

    ```json
    {
        "status": "SUCCESS",
        "data": {
            "paymentProfiles": [
                {
                    "id": "949058db-fe93-4d70-4384-96f7fc5728d2",
                    "firstName": "Jan",
                    "lastName": "Kowalski",
                    "maskedNumber": "411111****1111",
                    "month": "12",
                    "year": "2029",
                    "organization": "MASTERCARD",
                    "isActive": 1,
                    "profile": "RECURRING"
                },
                {
                    "id": "949058db-ae07-4ce8-4d70-a1ea1f80b7c2",
                    "firstName": "Jan",
                    "lastName": "Kowalski",
                    "maskedNumber": "411111****1111",
                    "month": "12",
                    "year": "2029",
                    "organization": "MASTERCARD",
                    "isActive": 1,
                    "profile": "RECURRING"
                }
            ],
            "iqZ": "k9I"
        }
    }

    ```

- title: 8.3.3 Pobranie profilu kartowego o podanym `id`
  content: |
    Aby pobrać informację o profilu kartowym, należy wysłać zapytanie `GET`, na adres:

    ```
    https://api.axepta.pl/v1/merchant/{merchantId}/profile/id/{paymentProfileId}
    ```

    gdzie:
    * `merchantId` - identyfikator klienta.
    * `paymentProfileId` - identyfikator profilu kartowego,

    #### Treść odpowiedzi

    ```json

    {
        "status": "SUCCESS",
        "data": {
            "paymentProfile": {
                "id": "addcabf2-5229-4d70-a175-67f7fc5728d1",
                "firstName": "Jan",
                "lastName": "Kowalski",
                "maskedNumber": "411111****1111",
                "month": "12",
                "year": "2029",
                "organization": "MASTERCARD",
                "isActive": 1,
                "profile": "RECURRING"
            },
            "qtt": "GHb"
        }
    }

    ```

- title: 8.3.4 Dezaktywacja  profilu kartowego o podanym `id`
  content: |
    Aby dezaktywować profil kartowy o podanym `id`, należy wysłać zapytanie `DELETE`, na adres:

    ```
    https://api.axepta.pl/v1/merchant/{merchantId}/profile/id/{paymentProfileId}
    ```

    gdzie:
    * `merchantId` - identyfikator klienta.
    * `paymentProfileId` - identyfikator profilu kartowego,

    #### Treść odpowiedzi

    ```json
    {
        "status": "SUCCESS",
        "data": {
            "paymentProfile": {
                "id": "rfgcabf2-5229-4d70-a175-96f7fc3458d5",
                "firstName": "Jan",
                "lastName": "Kowalski",
                "maskedNumber": "411111****1111",
                "month": "12",
                "year": "2029",
                "organization": "MASTERCARD",
                "isActive": 0,
                "profile": "RECURRING"
            },
            "Jcd": "sBR"
        }
    }
    ```

# --- --- --- --- 9. Pobieranie danych płatności

- title: 9. Pobieranie danych płatności
  content: |
    Aby pobrać dane płatności należy wysłać żądanie `GET` na adres:

    ```
    https://api.axepta.pl/v1/merchant/{merchantId}/payment/{paymentId}
    ```

    gdzie:  

    - `merchantId` - identyfikator klienta,
    - `paymentId` - unikalny identyfikator płatności

- title: 9.1 HTTP Request
  content: |
    ### Przykładowy adres na który należy wysłać żądanie GET

    ```
    https://api.axepta.pl/v1/merchant/6yt3gjtm9p7b8h9xsdqz/payment/1572084b-4b63-40a7-90b1-17199172a385
    ```

- title: 9.2 HTTP Response
  content: |
    W przypadku wykonania poprawnego zapytania dotyczącego pobrania danych transakcji serwer odpowie statusem HTTP `200` oraz informacją o płatności.

    ### Odpowiedź serwera

    ```json
    {
        "status": "SUCCESS",
        "data": {
            "payment": {
                "id": "1572084b-4b63-40a7-90b1-17199172a385",
                "url": "https://paywall.axepta.pl/pay/1572084b-4b63-40a7-90b1-17199172a385",
                "serviceId": "10af53c6-35ce-4713-81ba-883501277d40",
                "orderId": "123123123",
                "amount": "100",
                "amountPaid": 0,
                "amountRefunded": 0,
                "amountSubmittedRefund": 0,
                "currency": "PLN",
                "status": "new",
                "isActive": true,
                "createdAt": 1631540831,
                "modifiedAt": 1631540831,
                "isGenerated": false,
                "isUsed": false,
                "isConfirmVisited": false,
                "returnUrl": "https://domain.com/return",
                "failureReturnUrl": "https://domain.com/failure",
                "successReturnUrl": "https://domain.com/success",
                "customer": {
                    "firstName": "Jan",
                    "lastName": "Kowalski",
                    "email": "jan.kowalski@example.com",
                    "phone": "501501501",
                    "locale": "pl",
                    "cid": "123"
                }
            }
        }
    }
    ```
# --- --- --- --- 11. API Report
- title: 10. Raporty - Dokumentacja API Report
  content: |
    API umożliwia generowanie raportów transakcji w formatach CSV. 
    Raporty mogą być wysyłane na email lub przez webhook.

- title: 10.1. Raporty - Autoryzacja
  content: |
    Wszystkie endpointy wymagają Basic Authentication.
    **Header**: `Authorization: Basic <key>`

    Klucz API znajduje się w [panelu administracyjnym Axepta](https://axepta.bnpparibas.pl/) 

    Klucz jest dostępny dla użytkownika o roli Administrator.

    Ustawienia -> zakładka 'klucze API' -> 'default' -> 'szczegóły' -> pozycja 'token autoryzacyjny'.
    Należy wybrać klucz **Raportowy**.

- title: 10.2. Typy raportów
  content: "Typy raportów zostały opisane w podrozdziałach"

- title: 10.2.1 Raport transakcji (CSV)
  content: |
    Podstawowy raport transakcji w formacie CSV.

    **Request Body**:
    ```json
    {
      "taskName": "report_csv",
      "type": "transaction",
      "columns": [
        "transactionInternalId",
        "transactionAmount",
        "transactionStatus",
        "transactionCreated"
      ],
      "conditions": {
        "date": {
          "from": 1609459200,
          "to": 1612137599,
          "timezone": "Europe/Warsaw"
        },
        "language": "EN",
        "filters": {
          "serviceUuid": ["service-uuid-1", "service-uuid-2"],
          "paymentMethodCode": ["card", "blik"],
          "transactionIsPaidOut": ["payout", "partial"],
          "transactionStatus": ["settled", "pending"],
          "transactionType": ["sale", "refund"]
        }
      },
      "formatting": {
        "columnSeparator": ",",
        "numberSeparator": "."
      },
      "destination": {
        "email": ["admin@example.com", "report@example.com"],
        "callbackUrl": "https://your-domain.com/webhook/report"
      }
    }
    ```

    **Pola**:
    - `taskName` (string, wymagany) - `"report_csv"`
    - `type` (string, wymagany) - `"transaction"`
    - `columns` (array, wymagany) - Lista kolumn do uwzględnienia (min. 1)
    - `conditions` (object, wymagany):
      - `date` (object, wymagany):
        - `from` (number, wymagany) - Timestamp Unix w sekundach
        - `to` (number, wymagany) - Timestamp Unix w sekundach
        - `timezone` (string, opcjonalny) - Strefa czasowa w formacie TZ database (np. `"Europe/Warsaw"`, `"UTC"`) - domyślnie `"Europe/Warsaw"`
      - `language` (string, opcjonalny) - `"EN"` lub `"PL"` (domyślnie PL)
      - `filters` (object, opcjonalny):
        - `serviceUuid` (array[string], opcjonalny) - Lista UUID serwisów
        - `paymentMethodCode` (array[enum], opcjonalny) - Metody płatności
        - `transactionIsPaidOut` (array[enum], opcjonalny) - Status wypłaty
        - `transactionStatus` (array[enum], opcjonalny) - Status transakcji
        - `transactionType` (array[enum], opcjonalny) - Typ transakcji
    - `formatting` (object, opcjonalny):
      - `columnSeparator` (string, opcjonalny) - Separator kolumn w pliku CSV (np. `","`, `";"`, `"|"`)
      - `numberSeparator` (string, opcjonalny) - Separator dziesiętny w liczbach (np. `"."`, `",")`
    - `destination` (object, opcjonalny):
      - `email` (array[string], opcjonalny) - Lista adresów email (max 64 znaków każdy)
      - `callbackUrl` (string, opcjonalny) - URL webhooka

    ---

- title: 10.2.2. Raport transakcji po wypłacie(CSV)
  content: |
    Raport transakcji powiązanych z wypłatami.

    **Dostępność**: Tylko Panel

    **Request Body**:
    ```json
    {
      "taskName": "report_csv",
      "type": "transaction_on_payout",
      "columns": [
        "transactionInternalId",
        "transactionAmount",
        "transactionIsPaidOut"
      ],
      "conditions": {
        "date": {
          "from": 1609459200,
          "to": 1612137599,
          "timezone": "Europe/Warsaw"
        },
        "language": "PL",
        "filters": {
          "serviceUuid": ["service-uuid-1"],
          "paymentMethodCode": ["card"],
          "transactionStatus": ["settled"],
          "transactionType": ["sale"]
        }
      },
      "formatting": {
        "columnSeparator": ";",
        "numberSeparator": ","
      },
      "destination": {
        "email": ["finance@example.com"],
        "callbackUrl": "https://your-domain.com/webhook/report"
      }
    }
    ```

    **Pola**:
    - `taskName` (string, wymagany) - `"report_csv"`
    - `type` (string, wymagany) - `"transaction_on_payout"`
    - `columns` (array, wymagany) - Lista kolumn (min. 1)
    - `conditions` (object, wymagany):
      - `date` (object, wymagany)
      - `language` (string, opcjonalny)
      - `filters` (object, opcjonalny) - **Uwaga**: Brak `transactionIsPaidOut` w tym typie!
    - `formatting` (object, opcjonalny)
    - `destination` (object, opcjonalny) - Jak w raporcie transakcji

    **Uwaga**:
    - Ten raport **NIE** obsługuje filtra `transactionIsPaidOut`.

    ---

- title: 10.2.3. Raport rozliczeniowy transakcji (CSV)
  content: |
    
    Raport tylko rozliczonych transakcji.

    **Dostępność**: Tylko Panel

    **Request Body**:
    ```json
    {
      "taskName": "report_csv",
      "type": "transaction_settled",
      "columns": [
        "transactionInternalId",
        "transactionAmount",
        "transactionSettled"
      ],
      "conditions": {
        "date": {
          "from": 1609459200,
          "to": 1612137599,
          "timezone": "Europe/Warsaw"
        },
        "filters": {
          "serviceUuid": ["service-uuid-1"],
          "paymentMethodCode": ["card", "blik"],
          "transactionIsPaidOut": ["payout"],
          "transactionType": ["sale"]
        }
      },
      "formatting": {
        "columnSeparator": ",",
        "numberSeparator": "."
      },
      "destination": {
        "email": ["accounting@example.com"]
      }
    }
    ```

    **Pola**:
    - `taskName` (string, wymagany) - `"report_csv"`
    - `type` (string, wymagany) - `"transaction_settled"`
    - `columns` (array, wymagany) - Lista kolumn (min. 1)
    - `conditions` (object, wymagany):
      - `date` (object, wymagany)
      - `filters` (object, opcjonalny) - **Uwaga**: Brak `transactionStatus` w tym typie!
    - `destination` (object, opcjonalny)

    **Uwaga**:
    - Ten raport **NIE** obsługuje filtra `transactionStatus`.
    - Obsługuje formatowanie przez `timezone` (w `date`), `columnSeparator` i `numberSeparator` (w `formatting`).

    ---

- title: 10.3. Raport - Enumy
  content: |
    
    ### ReportTaskNameEnum
    Typ zadania raportu:
    - `report_csv` - Raport w formacie CSV


    ### ReportTypeEnum
    Typ raportu:
    - `transaction` - Podstawowy raport transakcji
    - `transaction_on_payout` - Transakcje na wypłacie
    - `transaction_settled` - Tylko rozliczone transakcje

    ### ReportStatusEnum
    Status raportu:
    - `new` - Nowy, oczekuje na przetworzenie
    - `preparing` - Przygotowywanie danych
    - `prepared` - Dane przygotowane
    - `generating` - Generowanie pliku
    - `generated` - Raport wygenerowany i gotowy
    - `error` - Błąd podczas generowania
    - `deleted` - Raport usunięty
    - `cancelled` - Raport anulowany

    ### ReportColumnEnum
    Dostępne kolumny (wszystkie opcjonalne, wybierz potrzebne):

    **Quota (Zamówienie)**:
    - `quotaUuid` - UUID zamówienia
    - `quotaStatus` - Status zamówienia
    - `quotaAmount` - Kwota zamówienia
    - `quotaPayerFirstName` - Imię płacącego
    - `quotaPayerLastName` - Nazwisko płacącego
    - `quotaPayerPhone` - Telefon płacącego
    - `quotaPayerEmail` - Email płacącego

    **Payer (Płatnik)**:
    - `payerAccountNumber` - Numer konta płatnika

    **Transaction (Transakcja)**:
    - `transactionInternalId` - ID transakcji
    - `transactionType` - Typ transakcji (sale/refund)
    - `transactionAmount` - Kwota transakcji
    - `transactionMerchantOrderId` - ID zamówienia merchanta
    - `transactionTitle` - Tytuł transakcji
    - `transactionStatus` - Status transakcji
    - `transactionIsPaidOut` - Czy wypłacona
    - `transactionSettled` - Timestamp rozliczenia
    - `transactionCreated` - Timestamp utworzenia
    - `transactionModified` - Timestamp modyfikacji
    - `transactionRelatedInternalId` - ID powiązanej transakcji
    - `transactionFeeAmount` - Kwota prowizji

    **Payment Method (Metoda płatności)**:
    - `paymentMethodName` - Nazwa metody płatności
    - `paymentMethodCode` - Kod metody płatności
    - `paymentMethodChannelName` - Nazwa kanału płatności
    - `paymentMethodChannelCode` - Kod kanału płatności

    **Service (Serwis)**:
    - `serviceUuid` - UUID serwisu
    - `serviceName` - Nazwa serwisu

    **Currency (Waluta)**:
    - `currencyIso4217` - Kod waluty ISO 4217



    ### PaymentMethodCodeEnum
    Metody płatności:
    - `blik` - BLIK
    - `card` - Karta płatnicza
    - `pbl` - Przelew bankowy (Pay by Link)
    - `wallet` - Portfel elektroniczny

    ### TransactionStatusEnum
    Statusy transakcji:
    - `new` - Nowa
    - `pending` - Oczekująca
    - `authorized` - Autoryzowana
    - `submitted_for_settlement` - Wysłana do rozliczenia
    - `settled` - Rozliczona
    - `rejected` - Odrzucona
    - `error` - Błąd
    - `cancelled` - Anulowana

    ### TransactionTypeEnum
    Typy transakcji:
    - `sale` - Sprzedaż
    - `refund` - Zwrot

    ### TransactionPaidOutEnum
    Status wypłaty:
    - `payout` - Wypłacona w całości
    - `partial` - Częściowo wypłacona
    - `not_payout` - Nie wypłacona

    ### ReportFrequencyEnum
    Częstotliwość generowania zaplanowanych raportów:
    - `day` - Codziennie (raport za poprzedni dzień)
    - `week` - Co tydzień (raport za poprzedni tydzień)
    - `month` - Co miesiąc (raport za poprzedni miesiąc)

    **Uwaga**: Stosuje się tylko do zaplanowanych raportów (planned reports).

    ### LanguageCode
    Język raportu (nagłówki kolumn):
    - `EN` - Angielski
    - `PL` - Polski

    ### Timezone
    Strefa czasowa używana do formatowania dat i czasu w raporcie:
    - **Lokalizacja**: W obiekcie `conditions.date.timezone`
    - Format: TZ database (np. `"Europe/Warsaw"`, `"America/New_York"`)
    - Domyślnie: `"Europe/Warsaw"`
    - Pełna lista dostępnych stref: [TZ database](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)

    ### Formatting (obiekt)
    Obiekt `formatting` zawiera ustawienia formatowania pliku CSV:

    **Column Separator** (`columnSeparator`):
    - `,` (przecinek)
    - `;` (średnik)
    - `|` (pionowa kreska)
    - `\t` (tabulacja)

    **Number Separator** (`numberSeparator`):
    - `.` (kropka)
    - `,` (przecinek)

    ---

- title: 10.4. Webhook
  content: |
    
    Jeśli podasz `callbackUrl` w `destination`, system wyśle webhook po wygenerowaniu raportu.

    ### Webhook Request

    **Method**: `POST`
    **URL**: Twój `callbackUrl`
    **Headers**:
    ```
    Content-Type: application/json
    ```

    **Body** (identyczny jak response GET):
    ```json
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "plannedReportUuid": "650e8400-e29b-41d4-a716-446655440001",
      "taskName": "report_csv",
      "type": "transaction",
      "status": "generated",
      "settings": {
        "columns": ["transactionInternalId", "transactionAmount"],
        "conditions": {
          "date": {
            "from": 1609459200,
            "to": 1612137599
          },
          "filters": {
            "transactionStatus": ["settled"]
          }
        },
        "destination": {
          "email": ["report@example.com"]
        }
      },
      "generatedAt": 1612137600
    }
    ```

    **Uwaga**: Pole `plannedReportUuid` będzie obecne tylko jeśli raport został wygenerowany z zaplanowanego raportu. Dla raportów jednorazowych (utworzonych przez `POST /report`) pole to będzie `null` lub nieobecne.

    ### Obsługa webhooka

    1. **Webhook jest wysyłany gdy**: `status` osiągnie stan końcowy (`generated`, `error`, `deleted`, `cancelled`)
    2. **Wymagana odpowiedź**: Serwer **MUSI** odpowiedzieć kodem HTTP **200** z body:
      ```json
      {
        "status": "ok"
      }
      ```
    3. **Retry**: Jeśli webhook zwróci błąd (kod inny niż 200) lub timeout, system będzie automatycznie ponawiał wysyłkę

    **Przykład poprawnej obsługi webhooka** (Node.js/Express):
    ```javascript
    app.post('/webhook/report', (req, res) => {
      const report = req.body;

      console.log(`Raport ${report.uuid} ma status: ${report.status}`);

      if (report.status === 'generated') {
        // Raport gotowy - pobierz plik lub wyślij powiadomienie
        console.log(`Raport wygenerowany: ${report.generatedAt}`);
      } else if (report.status === 'error') {
        // Błąd generowania
        console.error(`Błąd generowania raportu ${report.uuid}`);
      }

      // WAŻNE: MUSISZ odpowiedzieć 200 z { status: "ok" }
      res.status(200).json({ status: 'ok' });
    });
    ```

    ---

    ## Przykłady użycia

    ### Prosty raport transakcji
    ```bash
    curl -X POST "https://api.example.com/v1/merchant/MERCHANT123/report" \
      -H "Authorization: Basic dXNlcjpwYXNz" \
      -H "Content-Type: application/json" \
      -d '{
        "taskName": "report_csv",
        "type": "transaction",
        "columns": ["transactionInternalId", "transactionAmount", "transactionStatus"],
        "conditions": {
          "date": {
            "from": 1609459200,
            "to": 1612137599,
            "timezone": "Europe/Warsaw"
          }
        }
      }'
    ```

    ### Raport z filtrowaniem i webhookiem
    ```bash
    curl -X POST "https://api.example.com/v1/merchant/MERCHANT123/report" \
      -H "Authorization: Basic dXNlcjpwYXNz" \
      -H "Content-Type: application/json" \
      -d '{
        "taskName": "report_csv",
        "type": "transaction",
        "columns": ["transactionInternalId", "transactionAmount", "transactionStatus"],
        "conditions": {
          "date": {
            "from": 1609459200,
            "to": 1612137599,
            "timezone": "Europe/Warsaw"
          },
          "language": "PL",
          "filters": {
            "paymentMethodCode": ["card", "blik"],
            "transactionStatus": ["settled"]
          }
        },
        "formatting": {
          "columnSeparator": ";",
          "numberSeparator": ","
        },
        "destination": {
          "email": ["report@example.com"],
          "callbackUrl": "https://your-domain.com/webhook/report"
        }
      }'
    ```

    ### Pobranie raportu
    ```bash
    curl -X GET "https://api.example.com/v1/merchant/MERCHANT123/report/550e8400-e29b-41d4-a716-446655440000" \
      -H "Authorization: Basic <key>"
    ```

    ### Pobranie pliku raportu
    ```bash
    curl -X GET "https://api.example.com/v1/merchant/MERCHANT123/report/550e8400-e29b-41d4-a716-446655440000/download" \
      -H "Authorization: Basic <key>" \
      -o raport.csv
    ```

    ### Tworzenie zaplanowanego raportu
    ```bash
    curl -X POST "https://api.example.com/v1/merchant/MERCHANT123/planned-report" \
      -H "Authorization: Basic <key>" \
      -H "Content-Type: application/json" \
      -d '{
        "taskName": "report_csv",
        "type": "transaction",
        "columns": ["transactionInternalId", "transactionAmount", "transactionStatus"],
        "conditions": {
          "date": {
            "timezone": "Europe/Warsaw"
          },
          "language": "PL"
        },
        "formatting": {
          "columnSeparator": ";",
          "numberSeparator": ","
        },
        "destination": {
          "email": ["report@example.com"]
        },
        "frequency": "day",
        "activeFrom": 1609459200,
        "isActive": true,
        "name": "Dzienny raport transakcji"
      }'
    ```

    ### Aktualizacja zaplanowanego raportu
    ```bash
    curl -X PUT "https://api.example.com/v1/merchant/MERCHANT123/planned-report/550e8400-e29b-41d4-a716-446655440000" \
      -H "Authorization: Basic <key>" \
      -H "Content-Type: application/json" \
      -d '{
        "isActive": false,
        "frequency": "week"
      }'
    ```

# --- --- --- --- 11. Sandbox

- title: 11. Sandbox
  content: |
    Axepta oferuje tryb testowy sandbox w ramach weryfikacji poprawności działania integracji.
    <br>
    Środowisko testowe sandbox można znaleźć przechodząc na stronę: [https://axepta.sandbox.bnpparibas.pl/](https://axepta.sandbox.bnpparibas.pl/)
    <br>
    Chcąc utworzyć nowe konto należy kliknąć `Utwórz konto Akceptanta`, a następnie podać adres e-mail, na który zostanie wysłany link do aktywacji konta.
    Po aktywacji konta wystarczy zalogować się wygenerowanym loginem oraz nadanym wcześniej hasłem.
    Do konta zostanie przypisany sklep testowy, który posiadać będzie swoje klucze integracyjne.

    **Sandbox URL:** `https://api.sandbox.axepta.pl`

- title: 11.1. Karty na środowisku sandbox.
  content: |
    W celu przetestowania płatności kartą, należy użyć poniższych danych.

    | Card issuer | Number           | Month | Year | CVV | 3-D Secure  | Behavior                    |
    |-------------|------------------|-------|------|-----|-------------|-----------------------------|
    | Visa        | 4012001007002005 | 12    | 29   | 123 | no          | Błąd dostawcy               |
    | Visa        | 4111111111111111 | 12    | 29   | 123 | no          | Płatność zrealizowana       |

- title: 11.2. Transakcje PBL na środowisku sandbox.
  content: |
    W celu przetestowania transakcji PBL, należy użyć poniższych danych.

    | Title         | Behavior                                      |
    |---------------|-----------------------------------------------|
    | TEST-100010   | Błąd dostawcy                                 |

- title: 11.3. BLIK na środowisku sandbox.
  content: |
    W celu przetestowania transakcji BLIK, należy użyć poniższych danych.

    | Code          | Odpowiedź                                      |
    |---------------|------------------------------------------------|
    | 777000        | Zrealizowana                                   |

    # Testowanie błędów asynchronicznych
          API Axepta umożliwia testowanie płatności Blik poprzez symulację błędów asynchronicznych za pomocą parametrów kwoty, tytułu i 'blikCode'.

    # Testowanie błędów asynchronicznych za pomocą `blikCode`
          Oto tabela przedstawiająca dostarczone kody Blik i ich statusy:

    | blikCode  | Status                            | Kod statusu        |
    |-----------|-----------------------------------|----------------------|
    | 999000    | SETTLED    |                      |
    | 912111    | REJECTED   | ALIAS_DECLINED       |
    | 927111    | REJECTED   | TAS_DECLINED         |
    | 934111    | REJECTED   | USER_DECLINED        |
    | 969111    | REJECTED   | SEC_DECLINED         |
    | 956111    | REJECTED   | SYSTEM_ERROR         |
    | 961111    | REJECTED   | GENERAL_ERROR        |
    | 960111    | REJECTED   | INSUFFICIENT_FUNDS   |
    | 989111    | REJECTED   | TIMEOUT              |
    | 990111    | REJECTED   | LIMIT_EXCEEDED       |
    | 949111    | REJECTED   | USER_TIMEOUT         |
    | 902111    | REJECTED   | ISSUER_DECLINED      |

    - Ważna uwaga!

    >Pomimo że status transakcji jest ustawiony na "Odrzucona", na końcu procesu transakcji wysyłane jest dodatkowe asynchroniczne powiadomienie. To powiadomienie zawiera odpowiednie `StatusCode`.

    #Testowanie błędów asynchronicznych za pomocą `amount`
        Oto tabela przedstawiająca wartości podanych wartości i ich statusy. 
        Do testowania błędów z ilościami powinieneś użyć 'blikCode': 777 xxx (gdzie xxx może mieć dowolną cyfrę)..

    | amount | Status                          | Kod statusu         |
    |-----------|---------------------------------|----------------------|
    | 28800     | REJECTED   | ALIAS_DECLINED       |
    | 19200     | REJECTED   | TAS_DECLINED         |
    | 14400     | REJECTED   | USER_DECLINED        |
    | 21600     | REJECTED   | SEC_DECLINED         |
    | 26400     | REJECTED   | SYSTEM_ERROR         |
    | 36000     | REJECTED   | GENERAL_ERROR        |
    | 12000     | REJECTED   | INSUFFICIENT_FUNDS   |
    | 31200     | REJECTED   | TIMEOUT              |
    | 9600      | REJECTED   | LIMIT_EXCEEDED       |
    | 33600     | REJECTED   | USER_TIMEOUT         |
    | 16800     | REJECTED   | ISSUER_DECLINED      |

    #Testowanie błędów synchronicznych
        API Axepta umożliwia testowanie płatności Blik poprzez symulację błędów synchronicznych za pomocą wartości 'blikCode'.

    #Generowanie błędów synchronicznych za pomocą 'blikCode'
        Oto tabela przedstawiająca wartości i statusy transakcji w 'blikCode':
        
    | blikCode  | Status                          | Status Code          |
    |-----------|---------------------------------|----------------------|
    | 123444    | REJECTED    | ER_WRONG_TICKET                     | 

- title: 12. Minimalne i maksymalne wartości kwot transakcji, zwrotów.
  content: |
    Dla każdej metody płatności obowiązują następujące limity:

    | Metoda płatności            | Minimalna kwota płatności (PLN) | Maksymalna kwota płatności (PLN) |
    |-----------------------------|---------------------------------| ---------------------------------|
    | Przelewy online Pay-By-Link | 0.37 (0.50)*                    | 999 999.99                       |
    | Płatność za pomocą BLIK     | 0.1                             | 50 000                           |     
    | Płatność kartą              | 0.05                            | 999 999.99                       |
    | Płatność walletami          | 0.05                            | 999 999.99                       |
    | Płatność oneclick           | 0.05                            | 999 999.99                       |
    | Płatność recurring          | 0.05                            | 999 999.99                       |


    (*) Dla nestPrzelew, Płacę z Plus Bank oraz Spółdzielcza Grupa Bankowa wynosi 0.50 PLN


    | Metoda płatności            | Minimalna kwota płatności (EUR) | Maksymalna kwota płatności (EUR) |
    |-----------------------------|---------------------------------| ---------------------------------|
    | Płatność kartą              | 0.01                            | 999 999.99                       |
    | Płatność walletami          | 0.01                            | 999 999.99                       |
    | Płatność oneclick           | 0.01                            | 999 999.99                       |
    | Płatność recurring          | 0.01                            | 999 999.99                       |

    <b>Poza tymi progami dana metoda płatności nie jest dostępna. <b>

- title: Kolekcja postman
  content: |
    [Pobierz kolekcje postmana.](https://data.axepta.pl/example/axepta_postman.zip)

    Aby korzystać z zamieszczone kolekcji postmana należy dodać swoje klucze ze środowiska testowego.

    > [Opis sandbox](https://bump.sh/pgw/doc/axepta-api/pl/topic/topic-11-sandbox)
