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": -760,
"y": -120
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "post",
"beType": "integration"
}
}
},
{
"id": "2-1",
"type": "startNode",
"position": {
"x": -760,
"y": 310
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "ping",
"beType": "integration"
}
}
},
{
"id": "1-2",
"type": "modifyFieldNode",
"position": {
"x": -570,
"y": -120
},
"data": {
"formData": {
"active": true,
"title": "Transform data",
"subtitle": "",
"data": [
{
"fieldName": "{data_income_type}",
"fields": [
{
"source": "{data_income_type}",
"operator": "equals",
"value": "full-time",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "EMPLOYED"
},
{
"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": "MATERNITY_LEAVE"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "pension",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "PENSION"
},
{
"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"
}
]
}
]
}
}
},
{
"id": "1-3",
"type": "httpNode",
"position": {
"x": -350,
"y": -120
},
"data": {
"formData": {
"active": true,
"title": "Post",
"subtitle": "",
"method": "POST",
"endpoint": "{endpoint}/v2/lead/create",
"timeout": 30,
"format": "application/json",
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "Content-Type",
"value": "application/json"
}
],
"query": [
{
"key": "lmc",
"value": "{partner_id}"
},
{
"key": "access-token",
"value": "{token}"
},
{
"key": "version_hash",
"value": "{custom_version_hash}"
}
],
"body": [
{
"key": "ssn",
"value": "{data_nin}"
},
{
"key": "zip",
"value": "{data_zip}"
},
{
"key": "city",
"value": "{data_city}"
},
{
"key": "name",
"value": "{data_first_name}"
},
{
"key": "email",
"value": "{data_email}"
},
{
"key": "phone",
"value": "{data_cell_phone}"
},
{
"key": "amount",
"value": "{data_requested_amount}"
},
{
"key": "number",
"value": "{data_house_number}"
},
{
"key": "street",
"value": "{data_street}"
},
{
"key": "surname",
"value": "{data_last_name}"
},
{
"key": "bankCode",
"value": "{data_bank_code}"
},
{
"key": "employer",
"value": "{data_employer}"
},
{
"key": "loanTerm",
"value": "{data_period}"
},
{
"key": "homeStatus",
"value": "{data_home_status}"
},
{
"key": "incomeType",
"value": "{data_income_type}"
},
{
"key": "employedTime",
"value": "{data_employed_time}"
},
{
"key": "monthlyIncome",
"value": "{data_monthly_income}"
},
{
"key": "monthlyExpenses",
"value": "{data_expenses}"
},
{
"key": "bankAccountNumber",
"value": "{data_account_number}"
},
{
"key": "identityCardNumber",
"value": "{data_identity_card_number}"
},
{
"key": "lmSubParams.lmsub1",
"value": "{eid}"
}
],
"signature": null,
"insecure": null
}
}
},
{
"id": "1-4",
"type": "setNode",
"position": {
"x": -110,
"y": -220
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{external_id}",
"value": "{parsedBody.data.process_id}"
}
]
}
}
},
{
"id": "1-6",
"type": "waitNode",
"position": {
"x": 80,
"y": -220
},
"data": {
"formData": {
"active": true,
"title": "Wait 20s",
"subtitle": "",
"type": "delay",
"delayValue": 20,
"delayUnit": "seconds",
"untilDate": null
}
}
},
{
"id": "1-8",
"type": "httpNode",
"position": {
"x": 280,
"y": -220
},
"data": {
"formData": {
"active": true,
"title": "Status",
"subtitle": "",
"method": "GET",
"endpoint": "{endpoint}/v2/lead/process-check-result/",
"timeout": 30,
"format": "application/json",
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "Content-Type",
"value": "application/json"
}
],
"query": [
{
"key": "lmc",
"value": "{partner_id}"
},
{
"key": "process_id",
"value": "{external_id}"
},
{
"key": "access-token",
"value": "{token}"
},
{
"key": "version_hash",
"value": "{custom_version_hash}"
}
],
"body": [],
"signature": null,
"insecure": null
}
}
},
{
"id": "1-9",
"type": "setNode",
"position": {
"x": 520,
"y": -300
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{redirect_url}",
"value": "{parsedBody.data.result.url}"
}
]
}
}
},
{
"id": "1-11",
"type": "endNode",
"position": {
"x": 740,
"y": -300
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "1-10",
"type": "waitNode",
"position": {
"x": 500,
"y": -90
},
"data": {
"formData": {
"active": true,
"title": "Wait 5s",
"subtitle": "",
"type": "delay",
"delayValue": 5,
"delayUnit": "seconds",
"untilDate": null
}
}
},
{
"id": "1-12",
"type": "breakerNode",
"position": {
"x": 300,
"y": 20
},
"data": {
"formData": {
"active": true,
"title": "Breaker 4x",
"subtitle": "",
"maxRepetition": "4"
}
}
},
{
"id": "1-5",
"type": "modifyFieldNode",
"position": {
"x": -90,
"y": 60
},
"data": {
"formData": {
"active": true,
"title": "Reject reason · Create",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.data.name}",
"operator": "equals",
"value": "Validation failed",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Invalid Data"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{body}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{body}"
}
]
}
]
}
}
},
{
"id": "1-7",
"type": "endNode",
"position": {
"x": 140,
"y": 80
},
"data": {
"formData": {
"active": true,
"title": "Rejected · Create",
"subtitle": "",
"success": "failed"
}
}
},
{
"id": "2-2",
"type": "httpNode",
"position": {
"x": -540,
"y": 310
},
"data": {
"formData": {
"active": true,
"title": "Ping",
"subtitle": "",
"method": "POST",
"endpoint": "{endpoint}/v2/duplicity/check",
"timeout": 30,
"format": "application/json",
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "Content-Type",
"value": "application/json"
}
],
"query": [
{
"key": "access-token",
"value": "{token}"
},
{
"key": "version_hash",
"value": "{custom_version_hash}"
}
],
"body": [
{
"key": "email",
"value": "{data_email}"
},
{
"key": "phone",
"value": "{data_cell_phone}"
}
],
"signature": null,
"insecure": null
}
}
},
{
"id": "2-3",
"type": "endNode",
"position": {
"x": -250,
"y": 220
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "2-4",
"type": "modifyFieldNode",
"position": {
"x": -260,
"y": 400
},
"data": {
"formData": {
"active": true,
"title": "Reject reason",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.data.duplicate}",
"operator": "equals",
"value": "YES",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Duplicate"
},
{
"source": "{parsedBody.data.result}",
"operator": "equals",
"value": "Validation failed",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Invalid Data"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{body}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{body}"
}
]
}
]
}
}
},
{
"id": "2-5",
"type": "endNode",
"position": {
"x": 20,
"y": 400
},
"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-2-1-2-2",
"source": "2-1",
"target": "2-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": "201",
"output2": ""
},
{
"value": "{parsedBody.success}",
"operator": "equals",
"output": "true",
"output2": ""
},
{
"value": "{parsedBody.data.process_id}",
"operator": "is_not_empty",
"output": "",
"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": "422",
"output2": ""
},
{
"value": "{parsedBody.success}",
"operator": "equals",
"output": "false",
"output2": ""
},
{
"value": "{parsedBody.data.name}",
"operator": "equals",
"output": "Validation failed",
"output2": ""
}
]
}
},
{
"id": "edge-1-4-1-6",
"source": "1-4",
"target": "1-6",
"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-12-1-8",
"source": "1-12",
"target": "1-8",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-8-1-9",
"source": "1-8",
"target": "1-9",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{status}",
"operator": "equals",
"output": "200",
"output2": ""
},
{
"value": "{parsedBody.success}",
"operator": "equals",
"output": "true",
"output2": ""
},
{
"value": "{parsedBody.data.result.type}",
"operator": "equals",
"output": "2",
"output2": ""
},
{
"value": "{parsedBody.data.result.url}",
"operator": "is_not_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-8-1-10",
"source": "1-8",
"target": "1-10",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{status}",
"operator": "equals",
"output": "200",
"output2": ""
},
{
"value": "{parsedBody.success}",
"operator": "equals",
"output": "true",
"output2": ""
},
{
"value": "{parsedBody.data.result.type}",
"operator": "equals",
"output": "0",
"output2": ""
}
]
}
},
{
"id": "edge-1-9-1-11",
"source": "1-9",
"target": "1-11",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-10-1-12",
"source": "1-10",
"target": "1-12",
"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": []
}
},
{
"id": "edge-2-2-2-3",
"source": "2-2",
"target": "2-3",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{status}",
"operator": "equals",
"output": "200",
"output2": ""
},
{
"value": "{parsedBody.success}",
"operator": "equals",
"output": "true",
"output2": ""
},
{
"value": "{parsedBody.data.duplicate}",
"operator": "equals",
"output": "NO",
"output2": ""
}
]
}
},
{
"id": "edge-2-2-2-4",
"source": "2-2",
"target": "2-4",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{status}",
"operator": "regex_match",
"output": "^(200|422)$",
"output2": ""
},
{
"value": "{body}",
"operator": "regex_match",
"output": "\\\"duplicate\\\"\\s*:\\s*\\\"YES\\\"|\\\"result\\\"\\s*:\\s*\\\"Validation failed\\\"",
"output2": ""
}
]
}
},
{
"id": "edge-2-4-2-5",
"source": "2-4",
"target": "2-5",
"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
A lead broker rather than a lender: the create call starts an asynchronous process and the answer arrives later from a separate status endpoint. The redirect URL only exists once the process has finished.
Two things shape the build. The decision is data.result.type, a number, not a string. And the process is genuinely slow, so the loop is the integration.
What will be needed from advertiser
| Key | Purpose |
|---|---|
endpoint | Base API URL for the selected environment. |
token | Value for the access-token query parameter. |
partner_id | Partner code sent as lmc. |
custom_version_hash | Form version hash sent as version_hash. |
Flows
Ping, POST /v2/duplicity/check. E-mail and phone only. Answers duplicate: YES or NO.
Post, POST /v2/lead/create starts the process and returns a process_id, then GET /v2/lead/process-check-result is polled until it resolves.
Calls
POST {endpoint}/v2/duplicity/check
POST {endpoint}/v2/lead/create
GET {endpoint}/v2/lead/process-check-result/
Content-Type: application/json
format: application/json
Credentials travel as query parameters on every call: access-token, lmc for the partner code, and version_hash identifying the form version in use.
The advertiser also exposes /test-v2/... twins of each endpoint. Point {endpoint} at whichever environment the integration is running in rather than hardcoding the path.
GET /v2/lead/get-inputs returns the fields the current form version requires, which is worth calling once when the version hash changes rather than per lead.
Request fields
Ping
| Field | Required | Value |
|---|---|---|
email | yes | {g_email} |
phone | yes | {g_phone} |
Post
| Field | Required | Value |
|---|---|---|
name | yes | {g_name_first} |
surname | yes | {g_name_last} |
ssn | yes | {g_id_national_number} |
identityCardNumber | yes | {g_id_card_number} |
email | yes | {g_email} |
phone | yes | {g_phone} |
street | yes | {g_address_street} |
number | yes | {g_address_street_number} |
city | yes | {g_address_city} |
zip | yes | {g_address_zip} |
homeStatus | yes | {g_home_type} |
incomeType | yes | {g_fin_type}, see enums |
monthlyIncome | yes | {g_fin_income} |
monthlyExpenses | yes | {g_fin_expenses} |
employer | no | {g_employer_name} |
employedTime | no | {g_employ_time} |
bankAccountNumber | yes | {g_bank_account_number} |
bankCode | yes | {g_bank_account_code} |
amount | yes | {g_amount} |
loanTerm | yes | {g_period} |
lmSubParams.lmsub1 | yes | {send_id} |
lmSubParams.lmsub1 is the reference Hyperia echoes back in postbacks, so it has to be a value you can match on later.
Enums
incomeType: EMPLOYED, SELF_EMPLOYED, MATERNITY_LEAVE, PENSION, UNEMPLOYED, OTHER.
The accepted set for homeStatus, employedTime and bankCode depends on the form version, which is what version_hash identifies. Take them from get-inputs for the version in use rather than from a fixed list.
Outcomes
Every response is wrapped in success plus a data object. success describes the call, not the decision, so it is a precondition rather than a branch.
At the status endpoint the decision is data.result.type, a number:
type | Meaning |
|---|---|
0 | Still processing, ask again |
2 | Finished, data.result.url holds the redirect |
| Recognised by | HTTP | Meaning | Reject reason | Frequency |
|---|---|---|---|---|
data.duplicate: NO | 200 | Not on file, proceed | common | |
data.name: Processed + process_id | 201 | Process started | occasional | |
data.result.type: 2 + url | 200 | Accepted | common | |
data.result.type: 0 | 200 | Still processing | (loop) | occasional |
data.duplicate: YES | 200 | Already on file | Duplicate | documented only |
data.result: Validation failed at the ping | 422 | Payload refused, field named | Invalid Data | rare |
data.name: Validation failed at the create | 422 | Payload refused, field named | Invalid Data | rare |
The 422 body carries data.errors keyed by field name, for example {"email": ["Zadaný e-mail neexistuje"]} and {"zip": ["PSČ nemá správný formát"]}. Pass the whole body through in {reason_detail}; a run of the same field name means the form needs fixing rather than the blueprint.
Note that a validation failure at the ping and at the create put their message in different places, data.result and data.name respectively. Both are Validation failed.
Reject reasons come from the standard list. See Reject reason for what each one means and when to use it.
Branching
Ping, not on file:
{status} equals 200
{parsedBody.success} equals true
{parsedBody.data.duplicate} equals NO
Ping, refused, matched against {body} so both the duplicate and the validation shape are covered by one condition:
{status} regex match ^(200|422)$
{body} regex match "duplicate"\s*:\s*"YES"|"result"\s*:\s*"Validation failed"
Create, started:
{status} equals 201
{parsedBody.success} equals true
{parsedBody.data.process_id} is not empty
Status, finished:
{status} equals 200
{parsedBody.success} equals true
{parsedBody.data.result.type} equals 2
{parsedBody.data.result.url} is not empty
Status, still processing, back through Wait and Breaker:
{parsedBody.data.result.type} equals 0
The first wait is long, because the process takes tens of seconds to resolve. Watch the synchronous limit: the applicant is on a loading screen for the whole loop, and the wait plus the Breaker’s repetitions have to fit inside it.
Every loop carries a Breaker with its count in the title.
Stored values
| Parameter | Source |
|---|---|
{external_id} | {parsedBody.data.process_id} from the create |
{redirect_url} | {parsedBody.data.result.url} from the status call |
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.
