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

Blueprint for new customers
{
"nodes": [
{
"id": "1-1",
"type": "startNode",
"position": {
"x": -620,
"y": 40
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "post",
"beType": "integration"
}
}
},
{
"id": "1-2",
"type": "modifyFieldNode",
"position": {
"x": -420,
"y": 40
},
"data": {
"formData": {
"active": true,
"title": "Transform data",
"subtitle": "",
"data": [
{
"fieldName": "{data_requested_amount}",
"fields": [
{
"source": "{data_requested_amount}",
"operator": "is_greater_than",
"value": "16000",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "16000"
}
]
},
{
"fieldName": "{data_income_type}",
"fields": [
{
"source": "{data_income_type}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "OTHER"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "full-time",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "EMPLOYEE"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "self-employed",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "SELF_EMPLOYED"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "parental",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "OTHER"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "pension",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "RETIREE"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "unemployed",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "UNEMPLOYED"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "other",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "OTHER"
}
]
},
{
"fieldName": "{data_home_status}",
"fields": [
{
"source": "{data_home_status}",
"operator": "equals",
"value": "owner",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "OWNED"
},
{
"source": "{data_home_status}",
"operator": "equals",
"value": "tenant",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "RENT"
},
{
"source": "{data_home_status}",
"operator": "equals",
"value": "family",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "WITH_RELATIVES"
},
{
"source": "{data_home_status}",
"operator": "equals",
"value": "employ-benefits",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "EMPLOYER"
}
]
}
]
}
}
},
{
"id": "1-3",
"type": "httpNode",
"position": {
"x": -180,
"y": 40
},
"data": {
"formData": {
"active": true,
"title": "Post",
"subtitle": "",
"method": "POST",
"endpoint": "{endpoint}/affiliate-api",
"timeout": 30,
"format": "application/json",
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "Content-Type",
"value": "application/json"
}
],
"query": [],
"body": [
{
"key": "city",
"value": "{data_city}"
},
{
"key": "term",
"value": "{data_period}"
},
{
"key": "email",
"value": "{data_email}"
},
{
"key": "amount",
"value": "{data_requested_amount}"
},
{
"key": "cardId",
"value": "{data_identity_card_number}"
},
{
"key": "street",
"value": "{data_street}"
},
{
"key": "lastName",
"value": "{data_last_name}"
},
{
"key": "termType",
"value": "DAYS"
},
{
"key": "firstName",
"value": "{data_first_name}"
},
{
"key": "acceptNews",
"value": "false"
},
{
"key": "personalId",
"value": "{data_nin}"
},
{
"key": "postalCode",
"value": "{data_zip}"
},
{
"key": "mobilePhone",
"value": "{data_cell_phone}"
},
{
"key": "clientIncome",
"value": "{data_monthly_income}"
},
{
"key": "newsAccepted",
"value": "false"
},
{
"key": "affiliateToken",
"value": "{eid}"
},
{
"key": "clientExpenses",
"value": "{data_expenses}"
},
{
"key": "employmentType",
"value": "{data_income_type}"
},
{
"key": "acceptAgreement",
"value": "true"
},
{
"key": "applicationType",
"value": "WEB"
},
{
"key": "houseFlatNumber",
"value": "{data_house_number}"
},
{
"key": "acceptDataSharing",
"value": "true"
},
{
"key": "accommodationType",
"value": "{data_home_status}"
},
{
"key": "affiliateProvider",
"value": "{partner_id}"
},
{
"key": "bankAccountNumber",
"value": "{data_account_number}/{data_bank_code}"
},
{
"key": "numberOfHouseholdMembers",
"value": "1"
},
{
"key": "numberOfEmployedHouseholdMembers",
"value": "1"
}
],
"signature": null,
"insecure": null
}
}
},
{
"id": "1-7",
"type": "setNode",
"position": {
"x": 100,
"y": -80
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{redirect_url}",
"value": "{parsedBody.url}"
},
{
"key": "{external_id}",
"value": "{custom_api_token}"
}
]
}
}
},
{
"id": "1-8",
"type": "endNode",
"position": {
"x": 340,
"y": -80
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "1-4",
"type": "modifyFieldNode",
"position": {
"x": 100,
"y": 160
},
"data": {
"formData": {
"active": true,
"title": "Reject reason",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{body}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Unspecified"
},
{
"source": "{parsedBody}",
"operator": "regex_match",
"value": "/login",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Duplicate"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{body}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{body}"
}
]
}
]
}
}
},
{
"id": "1-6",
"type": "endNode",
"position": {
"x": 340,
"y": 160
},
"data": {
"formData": {
"active": true,
"title": "Rejected",
"subtitle": "",
"success": "failed"
}
}
},
{
"id": "1-5",
"type": "modifyFieldNode",
"position": {
"x": 180,
"y": -160
},
"data": {
"formData": {
"active": true,
"title": "Extract ID",
"subtitle": "",
"data": [
{
"fieldName": "{custom_api_token}",
"fields": [
{
"source": "{parsedBody.url}",
"operator": "always",
"value": "",
"value2": "",
"modification": "first_regex_match",
"pattern": "",
"output": "(?<=apiToken=)[^&]+"
}
]
}
]
}
}
}
],
"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": [
{
"value": "{status}",
"operator": "equals",
"output": "200",
"output2": ""
},
{
"value": "{parsedBody}",
"operator": "regex_not_match",
"output": "/continue/affiliate",
"output2": ""
}
]
}
},
{
"id": "edge-1-3-1-5",
"source": "1-3",
"target": "1-5",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{status}",
"operator": "equals",
"output": "200",
"output2": ""
},
{
"value": "{parsedBody}",
"operator": "regex_match",
"output": "/continue/affiliate",
"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-8",
"source": "1-7",
"target": "1-8",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-4-1-6",
"source": "1-4",
"target": "1-6",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
}
]
}Blueprint for repeated customers
{
"nodes": [
{
"id": "1-1",
"type": "startNode",
"position": {
"x": -620,
"y": 40
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "post",
"beType": "integration"
}
}
},
{
"id": "1-2",
"type": "modifyFieldNode",
"position": {
"x": -420,
"y": 40
},
"data": {
"formData": {
"active": true,
"title": "Transform data",
"subtitle": "",
"data": [
{
"fieldName": "{data_requested_amount}",
"fields": [
{
"source": "{data_requested_amount}",
"operator": "is_greater_than",
"value": "35000",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "35000"
}
]
},
{
"fieldName": "{data_income_type}",
"fields": [
{
"source": "{data_income_type}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "OTHER"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "full-time",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "EMPLOYEE"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "self-employed",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "SELF_EMPLOYED"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "parental",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "OTHER"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "pension",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "RETIREE"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "unemployed",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "UNEMPLOYED"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "other",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "OTHER"
}
]
},
{
"fieldName": "{data_home_status}",
"fields": [
{
"source": "{data_home_status}",
"operator": "equals",
"value": "owner",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "OWNED"
},
{
"source": "{data_home_status}",
"operator": "equals",
"value": "tenant",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "RENT"
},
{
"source": "{data_home_status}",
"operator": "equals",
"value": "family",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "WITH_RELATIVES"
},
{
"source": "{data_home_status}",
"operator": "equals",
"value": "employ-benefits",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "EMPLOYER"
}
]
}
]
}
}
},
{
"id": "1-3",
"type": "httpNode",
"position": {
"x": -180,
"y": 40
},
"data": {
"formData": {
"active": true,
"title": "Post",
"subtitle": "",
"method": "POST",
"endpoint": "{endpoint}/affiliate-api",
"timeout": 30,
"format": "application/json",
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "Content-Type",
"value": "application/json"
}
],
"query": [],
"body": [
{
"key": "city",
"value": "{data_city}"
},
{
"key": "term",
"value": "{data_period}"
},
{
"key": "email",
"value": "{data_email}"
},
{
"key": "amount",
"value": "{data_requested_amount}"
},
{
"key": "cardId",
"value": "{data_identity_card_number}"
},
{
"key": "street",
"value": "{data_street}"
},
{
"key": "lastName",
"value": "{data_last_name}"
},
{
"key": "termType",
"value": "DAYS"
},
{
"key": "firstName",
"value": "{data_first_name}"
},
{
"key": "acceptNews",
"value": "false"
},
{
"key": "personalId",
"value": "{data_nin}"
},
{
"key": "postalCode",
"value": "{data_zip}"
},
{
"key": "mobilePhone",
"value": "{data_cell_phone}"
},
{
"key": "clientIncome",
"value": "{data_monthly_income}"
},
{
"key": "newsAccepted",
"value": "false"
},
{
"key": "affiliateToken",
"value": "{eid}"
},
{
"key": "clientExpenses",
"value": "{data_expenses}"
},
{
"key": "employmentType",
"value": "{data_income_type}"
},
{
"key": "acceptAgreement",
"value": "true"
},
{
"key": "applicationType",
"value": "WEB"
},
{
"key": "houseFlatNumber",
"value": "{data_house_number}"
},
{
"key": "acceptDataSharing",
"value": "true"
},
{
"key": "accommodationType",
"value": "{data_home_status}"
},
{
"key": "affiliateProvider",
"value": "{partner_id}"
},
{
"key": "bankAccountNumber",
"value": "{data_account_number}/{data_bank_code}"
},
{
"key": "numberOfHouseholdMembers",
"value": "1"
},
{
"key": "numberOfEmployedHouseholdMembers",
"value": "1"
}
],
"signature": null,
"insecure": null
}
}
},
{
"id": "1-4",
"type": "setNode",
"position": {
"x": 100,
"y": -80
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{redirect_url}",
"value": "{parsedBody.url}"
}
]
}
}
},
{
"id": "1-6",
"type": "endNode",
"position": {
"x": 340,
"y": -80
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "1-5",
"type": "modifyFieldNode",
"position": {
"x": 100,
"y": 160
},
"data": {
"formData": {
"active": true,
"title": "Reject reason",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{body}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Unspecified"
},
{
"source": "{parsedBody}",
"operator": "regex_match",
"value": "/continue/affiliate",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Product Mismatch"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{body}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{body}"
}
]
}
]
}
}
},
{
"id": "1-7",
"type": "endNode",
"position": {
"x": 340,
"y": 160
},
"data": {
"formData": {
"active": true,
"title": "Rejected",
"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": [
{
"value": "{status}",
"operator": "equals",
"output": "200",
"output2": ""
},
{
"value": "{parsedBody}",
"operator": "regex_match",
"output": "/login",
"output2": ""
}
]
}
},
{
"id": "edge-1-3-1-5",
"source": "1-3",
"target": "1-5",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{status}",
"operator": "equals",
"output": "200",
"output2": ""
},
{
"value": "{parsedBody}",
"operator": "regex_not_match",
"output": "/login",
"output2": ""
}
]
}
},
{
"id": "edge-1-4-1-6",
"source": "1-4",
"target": "1-6",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-5-1-7",
"source": "1-5",
"target": "1-7",
"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
One call, one answer. There is no ping and no lookup, the affiliate endpoint registers the applicant and decides in the same request.
The response is two fields wide, and everything hangs on them:
{ "resolution": "SUCCESS", "url": "https://registration.zaplo.cz/…" }
{ "resolution": "REJECTED" }
What will be needed from advertiser
| Key | Purpose |
|---|---|
endpoint | Base API URL. |
partner_id | Affiliate provider identifier. |
Flows
Post, POST /affiliate-api. Registers and decides.
Calls
POST {endpoint}/affiliate-api
Content-Type: application/json
format: application/json
Credentials travel in the body rather than a header: affiliateProvider is the partner identifier and affiliateToken carries the lead reference.
Request fields
| Field | Required | Value |
|---|---|---|
firstName | yes | {g_name_first} |
lastName | yes | {g_name_last} |
personalId | yes | {g_id_national_number} |
cardId | yes | {g_id_card_number} |
email | yes | {g_email} |
mobilePhone | yes | {g_phone} |
street | yes | {g_address_street} |
houseFlatNumber | yes | {g_address_street_number} |
city | yes | {g_address_city} |
postalCode | yes | {g_address_zip} |
bankAccountNumber | yes | {g_bank_account_number}/{g_bank_account_code} |
clientIncome | yes | {g_fin_income} |
clientExpenses | yes | {g_fin_expenses} |
employmentType | yes | {g_fin_type}, see enums |
amount | yes | {g_amount} |
term | yes | {g_period} |
termType | yes | DAYS |
accommodationType | yes | {g_home_type}, see enums |
numberOfHouseholdMembers | yes | {g_household_members} |
numberOfEmployedHouseholdMembers | yes | {g_household_members_adults} |
applicationType | yes | WEB |
acceptAgreement | yes | true |
acceptDataSharing | yes | true |
acceptNews | yes | false unless the applicant opted in |
newsAccepted | yes | same value as acceptNews |
affiliateProvider | yes | {partner_id} |
affiliateToken | yes | {send_id} |
bankAccountNumber is the full account with the code appended after a slash, compose it in the HTTP node, not in a Modify step.
acceptNews and newsAccepted are two names for the same consent and both are read. Send the same value into both.
Enums
employmentType: EMPLOYEE, SELF_EMPLOYED, RETIREE, UNEMPLOYED, OTHER. Maternity has no option, map it to OTHER.
accommodationType: OWNED, RENT, WITH_RELATIVES, EMPLOYER.
Which URL you get matters
An accepted lead comes back with resolution: SUCCESS and a url, and the path of that URL says what kind of customer this is:
| URL path | Meaning |
|---|---|
/continue/affiliate?apiToken=... | New applicant, the registration continues on Zaplo |
/login | Existing customer, they are sent to sign in |
Zaplo is therefore configured as two integrations, one selling new applicants and one selling returning ones, and each treats the other’s URL as Product Mismatch rather than as a sale.
The apiToken in the new-applicant URL is the only durable reference the response gives. Extract it from {parsedBody.url} with first_regex_match and the pattern (?<=apiToken=)[^&]+.
Outcomes
| Recognised by | HTTP | Meaning | Reject reason | Frequency |
|---|---|---|---|---|
resolution: SUCCESS, url ~ /continue/affiliate | 200 | Accepted, new applicant | , | occasional |
resolution: SUCCESS, url ~ /login | 200 | Accepted, existing customer | , | occasional |
resolution: REJECTED | 200 | Refused, no reason given | Unspecified | common |
errors[].message ~ Application is rejected | 200 | Refused by scoring | Unspecified | documented only |
errors[] on empty or malformed input | 200 | Payload refused | Invalid Data | documented only |
errors[] ~ credit limit exceeded | 200 | Over the limit | Too Much Debt | documented only |
REJECTED is almost all of the traffic and carries nothing else, no code, no message. Unspecified, and the volume is exactly the argument to take to the advertiser when asking for reason codes.
The documented errors array does not appear in production; the live endpoint collapses everything into the one word. Map it anyway.
Reject reasons come from the standard list. See Reject reason for what each one means and when to use it.
Branching
Match on resolution, not on the URL text. {parsedBody} is a parsed object, and a contains or regex condition against it matches nothing, the branch never fires.
New-applicant integration, accepted:
{status} equals 200
{parsedBody.resolution} equals SUCCESS
{parsedBody.url} regex match /continue/affiliate
Returning-customer integration, accepted:
{status} equals 200
{parsedBody.resolution} equals SUCCESS
{parsedBody.url} regex match /login
Refused, a catch-all scoped to the business response:
{status} equals 200
{parsedBody.resolution} regex not match ^SUCCESS$
Wrong kind of customer, on either integration:
{status} equals 200
{parsedBody.resolution} equals SUCCESS
{parsedBody.url} regex not match /continue/affiliate ← or /login
502 and 500 return an empty body and no business result. They get no branch.
Stored values
| Parameter | Source |
|---|---|
{external_id} | apiToken extracted from {parsedBody.url} |
{redirect_url} | {parsedBody.url} |
On the returning-customer flow the /login URL has no token, so there is nothing durable to store beyond the redirect.
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.
