Onboarding przez API (headless)
Tryb dla partnerów, którzy chcą pełną kontrolę nad UI. Zbierasz dane merchanta we własnym interfejsie i wysyłasz je do dpay segmentami przez API. Akty, które prawnie musi wykonać sama osoba (weryfikacja kontaktu i tożsamości, oświadczenia, podpis umowy, przelew weryfikacyjny), realizuje merchant w krótkim hostowanym hand-offie dpay.
Dane strukturalne (firma, rachunek, beneficjenci, dokumenty) wysyłasz przez API i renderujesz we własnym UI. Akty osobiste (weryfikacja tożsamości, oświadczenia PEP, podpis umowy) zostają hostowane przez dpay - to wymóg bezpieczeństwa i zgodności, którego nie da się przenieść do Twojego UI.
Cały przepływ
Krok 1: utwórz draft
Draft wymaga danych kontaktowych osoby zakładającej konto i zaakceptowanych zgód. W odpowiedzi dostajesz ref (Twój partner_external_ref), którym adresujesz wszystkie dalsze wywołania.
/api/partner/v1/onboardingUtwórz draft onboardingu (idempotentne po partner_external_ref).Pełny kontrakt w API Reference
Utworzenie draftu jest idempotentne: powtórne POST /onboarding z tym samym partner_external_ref zwróci istniejący draft (200), nie utworzy duplikatu. Odpowiedź nie zawiera adresu hostowanego flow - dostaniesz go z finalize lub GET /onboarding/{ref} w polu next_action.url.
Krok 2: wyślij dane segmentami
Uzupełniasz draft niezależnymi segmentami. Każdy segment możesz wysłać osobno i wielokrotnie (nadpisuje poprzednią wartość). Gdy konto jest już aktywne, segmenty zapisu przestają być edytowalne i zwracają 409.
Dane firmy
Segment rozstrzyga typ podmiotu (osoba fizyczna czy firma) i - dla firmy - zbiera dane rejestrowe oraz adres. Po podaniu NIP dpay pobiera dane z rejestrów publicznych; podmiot wykreślony z rejestru zwraca 422.
/api/partner/v1/onboarding/{ref}/companyDane firmy / typ podmiotu.Pełny kontrakt w API Reference
Rachunek bankowy i profil transakcyjny
Rachunek, na który merchant będzie otrzymywał rozliczenia i wypłaty, wraz z profilem działalności wymaganym przez przepisy AML. Segment wymaga wcześniejszego ustalenia typu podmiotu (PATCH /company).
/api/partner/v1/onboarding/{ref}/bank-accountRachunek rozliczeniowy i profil transakcyjny (AML).Pełny kontrakt w API Reference
Dane tożsamości i reprezentacji
Prefill tożsamości głównego wnioskodawcy. Dotyczy osoby fizycznej lub właściciela JDG; w spółce wieloosobowej tożsamość reprezentanta ustalana jest w hostowanym flow (ten segment zwróci wtedy 422). Sama weryfikacja tożsamości i oświadczenia PEP zawsze zostają w hand-offie.
/api/partner/v1/onboarding/{ref}/identityPrefill tożsamości głównego wnioskodawcy.Pełny kontrakt w API Reference
Segment reprezentacji dotyczy tylko spółek wieloosobowych (422 w pozostałych przypadkach). Odpowiedź wskazuje tryb reprezentacji i czy wymagane jest zaproszenie lub pełnomocnictwo.
/api/partner/v1/onboarding/{ref}/representationReprezentacja spółki wieloosobowej.Pełny kontrakt w API Reference
Dokumenty, beneficjenci, zaproszenia
Dokumenty przesyłasz jako plik (multipart lub base64) z typem dokumentu i podmiotem, albo jako dokument działalności regulowanej. Odpowiedź zwraca document_id - zachowaj go, aby dołączyć pełnomocnictwo do zaproszenia reprezentanta-pełnomocnika. Duplikat dokumentu regulowanego zwraca 409.
/api/partner/v1/onboarding/{ref}/documentsPrześlij dokument (multipart lub base64).Pełny kontrakt w API Reference
Beneficjenci rzeczywiści dotyczą spółek wieloosobowych - dodajesz ich wraz z tożsamością, adresem, dokumentem i oświadczeniami. Dodany wpis możesz też usunąć.
POST/api/partner/v1/onboarding/{ref}/beneficiariesDodaj beneficjenta rzeczywistego.Pełny kontrakt w API Reference
DELETE/api/partner/v1/onboarding/{ref}/beneficiaries/{uuid}Usuń beneficjenta.Pełny kontrakt w API Reference
Jeśli akty osobiste ma dokończyć inna osoba (członek zarządu lub beneficjent), zapraszasz ją - dostanie własny link do hostowanego flow. Zaproszenie jest idempotentne po external_ref (powtórka nie wyśle drugiego SMS-a), a odpowiedzi oraz lista zaproszeń są wolne od danych osobowych zaproszonego. Możesz też ponowić wysyłkę (cooldown - zbyt szybka powtórka zwraca 429) lub anulować zaproszenie (link przestaje działać).
/api/partner/v1/onboarding/{ref}/invitationsZaproś drugą osobę (reprezentant / beneficjent).Pełny kontrakt w API Reference
GET/api/partner/v1/onboarding/{ref}/invitationsLista zaproszeń (bez danych osobowych).Pełny kontrakt w API Reference
POST/api/partner/v1/onboarding/{ref}/invitations/{id}/resendPonów wysyłkę zaproszenia.Pełny kontrakt w API Reference
DELETE/api/partner/v1/onboarding/{ref}/invitations/{id}Anuluj zaproszenie.Pełny kontrakt w API Reference
Nie musisz zbierać wszystkiego ręcznie. Po podaniu NIP dpay potrafi uzupełnić dane firmy i beneficjentów z rejestrów publicznych. W praktyce często wystarczy wysłać NIP i rachunek, a resztę merchant tylko potwierdza w hand-offie.
Krok 3: finalize
Gdy komplet danych jest wysłany, wywołujesz finalize. To operacja tylko do odczytu: sprawdza kompletność danych i zwraca hostowany hand-off - zawsze z kodem 200, także gdy czegoś brakuje.
/api/partner/v1/onboarding/{ref}/finalizeSprawdź kompletność i pobierz hostowany hand-off.Pełny kontrakt w API Reference
next_action.urlto hostowany adres wznowienia: loguje merchanta (tokenem w ścieżce) i przenosi go do właściwego kroku.next_action.embeddablemówi, czy możesz osadzić ten adres w iframe:true, gdy Twoja domena jest zarejestrowana do osadzania. Przyfalseprzekieruj merchanta nanext_action.urlna najwyższym poziomie okna.missingto lista kodów braków danych. Pusta lista oznacza komplet danych - merchant nadal musi wykonać akty osobiste podnext_action.url.
Kody braków (missing[])
| Kod | Znaczenie |
|---|---|
account_type.missing | Nie wybrano typu podmiotu (najpierw PATCH /company). |
company.nip_missing | Brak NIP / danych rejestrowych firmy. |
bank.account_missing | Brak rachunku / profilu transakcyjnego. |
identity.pesel_missing | Brak tożsamości głównego wnioskodawcy (osoba fizyczna / JDG). |
representation.required | Brak decyzji o reprezentacji (spółka wieloosobowa). |
beneficiaries.required | Brak beneficjenta rzeczywistego i brak oczekującego zaproszenia. |
documents.required | Zaległe dokumenty (w tym bazowe dokumenty firmowe). |
Krok 4: hand-off aktów osobistych
Przekieruj merchanta na next_action.url (albo osadź go przez SDK), aby dokończył akty, których nie da się wykonać przez API:
- weryfikacja kontaktu (kody SMS + e-mail),
- weryfikacja tożsamości,
- oświadczenia (m.in. PEP),
- podpis umowy (kod SMS),
- przelew weryfikacyjny.
Po każdej zmianie statusu dostajesz webhook.
Wznawianie i osadzanie (token wznowienia)
Token wznowienia to ostatni segment ścieżki next_action.url (48 znaków, bez przedrostka). Możesz osadzić hand-off w swojej stronie przez SDK:
<script src="https://panel.dpay.pl/sdk/dpay-onboarding-sdk.js"></script>
<script>
DpayOnboarding.mountResume('#dpay-onboarding', {
token: '<token z next_action.url>',
ref: 'faktura-klient-123',
onEvent: function (e) { /* { type, payload } */ },
});
</script>
Katalog zdarzeń i pozostałe opcje opisuje onboarding przez iframe. Jeśli next_action.embeddable jest false, zamiast osadzać przekieruj merchanta na next_action.url.
Token daje dostęp do dokończenia onboardingu tego merchanta - traktuj go jak sekret (nie loguj, nie osadzaj w URL współdzielonych). Link jest ważny 45 dni i przestaje działać po aktywacji konta - w obu przypadkach zwraca 410 Gone. Powtórny POST /onboarding z tym samym ref zwraca istniejący draft bez wymiany tokenu - po wygaśnięciu linku skontaktuj się z dpay.
Status onboardingu
Status pojedynczego onboardingu odczytasz w każdej chwili. next_action jest zawsze obiektem (jego url może być null), a lista invited nie zawiera danych osobowych zaproszonych.
/api/partner/v1/onboarding/{ref}Status pojedynczego onboardingu.Pełny kontrakt w API Reference
Listę wszystkich onboardingów Twojego kanału zwraca osobny endpoint z paginacją kursorową. Znaczenie statusów opisuje cykl życia konta.
GET/api/partner/v1/onboardingLista onboardingów kanału (paginacja kursorowa).Pełny kontrakt w API Reference
Do reakcji na zmiany używaj webhooków (push), a GET /onboarding/{ref} traktuj jako uzupełniające sprawdzenie (pull). Nie odpytuj statusu w pętli co sekundę.
Kody błędów
| Kod | Znaczenie |
|---|---|
401 | Brak / nieprawidłowy / cofnięty klucz partnera. |
403 | Klucz nie ma wymaganego scope. |
404 | Nieznany ref w Twoich kanałach. |
409 | Onboarding już aktywny - dane nie są już edytowalne (lub duplikat dokumentu regulowanego). |
410 | Link wznowienia wygasł lub konto jest już aktywne (trasa hostowana). |
422 | Błąd walidacji albo segment nie dotyczy tego typu podmiotu. |
429 | Cooldown ponownej wysyłki zaproszenia. |