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": 40
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "post",
"beType": "integration"
}
}
},
{
"id": "2-1",
"type": "startNode",
"position": {
"x": -760,
"y": 400
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "ping",
"beType": "integration"
}
}
},
{
"id": "1-2",
"type": "modifyFieldNode",
"position": {
"x": -550,
"y": 40
},
"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"
}
]
},
{
"fieldName": "{same_address}",
"fields": [
{
"source": "{data_different_contact_address}",
"operator": "equals",
"value": "true",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "0"
},
{
"source": "{data_different_contact_address}",
"operator": "equals",
"value": "false",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "1"
}
]
},
{
"fieldName": "{data_employed_time}",
"fields": [
{
"source": "{data_employed_time}",
"operator": "equals",
"value": "3-month",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "1"
},
{
"source": "{data_employed_time}",
"operator": "equals",
"value": "1-year",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "3"
},
{
"source": "{data_employed_time}",
"operator": "equals",
"value": "1-2-year",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "4"
},
{
"source": "{data_employed_time}",
"operator": "equals",
"value": "2-5-year",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "5"
},
{
"source": "{data_employed_time}",
"operator": "equals",
"value": "5-year-plus",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "8"
}
]
}
]
}
}
},
{
"id": "1-3",
"type": "httpNode",
"position": {
"x": -310,
"y": 40
},
"data": {
"formData": {
"active": true,
"title": "Post",
"subtitle": "",
"method": "GET",
"endpoint": "{endpoint}/fe/leadSignUp",
"timeout": 30,
"format": null,
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [],
"query": [
{
"key": "zip",
"value": "{data_zip}"
},
{
"key": "auth",
"value": "{token}"
},
{
"key": "city",
"value": "{data_city}"
},
{
"key": "email",
"value": "{data_email}"
},
{
"key": "period",
"value": "toInt({data_period})"
},
{
"key": "street",
"value": "{data_street}"
},
{
"key": "employer",
"value": "{data_employer}"
},
{
"key": "bank_code",
"value": "{data_bank_code}"
},
{
"key": "job_title",
"value": "{data_job_title}"
},
{
"key": "last_name",
"value": "{data_last_name}"
},
{
"key": "cell_phone",
"value": "{data_cell_phone}"
},
{
"key": "first_name",
"value": "{data_first_name}"
},
{
"key": "ip_address",
"value": "{ip_address}"
},
{
"key": "contact_zip",
"value": "{data_contact_zip}"
},
{
"key": "home_status",
"value": "{data_home_status}"
},
{
"key": "income_type",
"value": "{data_income_type}"
},
{
"key": "birth_number",
"value": "{data_nin}"
},
{
"key": "contact_city",
"value": "{data_contact_city}"
},
{
"key": "house_number",
"value": "{data_house_number}"
},
{
"key": "same_address",
"value": "toBool({same_address})"
},
{
"key": "employed_time",
"value": "toInt({data_employed_time})"
},
{
"key": "source_detail",
"value": "{eid}"
},
{
"key": "company_number",
"value": "{data_company_number_imported}"
},
{
"key": "contact_street",
"value": "{data_contact_street}"
},
{
"key": "employer_phone",
"value": "{data_employer_phone}"
},
{
"key": "monthly_income",
"value": "toInt({data_monthly_income})"
},
{
"key": "employer_address",
"value": "{data_employer_address}"
},
{
"key": "monthly_expenses",
"value": "toInt({data_expenses})"
},
{
"key": "requested_amount",
"value": "toFloat({data_requested_amount})"
},
{
"key": "bank_account_number",
"value": "{data_account_number}"
},
{
"key": "contact_house_number",
"value": "{data_contact_house_number}"
},
{
"key": "identity_card_number",
"value": "{data_identity_card_number}"
}
],
"body": [],
"signature": null,
"insecure": null
}
}
},
{
"id": "1-4",
"type": "setNode",
"position": {
"x": -40,
"y": -20
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{external_id}",
"value": "{parsedBody.refno}"
},
{
"key": "{redirect_url}",
"value": "{parsedBody.url}"
}
]
}
}
},
{
"id": "1-6",
"type": "endNode",
"position": {
"x": 210,
"y": -20
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "1-5",
"type": "modifyFieldNode",
"position": {
"x": -40,
"y": 140
},
"data": {
"formData": {
"active": true,
"title": "Reject reason",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.status}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Unspecified"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{parsedBody.status}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "DuoFinance status {parsedBody.status}"
},
{
"source": "{parsedBody.refno}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "DuoFinance status {parsedBody.status}, refno={parsedBody.refno}"
}
]
}
]
}
}
},
{
"id": "1-7",
"type": "endNode",
"position": {
"x": 210,
"y": 140
},
"data": {
"formData": {
"active": true,
"title": "Rejected",
"subtitle": "",
"success": "failed"
}
}
},
{
"id": "2-2",
"type": "modifyFieldNode",
"position": {
"x": -550,
"y": 400
},
"data": {
"formData": {
"active": true,
"title": "Transform data",
"subtitle": "",
"data": [
{
"fieldName": "{data_home_status}",
"fields": [
{
"source": "{data_home_status}",
"operator": "equals",
"value": "owner",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "HOME_OWNER"
},
{
"source": "{data_home_status}",
"operator": "equals",
"value": "tenant",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "TENANT"
},
{
"source": "{data_home_status}",
"operator": "equals",
"value": "family",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "CO_OWNED"
},
{
"source": "{data_home_status}",
"operator": "equals",
"value": "employ-benefits",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "EMPLOYEE_BENEFIT"
}
]
},
{
"fieldName": "{data_period}",
"fields": [
{
"source": "{data_period}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "30"
}
]
}
]
}
}
},
{
"id": "2-3",
"type": "httpNode",
"position": {
"x": -310,
"y": 400
},
"data": {
"formData": {
"active": true,
"title": "Ping",
"subtitle": "",
"method": "GET",
"endpoint": "{endpoint}/fe/leadFindPerson",
"timeout": 30,
"format": null,
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [],
"query": [
{
"key": "zip",
"value": "{data_zip}"
},
{
"key": "auth",
"value": "{token}"
},
{
"key": "city",
"value": "{data_city}"
},
{
"key": "period",
"value": "toInt({data_period})"
},
{
"key": "street",
"value": "{data_street}"
},
{
"key": "last_name",
"value": "{data_last_name}"
},
{
"key": "first_name",
"value": "{data_first_name}"
},
{
"key": "ip_address",
"value": "{ip_address}"
},
{
"key": "home_status",
"value": "{data_home_status}"
},
{
"key": "birth_number",
"value": "{data_nin}"
},
{
"key": "house_number",
"value": "{data_house_number}"
},
{
"key": "source_detail",
"value": "{eid}"
},
{
"key": "requested_amount",
"value": "toFloat({data_requested_amount})"
}
],
"body": [],
"signature": null,
"insecure": null
}
}
},
{
"id": "2-4",
"type": "endNode",
"position": {
"x": -40,
"y": 340
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "2-5",
"type": "modifyFieldNode",
"position": {
"x": -40,
"y": 500
},
"data": {
"formData": {
"active": true,
"title": "Reject reason",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.status}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Unspecified"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{parsedBody.status}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "DuoFinance status {parsedBody.status}"
},
{
"source": "{parsedBody.refno}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "DuoFinance status {parsedBody.status}, refno={parsedBody.refno}"
}
]
}
]
}
}
},
{
"id": "2-6",
"type": "endNode",
"position": {
"x": 210,
"y": 500
},
"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": "Accepted",
"subtitle": "",
"conditions": [
{
"value": "{status}",
"operator": "equals",
"output": "404",
"output2": ""
},
{
"value": "{parsedBody.status}",
"operator": "equals",
"output": "404",
"output2": ""
},
{
"value": "{parsedBody.url}",
"operator": "is_not_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-3-1-5",
"source": "1-3",
"target": "1-5",
"type": "customEdge",
"data": {
"active": true,
"title": "Rejected",
"subtitle": "",
"conditions": [
{
"value": "{status}",
"operator": "equals",
"output": "200",
"output2": ""
},
{
"value": "{parsedBody.status}",
"operator": "equals",
"output": "200",
"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": []
}
},
{
"id": "edge-2-2-2-3",
"source": "2-2",
"target": "2-3",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-2-3-2-4",
"source": "2-3",
"target": "2-4",
"type": "customEdge",
"data": {
"active": true,
"title": "Accepted",
"subtitle": "",
"conditions": [
{
"value": "{status}",
"operator": "equals",
"output": "404",
"output2": ""
},
{
"value": "{parsedBody.status}",
"operator": "equals",
"output": "404",
"output2": ""
}
]
}
},
{
"id": "edge-2-3-2-5",
"source": "2-3",
"target": "2-5",
"type": "customEdge",
"data": {
"active": true,
"title": "Rejected",
"subtitle": "",
"conditions": [
{
"value": "{status}",
"operator": "equals",
"output": "200",
"output2": ""
},
{
"value": "{parsedBody.status}",
"operator": "equals",
"output": "200",
"output2": ""
}
]
}
},
{
"id": "edge-2-5-2-6",
"source": "2-5",
"target": "2-6",
"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
Everything travels in the query string on GET requests, and the status codes are inverted relative to every other integration in this library:
| HTTP | Meaning |
|---|---|
404 | The advertiser wants the lead |
200 | The advertiser is not interested |
500 | Mixed: sometimes a real failure, sometimes a validation message |
404 means “person not found”, which is exactly the answer that makes a lead worth having. An integration that treats 404 as a failure and 200 as a success sells nothing and reports every good lead as an error.
What will be needed from advertiser
| Key | Purpose |
|---|---|
endpoint | Base API URL. |
token | Value for the auth query parameter. |
Flows
Ping, GET /fe/leadFindPerson. Identifying fields only. 404 means proceed.
Post, GET /fe/leadSignUp. Full payload. 404 with a url means accepted.
Calls
GET {endpoint}/fe/leadFindPerson?auth={token}&…
GET {endpoint}/fe/leadSignUp?auth={token}&…
Auth is the auth query parameter. There are no headers and no body.
Request fields
All as query parameters.
Ping
| Field | Required | Value |
|---|---|---|
auth | yes | {token} |
first_name | yes | {g_name_first} |
last_name | yes | {g_name_last} |
birth_number | yes | {g_id_national_number} |
street | yes | {g_address_street} |
house_number | yes | {g_address_street_number} |
city | yes | {g_address_city} |
zip | yes | {g_address_zip} |
home_status | yes | {g_home_type}, see enums |
requested_amount | yes | toFloat({g_amount}) |
period | yes | toInt({g_period}) |
ip_address | yes | {ip_address} |
source_detail | yes | {send_id} |
Post
Everything above, plus:
| Field | Required | Value |
|---|---|---|
email | yes | {g_email} |
cell_phone | yes | {g_phone} |
identity_card_number | yes | {g_id_card_number} |
income_type | yes | {g_fin_type}, see enums |
monthly_income | yes | toInt({g_fin_income}) |
monthly_expenses | yes | toInt({g_fin_expenses}) |
employer | no | {g_employer_name} |
employer_phone | no | {g_employer_phone} |
employer_address | no | {g_employer_address} |
job_title | no | {g_employ_position} |
employed_time | no | {g_employ_time}, see enums |
company_number | self-employed | {g_company_registration} |
bank_account_number | yes | {g_bank_account_number} |
bank_code | yes | {g_bank_account_code} |
contact_street | no | {g_address_contact_street} |
contact_zip | no | {g_address_contact_zip} |
contact_city | no | {g_address_contact_city} |
same_address | yes | toBool(...), inverse of {g_address_contact_status} |
marital_status | no | {g_marital_status}, see enums |
same_address is inverted relative to a “contact address differs” checkbox.
Numeric fields are typed. Convert inline with toInt(...) and toFloat(...) in the HTTP node, one conversion, never nested.
Enums
income_type: EMPLOYED, SELF_EMPLOYED, MATERNITY_LEAVE, PENSION, UNEMPLOYED, OTHER.
home_status: HOME_OWNER, TENANT, DORMITORY, HOSTEL, MINISTRY, EMPLOYEE_BENEFIT, CO_OWNED.
marital_status: SINGLE, MARRIED, PARTNERSHIP, DIVORCED, WIDOWED, SEPARATED.
employed_time is a bucket count: 1 under three months, 3 under a year, 4 one to two years, 5 two to five years, 8 over five years. Where the form’s bucket falls between two of the advertiser’s, choose the one that presents the lead as qualifying.
Outcomes
The body carries its own status field and it does not agree with the HTTP status code. Neither one alone is reliable at the post: the signal that the lead was taken is the presence of url.
| Recognised by | HTTP | Meaning | Reject reason | Frequency |
|---|---|---|---|---|
status: 404 | 404 | Person not known, proceed | , | common |
url present | 404 | Accepted | , | common |
status: 200 | 200 | Not interested, no reason given | Unspecified | common |
| , | 500 | Internal error | , (technical) | rare |
The vocabulary is this small. There is no reason code and no message beyond Person not found, so every refusal is Unspecified.
Reject reasons come from the standard list. See Reject reason for what each one means and when to use it.
Branching
Ping, proceed:
{status} equals 404
{parsedBody.status} equals 404
The ping also returns 404 with refno and url already filled in for a person the advertiser recognises. Both are still “wanted”; the post is what records the lead.
Ping, not interested:
{status} equals 200
{parsedBody.status} equals 200
Post, accepted:
{status} equals 404
{parsedBody.status} equals 404
{parsedBody.url} is not empty
Post, refused:
{status} equals 200
{parsedBody.status} equals 200
500 gets a branch only for the validation cases, and only because the body names a field:
{status} equals 500
{body} regex match Kontrolni cifra|Invalid email address
leadgenia: disabled and the database errors get no branch. They Dead End, which is what makes them visible.
Stored values
| Parameter | Source |
|---|---|
{external_id} | {parsedBody.refno} |
{redirect_url} | {parsedBody.url} |
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.
