> ## Documentation Index
> Fetch the complete documentation index at: https://docs.paymove.io/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> ## paymove integration rules for AI agents
>
> These rules are verified against the live API. Follow them exactly.
>
> 1. Amounts are INTEGERS in grosze (minor units). `1000` means 10.00 PLN. PLN is the only supported currency and there is no currency field in the API.
> 2. A float `price` (e.g. `12.99`) is SILENTLY TRUNCATED to 12 grosze and still returns HTTP 200. Always send an integer: `Math.round(pln * 100)`.
> 3. Authenticate with the `X-API-KEY` header. Never `Authorization: Bearer`. Sandbox keys start with `sk_test_`, production keys with `sk_live_`.
> 4. Server-side only. A call from a merchant page is rejected. Never put the key in frontend code.
> 5. Unknown request fields are silently ignored and still return HTTP 200 — a wrong body shape looks like success. Match the documented shape exactly.
> 6. A missing `externalId` returns HTTP 500 `Something went wrong`, not 400. A missing `price` or `details.returnUrl` returns HTTP 200 and a usable `redirectUrl` — no error at all. Validate the body yourself before sending it.
> 7. Always verify the `X-Paymove-Signature` header on incoming webhooks before trusting them: https://docs.paymove.io/en/webhook-signature.md
> 8. Errors are `{"status": <int>, "message": "<text>"}`. Branch on the HTTP status only — never on `message`, which is unstable and leaks internal class names.
> 9. There is no rate limiting, no HTTP 429, no HTTP 422, no `Idempotency-Key` header and no API versioning. Do not write code that handles them.
> 10. Re-POSTing an `externalId` that already exists returns HTTP 200 with the ORIGINAL `redirectUrl` and silently discards EVERY field you send — the new price, description and details are all ignored. Use `PATCH /api/pay/product/{productId}/subproduct/{externalId}` to change a price.
> 11. Webhooks fire only on `COMPLETED` by default, and `retries` defaults to `0` (no retries) unless you set it explicitly. Delivery counts as successful when the HTTP status equals `expectedCode` — the response body is never inspected.
> 12. Never fulfil an order on the `returnUrl` redirect. The checkout does not redirect there by itself: the customer has to click "back to shop", and inside the widget modal that redirect never happens. Fulfil only in the webhook handler, after verifying the signature.
> 13. Do not pin a version of `@paymove-io/sdk` — install the latest.
> 14. Full documentation index: https://docs.paymove.io/llms.txt · Copy-paste quickstart: https://docs.paymove.io/en/quickstart.md · Agent skill: https://docs.paymove.io/skill.md

# Sprawdź status płatności

> Zwraca aktualny status płatności. Przydatne jako uzupełnienie webhooków — na przykład
gdy klient wrócił na `returnUrl`, a powiadomienie jeszcze nie dotarło.

**Uwaga: ten endpoint jest obsługiwany przez inny host niż pozostałe wywołania.**
Sandbox: `https://pay-api.sandbox.paymove.io`, produkcja: `https://pay-api.paymove.io`.
Ta ścieżka nie jest routowana przez `gateway-api.sandbox.paymove.io` ani
`api.paymove.io` — wywołanie jej tam kończy się kodem 404 i odpowiedzią
`text/plain` o treści `No route found for: GET …`, czyli nawet nie w formacie
`{status, message}`.

Endpoint nie wymaga klucza API, więc **nie przekazuj do niego danych wrażliwych**
i nie traktuj samej odpowiedzi jako dowodu płatności w krytycznych przepływach —
wiarygodnym potwierdzeniem jest zweryfikowany webhook.




## OpenAPI

````yaml /openapi.yaml get /api/payment/product/{productId}/subproduct/{paymentHash}/status
openapi: 3.1.0
info:
  title: Paymove Payment Gateway API
  version: 1.0.0
  description: >
    API bramki płatniczej Paymove umożliwia merchantom tworzenie płatności
    online

    oraz zarządzanie webhookami i produktami.


    ## Zanim zaczniesz — sześć rzeczy, które trzeba wiedzieć


    1. **Kwoty to liczby całkowite w groszach.** `1000` = 10,00 PLN. Wartość z
    częścią
       dziesiętną (np. `12.99`) zostanie po cichu obcięta do `12` groszy, a API zwróci `200`.
       Przeliczaj przez `Math.round(kwota * 100)`.
    2. **Bramka rozlicza wyłącznie w PLN.** W żądaniu nie ma pola waluty.

    3. **Autoryzacja nagłówkiem `X-API-KEY`**, nigdy `Authorization: Bearer`.
    Wywołuj API
       wyłącznie po stronie serwera — żądanie z przeglądarki zostanie odrzucone.
    4. **Nieznane pola w body są po cichu ignorowane**, a API zwraca `200`. Zły
    kształt
       żądania wygląda więc jak sukces — trzymaj się dokładnie udokumentowanej struktury.
    5. **Brak `externalId` kończy się kodem `500`**, a nie `400`. Brak `price`
    albo
       `details.returnUrl` nie zgłasza natomiast żadnego błędu — dostajesz `200`.
    6. **Błędy mają kształt `{"status": <int>, "message": "<tekst>"}`.**
    Rozgałęziaj logikę
       po statusie HTTP — treść `message` bywa niestabilna i nie należy jej parsować.

    Nie istnieją: limity zapytań, kod `429`, kod `422`, nagłówek
    `Idempotency-Key`

    ani wersjonowanie API.
  contact:
    name: Paymove Integration Team
    email: integration@paymove.io
    url: https://paymove.io
servers:
  - url: https://gateway-api.sandbox.paymove.io
    description: Środowisko Sandbox (testowe)
  - url: https://api.paymove.io
    description: Środowisko produkcyjne
security:
  - ApiKeyAuth: []
tags:
  - name: Płatności
    description: Tworzenie płatności
  - name: Produkty
    description: Zarządzanie produktami (merchantami)
  - name: Webhooki
    description: Rejestracja i przypisywanie webhooków
paths:
  /api/payment/product/{productId}/subproduct/{paymentHash}/status:
    get:
      tags:
        - Płatności
      summary: Sprawdź status płatności
      description: >
        Zwraca aktualny status płatności. Przydatne jako uzupełnienie webhooków
        — na przykład

        gdy klient wrócił na `returnUrl`, a powiadomienie jeszcze nie dotarło.


        **Uwaga: ten endpoint jest obsługiwany przez inny host niż pozostałe
        wywołania.**

        Sandbox: `https://pay-api.sandbox.paymove.io`, produkcja:
        `https://pay-api.paymove.io`.

        Ta ścieżka nie jest routowana przez `gateway-api.sandbox.paymove.io` ani

        `api.paymove.io` — wywołanie jej tam kończy się kodem 404 i odpowiedzią

        `text/plain` o treści `No route found for: GET …`, czyli nawet nie w
        formacie

        `{status, message}`.


        Endpoint nie wymaga klucza API, więc **nie przekazuj do niego danych
        wrażliwych**

        i nie traktuj samej odpowiedzi jako dowodu płatności w krytycznych
        przepływach —

        wiarygodnym potwierdzeniem jest zweryfikowany webhook.
      operationId: getPaymentStatus
      parameters:
        - name: productId
          in: path
          required: true
          description: UUID produktu (sklepu) lub jego `shortName`
          schema:
            type: string
            example: 891412c8-8717-4449-9543-e34112bec470
        - name: paymentHash
          in: path
          required: true
          description: >-
            10-znakowy skrót płatności z parametru `externalId` w `redirectUrl`.
            To NIE jest `externalId` przekazany przy tworzeniu płatności.
          schema:
            type: string
            example: ec6RtwTZKb
      responses:
        '200':
          description: Aktualny status płatności
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - INITIALIZED
                      - PENDING
                      - COMPLETED
                      - CANCELED
                      - ERROR
                      - REFUNDED
                      - WAITING_FOR_EXTERNAL_ACTION
                    description: Status płatności, zawsze jako łańcuch znaków
                  orderId:
                    type: string
                    description: Wewnętrzny identyfikator zamówienia w Paymove
              example:
                status: COMPLETED
                orderId: PAY1784798914400
        '404':
          description: Nie znaleziono płatności o podanym skrócie
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
              example:
                status: 404
                message: Payments for externalId ec6RtwTZKb not found
        '500':
          $ref: '#/components/responses/ServerError'
      security: []
      servers:
        - url: https://pay-api.sandbox.paymove.io
          description: Sandbox — usługa płatności
        - url: https://pay-api.paymove.io
          description: Produkcja — usługa płatności
      x-codeSamples:
        - lang: Shell
          label: curl
          source: |
            curl --request GET \
              --url https://pay-api.sandbox.paymove.io/api/payment/product/891412c8-8717-4449-9543-e34112bec470/subproduct/ec6RtwTZKb/status
components:
  schemas:
    ApiErrorResponse:
      type: object
      description: >-
        Jednolity kształt odpowiedzi błędu. Rozgałęziaj logikę po statusie HTTP
        — treść pola message bywa niestabilna i może zawierać wewnętrzne nazwy
        klas.
      properties:
        status:
          type: integer
          description: Kod statusu HTTP, powielony w treści odpowiedzi
          example: 401
        message:
          type: string
          description: Opis błędu przeznaczony dla człowieka — nie parsuj go w kodzie
          example: Invalid API key
  responses:
    ServerError:
      description: >-
        Błąd po stronie Paymove. Uwaga: ten kod zwracany jest także wtedy, gdy w
        żądaniu zabrakło `externalId` albo gdy identyfikator w ścieżce nie jest
        poprawnym UUID — zanim ponowisz wywołanie, sprawdź kompletność body i
        poprawność ścieżki.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiErrorResponse'
          example:
            status: 500
            message: Something went wrong
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY
      description: >
        Klucz API generowany w [Panelu Paymove](https://panel.paymove.io).


        Format: 51 znaków z prefiksem środowiska — `sk_test_` w sandboxie,

        `sk_live_` na produkcji.

        Przykład: `sk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`


        Klucz przekazuj wyłącznie z serwera. Żądanie wysłane ze strony sklepu
        zostanie

        odrzucone — a klucz i tak nigdy nie może trafić do kodu frontendowego.

````