Use global fields and skip mapping entirely
Every prebuilt integration is already mapped to PalDock’s global fields. Populate them once in your lead structure, whether leads arrive through the API or form, and the same fields feed every integration you run.
Integration overview
This prebuilt PalDock integration connects your lead flow directly to the advertiser. It handles field mapping, request delivery and response processing, so you can start sending leads without building the integration from scratch.
The integration uses PalDock’s global fields and returns standardized outcomes for reporting and routing, while preserving advertiser response details for troubleshooting.
Blueprint

{
"nodes": [
{
"id": "1-1",
"type": "startNode",
"position": {
"x": -341.23002826097,
"y": -23.971689380365
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "post",
"beType": "integration"
}
}
},
{
"id": "1-2",
"type": "setNode",
"position": {
"x": -283.46312459377,
"y": -222.41073759441
},
"data": {
"formData": {
"active": true,
"title": "Auth credentials",
"subtitle": "",
"fields": [
{
"key": "{auth0}",
"value": "{sign_keyid}:{token}"
}
]
}
}
},
{
"id": "1-3",
"type": "modifyFieldNode",
"position": {
"x": -152.70369826911,
"y": -132.96895032007
},
"data": {
"formData": {
"active": true,
"title": "Auth header",
"subtitle": "",
"data": [
{
"fieldName": "{auth}",
"fields": [
{
"source": "{auth0}",
"operator": "always",
"value": "",
"value2": "",
"modification": "to_base64",
"pattern": "",
"output": ""
}
]
}
]
}
}
},
{
"id": "1-4",
"type": "httpNode",
"position": {
"x": -91.161714805027,
"y": 32.295557575104
},
"data": {
"formData": {
"active": true,
"title": "Auth",
"subtitle": "",
"method": "POST",
"endpoint": "{endpoint_auth}oauth/token",
"timeout": 30,
"format": "application/x-www-form-urlencoded",
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "Content-Type",
"value": "application/x-www-form-urlencoded"
},
{
"key": "Authorization",
"value": "Basic {auth}"
}
],
"query": [],
"body": [
{
"key": "grant_type",
"value": "client_credentials"
}
],
"signature": null,
"insecure": null
}
}
},
{
"id": "1-5",
"type": "setNode",
"position": {
"x": 17,
"y": -100
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{access_token}",
"value": "{parsedBody.access_token}"
}
]
}
}
},
{
"id": "1-7",
"type": "modifyFieldNode",
"position": {
"x": 148.5,
"y": 30.5
},
"data": {
"formData": {
"active": true,
"title": "Transform data",
"subtitle": "",
"data": [
{
"fieldName": "{birth_date}",
"fields": [
{
"source": "{data_nin}",
"operator": "always",
"value": "",
"value2": "",
"modification": "cz_nin_to_birthdate",
"pattern": "",
"output": ""
}
]
},
{
"fieldName": "{data_cell_phone}",
"fields": [
{
"source": "{data_cell_phone}",
"operator": "always",
"value": "",
"value2": "",
"modification": "prefix",
"pattern": "",
"output": "+420"
}
]
}
]
}
}
},
{
"id": "1-9",
"type": "httpNode",
"position": {
"x": 254.00375602962,
"y": -126.27723037408
},
"data": {
"formData": {
"active": true,
"title": "Post",
"subtitle": "",
"method": "POST",
"endpoint": "{endpoint}api/v1/loan-applications",
"timeout": 30,
"format": "application/json",
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "Host",
"value": "{custom_host}"
},
{
"key": "Digest",
"value": "{digest}"
},
{
"key": "Signature",
"value": "{signature}"
},
{
"key": "X-Request-Id",
"value": "{step_run_id}"
},
{
"key": "Authorization",
"value": "Bearer {access_token}"
}
],
"query": [],
"body": [
{
"key": "country",
"value": "CZ"
},
{
"key": "language",
"value": "cs"
},
{
"key": "debtors.0.role",
"value": "1"
},
{
"key": "debtors.0.type",
"value": "NATURAL_PERSON"
},
{
"key": "applyForLoan.loanType",
"value": "CREDIT_LIMIT"
},
{
"key": "applyForLoan.term.term",
"value": "6"
},
{
"key": "applyForLoan.amount.amount",
"value": "{data_requested_amount}"
},
{
"key": "applyForLoan.term.termUnit",
"value": "MONTH"
},
{
"key": "applyForLoan.partnerPurpose",
"value": "OTHER"
},
{
"key": "applyForLoan.amount.currency",
"value": "CZK"
},
{
"key": "debtors.0.person.formattedName",
"value": "{data_first_name} {data_last_name}"
},
{
"key": "debtors.0.person.emails.0.value",
"value": "{data_email}"
},
{
"key": "debtors.0.person.addresses.0.type",
"value": "RESIDENCE"
},
{
"key": "debtors.0.person.emails.0.primary",
"value": "true"
},
{
"key": "debtors.0.person.identities.0.type",
"value": "SSN"
},
{
"key": "debtors.0.person.identities.0.value",
"value": "{data_nin}"
},
{
"key": "debtors.0.person.addresses.0.country",
"value": "CZ"
},
{
"key": "debtors.0.person.addresses.0.primary",
"value": "true"
},
{
"key": "debtors.0.person.phoneNumbers.0.type",
"value": "MOBILE"
},
{
"key": "debtors.0.person.identities.0.primary",
"value": "true"
},
{
"key": "debtors.0.person.phoneNumbers.0.value",
"value": "{data_cell_phone}"
},
{
"key": "applyForLoan.preferences.affiliateMode",
"value": "HAND_OVER"
},
{
"key": "applyForLoan.preferences.exactMatchOnly",
"value": "false"
},
{
"key": "debtors.0.person.phoneNumbers.0.primary",
"value": "true"
},
{
"key": "applyForLoan.preferences.contractRequired",
"value": "false"
},
{
"key": "applyForLoan.preferences.oneOfferRequired",
"value": "true"
},
{
"key": "debtors.0.person.naturalPerson.birth.date",
"value": "{birth_date}"
},
{
"key": "debtors.0.person.addresses.0.components.0.type",
"value": "CITY"
},
{
"key": "debtors.0.person.addresses.0.components.1.type",
"value": "ZIP_CODE"
},
{
"key": "debtors.0.person.addresses.0.components.2.type",
"value": "ADDRESS_LINE_1"
},
{
"key": "debtors.0.person.naturalPerson.names.0.primary",
"value": "true"
},
{
"key": "debtors.0.person.addresses.0.components.0.value",
"value": "{data_city}"
},
{
"key": "debtors.0.person.addresses.0.components.1.value",
"value": "{data_zip}"
},
{
"key": "debtors.0.person.addresses.0.components.2.value",
"value": "{data_street}"
},
{
"key": "debtors.0.person.naturalPerson.names.0.lastName",
"value": "{data_last_name}"
},
{
"key": "debtors.0.person.naturalPerson.names.0.firstName",
"value": "{data_first_name}"
},
{
"key": "debtors.0.person.naturalPerson.employments.0.primary",
"value": "true"
},
{
"key": "debtors.0.person.naturalPerson.employments.0.partnerType",
"value": "{data_income_type}"
},
{
"key": "debtors.0.person.naturalPerson.employments.0.employer.name",
"value": "{data_employer}"
},
{
"key": "debtors.0.person.naturalPerson.financialData.incomes.0.key",
"value": "GROSS_INCOME"
},
{
"key": "debtors.0.person.naturalPerson.financialData.expenses.0.key",
"value": "LIVING_COSTS"
},
{
"key": "debtors.0.person.naturalPerson.financialData.incomes.0.period",
"value": "MONTH"
},
{
"key": "debtors.0.person.naturalPerson.financialData.expenses.0.period",
"value": "MONTH"
},
{
"key": "debtors.0.person.naturalPerson.otherFacts.partnerMaritalStatus",
"value": "SINGLE"
},
{
"key": "debtors.0.person.naturalPerson.financialData.incomes.0.value.amount",
"value": "{data_monthly_income}"
},
{
"key": "debtors.0.person.naturalPerson.financialData.expenses.0.value.amount",
"value": "{data_expenses}"
},
{
"key": "debtors.0.person.naturalPerson.financialData.incomes.0.value.currency",
"value": "CZK"
},
{
"key": "debtors.0.person.naturalPerson.financialData.expenses.0.value.currency",
"value": "CZK"
},
{
"key": "debtors.0.person.naturalPerson.financialData.otherLoans.0.amount.amount",
"value": "0"
},
{
"key": "debtors.0.person.naturalPerson.financialData.otherLoans.0.amount.currency",
"value": "CZK"
}
],
"signature": {
"type": "digest_keyid_hmac",
"sha": "256",
"delimiter": "&"
},
"insecure": null
}
}
},
{
"id": "1-10",
"type": "setNode",
"position": {
"x": 405.20498262388,
"y": -13.25146146664
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{external_id}",
"value": "{parsedBody.applicationId}"
}
]
}
}
},
{
"id": "1-12",
"type": "webhookNode",
"position": {
"x": 513.41897676778,
"y": 65.756733488738
},
"data": {
"formData": {
"active": true,
"title": "Status webhook",
"subtitle": "",
"wait": true,
"timeout": 20,
"token": "1"
}
}
},
{
"id": "1-14",
"type": "httpNode",
"position": {
"x": 728.00900866109,
"y": -99.270543507305
},
"data": {
"formData": {
"active": true,
"title": "Offer",
"subtitle": "",
"method": "GET",
"endpoint": "{endpoint}api/v1/applications/{external_id}/offers",
"timeout": 40,
"format": "application/json",
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "Host",
"value": "{custom_host}"
},
{
"key": "Signature",
"value": "{signature}"
},
{
"key": "Timestamp",
"value": "{timestamp}"
},
{
"key": "X-Request-Id",
"value": "{step_run_id}"
},
{
"key": "Authorization",
"value": "Bearer {access_token}"
}
],
"query": [],
"body": [],
"signature": {
"type": "digest_keyid_hmac",
"sha": "256",
"delimiter": "&"
},
"insecure": null
}
}
},
{
"id": "1-15",
"type": "waitNode",
"position": {
"x": 492.33880260633,
"y": 258.16023970723
},
"data": {
"formData": {
"active": true,
"title": "Wait 1s",
"subtitle": "",
"type": "delay",
"delayValue": 1,
"delayUnit": "seconds",
"untilDate": null
}
}
},
{
"id": "1-16",
"type": "httpNode",
"position": {
"x": 442.26481761024,
"y": -165.75462475225
},
"data": {
"formData": {
"active": true,
"title": "Status",
"subtitle": "",
"method": "GET",
"endpoint": "{endpoint}api/v1/applications/{external_id}/status",
"timeout": 40,
"format": "application/json",
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "Host",
"value": "{custom_host}"
},
{
"key": "Signature",
"value": "{signature}"
},
{
"key": "Timestamp",
"value": "{timestamp}"
},
{
"key": "X-Request-Id",
"value": "{step_run_id}"
},
{
"key": "Authorization",
"value": "Bearer {access_token}"
}
],
"query": [],
"body": [],
"signature": {
"type": "digest_keyid_hmac",
"sha": "256",
"delimiter": "&"
},
"insecure": null
}
}
},
{
"id": "1-17",
"type": "setNode",
"position": {
"x": 929.85193259436,
"y": 32.551911181055
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{redirect_url}",
"value": "{parsedBody.offers.0.offerUrl}"
},
{
"key": "{external_id}",
"value": "{parsedBody.offers.0.offerId}"
}
]
}
}
},
{
"id": "1-18",
"type": "waitNode",
"position": {
"x": 752.07850487013,
"y": 172.91327217542
},
"data": {
"formData": {
"active": true,
"title": "Wait 2s",
"subtitle": "",
"type": "delay",
"delayValue": 2,
"delayUnit": "seconds",
"untilDate": null
}
}
},
{
"id": "1-19",
"type": "breakerNode",
"position": {
"x": 617.33848069845,
"y": 270.05632074515
},
"data": {
"formData": {
"active": true,
"title": "Breaker 3x",
"subtitle": "",
"maxRepetition": "3"
}
}
},
{
"id": "1-21",
"type": "endNode",
"position": {
"x": 1092.1663804927,
"y": -178.77534002409
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "1-22",
"type": "breakerNode",
"position": {
"x": 882.13768907333,
"y": 218.54131718867
},
"data": {
"formData": {
"active": true,
"title": "Breaker 2x",
"subtitle": "",
"maxRepetition": "2"
}
}
},
{
"id": "1-6",
"type": "modifyFieldNode",
"position": {
"x": 17,
"y": 220
},
"data": {
"formData": {
"active": true,
"title": "Reject reason · Auth",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.access_token}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "ERROR"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{status}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "auth failed, http {status}"
},
{
"source": "{parsedBody.error_description}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{parsedBody.error_description}"
}
]
}
]
}
}
},
{
"id": "1-8",
"type": "endNode",
"position": {
"x": 195.03505083052,
"y": 182.76288122891
},
"data": {
"formData": {
"active": true,
"title": "Rejected · Auth",
"subtitle": "",
"success": "failed"
}
}
},
{
"id": "1-11",
"type": "modifyFieldNode",
"position": {
"x": 280.25376185867,
"y": 290.89759318929
},
"data": {
"formData": {
"active": true,
"title": "Reject reason · Post",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.applicationId}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "ERROR"
},
{
"source": "{parsedBody.errors.0.code}",
"operator": "contains",
"value": "LENDING_0115",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Invalid Data"
},
{
"source": "{parsedBody.errors.0.code}",
"operator": "contains",
"value": "LENDING_0327",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Invalid Data"
},
{
"source": "{parsedBody.errors.0.code}",
"operator": "contains",
"value": "LENDING_0328",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Invalid Data"
},
{
"source": "{parsedBody.errors.0.code}",
"operator": "contains",
"value": "LENDING_0329",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Invalid Data"
},
{
"source": "{parsedBody.errors.0.code}",
"operator": "contains",
"value": "LENDING_0330",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Invalid Data"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{parsedBody.errors.0.code}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{parsedBody.errors.0.code}: {parsedBody.errors.0.detail}"
}
]
}
]
}
}
},
{
"id": "1-13",
"type": "endNode",
"position": {
"x": 572.4123729237,
"y": 381.9216612964
},
"data": {
"formData": {
"active": true,
"title": "Rejected · Post",
"subtitle": "",
"success": "failed"
}
}
},
{
"id": "1-20",
"type": "modifyFieldNode",
"position": {
"x": 600,
"y": -340
},
"data": {
"formData": {
"active": true,
"title": "Reject reason · Status",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.applicationStatus}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Unspecified"
},
{
"source": "{parsedBody.closingType}",
"operator": "equals",
"value": "EXPIRED",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Expired"
},
{
"source": "{parsedBody.closingType}",
"operator": "equals",
"value": "CANCELLED_BY_USER",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Cancelled by Customer"
},
{
"source": "{parsedBody.closingType}",
"operator": "equals",
"value": "CANCELLED_BY_PARTNER",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Cancelled by Advertiser"
},
{
"source": "{parsedBody.closingType}",
"operator": "equals",
"value": "CANCELLED_BY_SYSTEM",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Cancelled by Advertiser"
},
{
"source": "{parsedBody.closingType}",
"operator": "equals",
"value": "DENIED_BY_SCORING",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Poor Credit"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_001",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Age"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_002",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Age"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_003",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Poor Credit"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_004",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Fraud"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_005",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Not Eligible"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_007",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Existing Customer"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_008",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Existing Customer"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_010",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Low Income"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_013",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Verification Failed"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_020",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Low Income"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_021",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Too Much Debt"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_023",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Poor Credit"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_025",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "ERROR"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_026",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "ERROR"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_103",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Existing Customer"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "contains",
"value": "LENDING_DENY_999",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Unspecified"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{parsedBody.applicationStatus}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{parsedBody.applicationStatus} / {parsedBody.closingType}"
},
{
"source": "{parsedBody.closingReasons.0.code}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{parsedBody.closingType} / {parsedBody.closingReasons.0.code}: {parsedBody.closingReasons.0.description}"
}
]
}
]
}
}
},
{
"id": "1-23",
"type": "endNode",
"position": {
"x": 860,
"y": -340
},
"data": {
"formData": {
"active": true,
"title": "Rejected · Status",
"subtitle": "",
"success": "failed"
}
}
}
],
"edges": [
{
"id": "edge-1-1-1-2",
"source": "1-1",
"target": "1-2",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-2-1-3",
"source": "1-2",
"target": "1-3",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-3-1-4",
"source": "1-3",
"target": "1-4",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-4-1-5",
"source": "1-4",
"target": "1-5",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.access_token}",
"operator": "is_not_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-4-1-6",
"source": "1-4",
"target": "1-6",
"type": "customEdge",
"data": {
"active": true,
"title": "auth failed",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.access_token}",
"operator": "is_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-5-1-7",
"source": "1-5",
"target": "1-7",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-7-1-9",
"source": "1-7",
"target": "1-9",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-9-1-10",
"source": "1-9",
"target": "1-10",
"type": "customEdge",
"data": {
"active": true,
"title": "accepted",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.applicationId}",
"operator": "is_not_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-9-1-11",
"source": "1-9",
"target": "1-11",
"type": "customEdge",
"data": {
"active": true,
"title": "no applicationId",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.applicationId}",
"operator": "is_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-10-1-12",
"source": "1-10",
"target": "1-12",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-19-1-12",
"source": "1-19",
"target": "1-12",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{operationStatus}",
"operator": "not_equals",
"output": "COMPLETED",
"output2": ""
},
{
"value": "{actionType}",
"operator": "not_equals",
"output": "status-update",
"output2": ""
}
]
}
},
{
"id": "edge-1-16-1-12",
"source": "1-16",
"target": "1-12",
"type": "customEdge",
"data": {
"active": true,
"title": "not DEN|CAN",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.applicationStatus}",
"operator": "regex_not_match",
"output": "DEN|CAN",
"output2": ""
}
]
}
},
{
"id": "edge-1-12-1-14",
"source": "1-12",
"target": "1-14",
"type": "customEdge",
"data": {
"active": true,
"title": "offers-ready",
"subtitle": "",
"conditions": [
{
"value": "{operationStatus}",
"operator": "equals",
"output": "COMPLETED",
"output2": ""
},
{
"value": "{actionType}",
"operator": "equals",
"output": "offers-ready",
"output2": ""
}
]
}
},
{
"id": "edge-1-12-1-15",
"source": "1-12",
"target": "1-15",
"type": "customEdge",
"data": {
"active": true,
"title": "Not status-update",
"subtitle": "",
"conditions": [
{
"value": "{operationStatus}",
"operator": "not_equals",
"output": "COMPLETED",
"output2": ""
},
{
"value": "{actionType}",
"operator": "not_equals",
"output": "status-update",
"output2": ""
}
]
}
},
{
"id": "edge-1-12-1-16",
"source": "1-12",
"target": "1-16",
"type": "customEdge",
"data": {
"active": true,
"title": "status-update",
"subtitle": "",
"conditions": [
{
"value": "{operationStatus}",
"operator": "equals",
"output": "COMPLETED",
"output2": ""
},
{
"value": "{actionType}",
"operator": "equals",
"output": "status-update",
"output2": ""
}
]
}
},
{
"id": "edge-1-22-1-14",
"source": "1-22",
"target": "1-14",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-14-1-17",
"source": "1-14",
"target": "1-17",
"type": "customEdge",
"data": {
"active": true,
"title": "APPROVED",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.offers.0.offerUrl}",
"operator": "is_not_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-14-1-18",
"source": "1-14",
"target": "1-18",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.offers.0.offerUrl}",
"operator": "is_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-15-1-19",
"source": "1-15",
"target": "1-19",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-16-1-20",
"source": "1-16",
"target": "1-20",
"type": "customEdge",
"data": {
"active": true,
"title": "DEN|CAN",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.applicationStatus}",
"operator": "regex_match",
"output": "DEN|CAN",
"output2": ""
}
]
}
},
{
"id": "edge-1-17-1-21",
"source": "1-17",
"target": "1-21",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-18-1-22",
"source": "1-18",
"target": "1-22",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-6-1-8",
"source": "1-6",
"target": "1-8",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-11-1-13",
"source": "1-11",
"target": "1-13",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-20-1-23",
"source": "1-20",
"target": "1-23",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
}
]
}How it works
- Copy the blueprint and paste it in your PalDock workspace– Create a new integration in your workspace and paste the blueprint. Every field arrives prefilled.
- Enter your credentials – Paste the secrets you received from advertiser and set your Pingtree
- Send a test lead – Verify the response, then switch the channel live.
FAQ
Do I need my own contract with this advertiser?
Yes. PalDock delivers leads on your behalf, so the commercial agreement and API credentials come from the advertiser directly.
What happens to rejected leads?
The advertiser returns its decision in the delivery response. PalDock reads it and moves rejected leads to the next buyer in your pingtree automatically, so a rejection does not need to end the lead’s journey.
Can I change the field mapping?
Yes, but we do not recommend it. Blueprints are already mapped to PalDock’s global fields. If you use local fields, you need to remap each integration separately.
How long does setup take?
Few clicks, if you already have credentials. The blueprint arrives prefilled and mapped to PalDock’s global fields, so if your lead structure uses them, there is nothing to map. If you use local fields, you map them once.
What the integration does
Start sending leads in 3 clicks
Copy the prebuilt blueprint, add your credentials and start sending leads. No coding, no integration work.
Real-time lead delivery
Send leads to the advertiser instantly as they arrive, without exports, batches or manual processing.
No field mapping headache
PalDock global fields work across all prebuilt integrations. Map your lead data once and reuse it everywhere.
Know exactly why leads fail
Get standardized rejection reasons for reporting and advertiser’s response for the full context and troubleshooting.
API & integration details
OAuth2 for a bearer token, a signed request body on top of it, an asynchronous decision delivered by webhook, and a separate call to fetch the offer once it exists.
Four things have to go right in order: authenticate, submit, wait for the decision, fetch the offer. Each is a separate step and each can fail on its own.
What will be needed from advertiser
| Key | Purpose |
|---|---|
endpoint | Base API URL for application, status and offer calls. |
token | OAuth client secret. |
endpoint_auth | Base URL for OAuth authentication. |
sign_keyid | OAuth client ID and signing key ID. |
sign_secret | HMAC signing secret. |
custom_host | Host value used in signed requests. |
Flows
Post, as one flow:
Auth -> Post -> webhook (offers-ready | status-update) -> Offer -> Success
| |
+-- timeout -> Wait -> Breaker ---------+
|
+-- status-update -> Status -> DENIED|CANCELLED -> Rejected
Authentication runs once. The token stays valid for everything that follows, so a second Auth node before each request is duplication rather than safety.
Calls
Auth
POST {endpoint_auth}oauth/token
Authorization: Basic base64({sign_keyid}:{token})
Content-Type: application/x-www-form-urlencoded
format: application/x-www-form-urlencoded
grant_type=client_credentials
The client ID and secret are the two halves of Basic auth. Build the header at run time from {sign_keyid} and {token} rather than storing an encoded blob.
Post, Status and Offer
POST {endpoint}api/v1/loan-applications
GET {endpoint}api/v1/applications/{external_id}/status
GET {endpoint}api/v1/applications/{external_id}/offers
Authorization: Bearer {custom_access_token}
Host: {custom_host}
Digest: {digest}
Signature: {signature}
X-Request-Id: {step_run_id}
Content-Type: application/json
format: application/json
Signing uses the digest_keyid_hmac algorithm with SHA-256 and & as the delimiter. The node computes {digest} and {signature}; the secret itself lives in sign_secret and never travels. sign_keyid is the public key identifier the advertiser uses to pick which secret to verify against, which is why it also serves as the OAuth client ID.
Host has to be set explicitly because the signature covers it.
Request fields
Dotted paths, deeply nested, and the applicant sits inside a debtors array. Every field under it is prefixed debtors.0..
| Field | Required | Value |
|---|---|---|
country | yes | CZ |
language | yes | cs |
debtors.0.role | yes | 1 |
debtors.0.type | yes | NATURAL_PERSON |
debtors.0.person.formattedName | yes | {g_name_first} {g_name_last} |
debtors.0.person.naturalPerson.names.0.firstName | yes | {g_name_first} |
debtors.0.person.naturalPerson.names.0.lastName | yes | {g_name_last} |
debtors.0.person.naturalPerson.names.0.primary | yes | true |
debtors.0.person.naturalPerson.birth.date | yes | {g_birth_date}, or derived, see below |
debtors.0.person.identities.0.type | yes | SSN |
debtors.0.person.identities.0.value | yes | {g_id_national_number} |
debtors.0.person.identities.0.primary | yes | true |
debtors.0.person.emails.0.value | yes | {g_email} |
debtors.0.person.emails.0.primary | yes | true |
debtors.0.person.phoneNumbers.0.type | yes | MOBILE |
debtors.0.person.phoneNumbers.0.value | yes | {g_phone} with +420 |
debtors.0.person.phoneNumbers.0.primary | yes | true |
debtors.0.person.addresses.0.type | yes | RESIDENCE |
debtors.0.person.addresses.0.country | yes | CZ |
debtors.0.person.addresses.0.primary | yes | true |
debtors.0.person.addresses.0.components.0 | yes | type: CITY, value: {g_address_city} |
debtors.0.person.addresses.0.components.1 | yes | type: ZIP_CODE, value: {g_address_zip} |
debtors.0.person.addresses.0.components.2 | yes | type: ADDRESS_LINE_1, value: {g_address_street} |
...employments.0.partnerType | yes | {g_fin_type}, see enums |
...employments.0.employer.name | yes | {g_employer_name} |
...employments.0.primary | yes | true |
...financialData.incomes.0.key | yes | GROSS_INCOME |
...financialData.incomes.0.value.amount | yes | {g_fin_income} |
...financialData.incomes.0.value.currency | yes | CZK |
...financialData.incomes.0.period | yes | MONTH |
...financialData.expenses.0.key | yes | LIVING_COSTS |
...financialData.expenses.0.value.amount | yes | {g_fin_expenses} |
...financialData.otherLoans.0.amount.amount | yes | {g_fin_expenses_credit} |
...otherFacts.partnerMaritalStatus | yes | {g_marital_status}, see enums |
applyForLoan.loanType | yes | CREDIT_LIMIT |
applyForLoan.amount.amount | yes | {g_amount} |
applyForLoan.amount.currency | yes | CZK |
applyForLoan.term.term | yes | {g_period} |
applyForLoan.term.termUnit | yes | MONTH |
applyForLoan.partnerPurpose | yes | {g_purpose} |
applyForLoan.preferences.affiliateMode | yes | HAND_OVER |
applyForLoan.preferences.oneOfferRequired | yes | true |
applyForLoan.preferences.exactMatchOnly | yes | false |
applyForLoan.preferences.contractRequired | yes | false |
Date of birth comes from {g_birth_date} where the form collects it. Where it does not, derive it from the national ID with the built-in conversion rather than a hand-written regex:
{custom_birth_date} source {g_id_national_number} always cz_nin_to_birthdate
Phone numbers need the +420 prefix. Add it with the prefix modification.
preferences.oneOfferRequired: true and affiliateMode: HAND_OVER are what make the flow usable: one offer is produced and the applicant is handed over to Ferratum to complete it.
Enums
partnerType on employment, partnerMaritalStatus and partnerPurpose all take Ferratum’s own vocabularies. They are agreed per partner rather than published, so take them from the current contract rather than assuming.
The webhook
Ferratum does not answer synchronously. The application returns an applicationId and the decision arrives later on the callback endpoint, carrying two fields:
actionType | With operationStatus: COMPLETED | What to do |
|---|---|---|
offers-ready | The offer exists | Fetch it from the offers endpoint |
status-update | The application changed state | Fetch the status and read it |
A webhook that times out is not a rejection. Loop back through a Wait and a Breaker and ask the status endpoint directly. Both Breakers need their counts in their titles, and the synchronous limit applies for the whole time the applicant is on a loading screen.
Outcomes
The application call answers with an applicationId when it was accepted, and with an errors array when it was not. The decision itself arrives later, in applicationStatus and closingType from the status endpoint.
| Recognised by | Meaning | Reject reason | Frequency |
|---|---|---|---|
applicationId present | Application accepted, wait for the offer | common | |
offers.0.offerUrl present | Offer ready, this is the conversion | occasional | |
applicationStatus not matching `DEN | CAN` | Still running | |
errors.0.code: LENDING_0115 | Payload refused | Invalid Data | occasional |
errors.0.code: LENDING_0327 to LENDING_0330 | Payload refused | Invalid Data | occasional |
closingType: DENIED_BY_SCORING | Refused by scoring | Poor Credit | occasional |
closingType: EXPIRED | Offer never opened | Expired | occasional |
closingType: CANCELLED_BY_USER | The applicant walked away | Cancelled by Customer | occasional |
closingType: CANCELLED_BY_PARTNER | Ferratum cancelled it | Cancelled by Advertiser | rare |
closingType: CANCELLED_BY_SYSTEM | Cancelled automatically | Cancelled by Advertiser | rare |
closingReasons.0.code: LENDING_DENY_001 | Applicant underage | Age | occasional |
LENDING_DENY_002 | Applicant over the age limit | Age | occasional |
LENDING_DENY_003 | Too high risk | Poor Credit | common |
LENDING_DENY_004 | Fraud suspected | Fraud | rare |
LENDING_DENY_005 | Employment history too short | Not Eligible | occasional |
LENDING_DENY_008 | Existing loan | Existing Customer | occasional |
LENDING_DENY_010 | Monthly income too low | Low Income | occasional |
LENDING_DENY_013 | Identification failed | Verification Failed | occasional |
LENDING_DENY_021 | Affordability check | Too Much Debt | occasional |
LENDING_DENY_023 | Credit rating too low | Poor Credit | common |
LENDING_DENY_025 | Internal system error | technical | |
LENDING_DENY_026 | Third-party error | technical | |
LENDING_DENY_103 | Another offer already taken | Existing Customer | occasional |
LENDING_DENY_999 | Refused, no reason given | Unspecified | occasional |
LENDING_DENY_025 and _026 are Ferratum’s own failures wearing a rejection code. They are not the lead’s fault and should not be reported as a rejection reason. Leave them uncovered rather than mapping them.
An Auth call that returns no access_token is a broken integration, not a rejected lead. It gets its own End node and no reject reason.
Reject reasons come from the standard list. See Reject reason for what each one means and when to use it.
Branching
Auth succeeded:
{parsedBody.access_token} is not empty
Application accepted:
{parsedBody.applicationId} is not empty
Webhook, offer ready:
{operationStatus} equals COMPLETED
{actionType} equals offers-ready
Webhook, status changed:
{operationStatus} equals COMPLETED
{actionType} equals status-update
Status, terminal rejection:
{parsedBody.applicationStatus} regex match DEN|CAN
Status, still running, back to the webhook:
{parsedBody.applicationStatus} regex not match DEN|CAN
Offer ready:
{parsedBody.offers.0.offerUrl} is not empty
The offers array needs its index. {parsedBody.offers.offerUrl} resolves to literal text, which is never empty, so the branch fires on every response including the ones with no offer at all.
Stored values
| Parameter | Source |
|---|---|
{custom_access_token} | {parsedBody.access_token} from Auth |
{external_id} | {parsedBody.applicationId} from the application, then {parsedBody.offers.0.offerId} once the offer exists |
{redirect_url} | {parsedBody.offers.0.offerUrl} |
The application ID identifies the request; the offer ID identifies what was sold. Overwrite {external_id} with the offer ID at the end so the report reconciles against what Ferratum actually issued.
Advertiser APIs change without warning
When they do, leads stop being delivered, often before anyone notices. PalDock gives you delivery logs and alerts so you can catch it early. With Managed Integrations, we watch the connection and fix it for you.
