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": -560,
"y": 360
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "ping",
"beType": "integration"
}
}
},
{
"id": "2-1",
"type": "startNode",
"position": {
"x": -560,
"y": 40
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "post",
"beType": "integration"
}
}
},
{
"id": "1-2",
"type": "modifyFieldNode",
"position": {
"x": -360,
"y": 360
},
"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"
}
]
}
]
}
}
},
{
"id": "1-3",
"type": "httpNode",
"position": {
"x": -140,
"y": 360
},
"data": {
"formData": {
"active": true,
"title": "Ping",
"subtitle": "",
"method": "POST",
"endpoint": "{endpoint}/api/v1/leads/check",
"timeout": 30,
"format": null,
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [],
"query": [],
"body": [
{
"key": "code",
"value": "{partner_id}"
},
{
"key": "token",
"value": "{token}"
},
{
"key": "sourceDetail",
"value": "{username}"
},
{
"key": "residenceAddress.zip",
"value": "{data_zip}"
},
{
"key": "personalInfo.lastName",
"value": "{data_last_name}"
},
{
"key": "residenceAddress.city",
"value": "{data_city}"
},
{
"key": "personalInfo.firstName",
"value": "{data_first_name}"
},
{
"key": "residenceAddress.street",
"value": "{data_street}"
},
{
"key": "personalInfo.birthNumber",
"value": "{data_nin}"
},
{
"key": "residenceAddress.homeStatus",
"value": "{data_home_status}"
},
{
"key": "residenceAddress.houseNumber",
"value": "{data_house_number}"
}
],
"signature": null,
"insecure": null
}
}
},
{
"id": "1-4",
"type": "endNode",
"position": {
"x": 320,
"y": 300
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "2-2",
"type": "modifyFieldNode",
"position": {
"x": -360,
"y": 40
},
"data": {
"formData": {
"active": true,
"title": "Transform data",
"subtitle": "",
"data": [
{
"fieldName": "{data_different_contact_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"
},
{
"source": "{data_different_contact_address}",
"operator": "always",
"value": "",
"value2": "",
"modification": "to_bool",
"pattern": "",
"output": ""
}
]
},
{
"fieldName": "{data_cell_phone}",
"fields": [
{
"source": "{data_cell_phone}",
"operator": "always",
"value": "",
"value2": "",
"modification": "regex_replace",
"pattern": "^\\s*(?:(?:\\+?420|00420)[\\s().-]*)?(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)\\s*$",
"output": "+420$1$2$3$4$5$6$7$8$9"
}
]
},
{
"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": "{data_employer_phone}",
"fields": [
{
"source": "{data_employer_phone}",
"operator": "always",
"value": "",
"value2": "",
"modification": "regex_replace",
"pattern": "^\\s*(?:(?:\\+?420|00420)[\\s().-]*)?(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)[\\s().-]*(\\d)\\s*$",
"output": "+420$1$2$3$4$5$6$7$8$9"
}
]
},
{
"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"
},
{
"source": "{data_employed_time}",
"operator": "always",
"value": "",
"value2": "",
"modification": "to_int",
"pattern": "",
"output": ""
}
]
}
]
}
}
},
{
"id": "2-3",
"type": "httpNode",
"position": {
"x": -140,
"y": 40
},
"data": {
"formData": {
"active": true,
"title": "Post",
"subtitle": "",
"method": "POST",
"endpoint": "{endpoint}/api/v1/leads/signup",
"timeout": 30,
"format": null,
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [],
"query": [],
"body": [
{
"key": "code",
"value": "{partner_id}"
},
{
"key": "token",
"value": "{token}"
},
{
"key": "period",
"value": "toInt({data_period})"
},
{
"key": "product",
"value": "loan"
},
{
"key": "ipAddress",
"value": "{ip_address}"
},
{
"key": "sameAddress",
"value": "{data_different_contact_address}"
},
{
"key": "sourceDetail",
"value": "{username}"
},
{
"key": "requestedAmount",
"value": "toInt({data_requested_amount})"
},
{
"key": "bankData.bankCode",
"value": "{data_bank_code}"
},
{
"key": "contactAddress.zip",
"value": "{data_contact_zip}"
},
{
"key": "personalInfo.email",
"value": "{data_email}"
},
{
"key": "contactAddress.city",
"value": "{data_contact_city}"
},
{
"key": "residenceAddress.zip",
"value": "{data_zip}"
},
{
"key": "contactAddress.street",
"value": "{data_contact_street}"
},
{
"key": "employerData.employer",
"value": "{data_employer}"
},
{
"key": "employerData.jobTitle",
"value": "{data_job_title}"
},
{
"key": "personalInfo.lastName",
"value": "{data_last_name}"
},
{
"key": "residenceAddress.city",
"value": "{data_city}"
},
{
"key": "personalInfo.cellPhone",
"value": "{data_cell_phone}"
},
{
"key": "personalInfo.firstName",
"value": "{data_first_name}"
},
{
"key": "personalInfo.incomeType",
"value": "{data_income_type}"
},
{
"key": "residenceAddress.street",
"value": "{data_street}"
},
{
"key": "incomeData.monthlyIncome",
"value": "toInt({data_monthly_income})"
},
{
"key": "personalInfo.birthNumber",
"value": "{data_nin}"
},
{
"key": "employerData.employedTime",
"value": "{data_employed_time}"
},
{
"key": "bankData.bankAccountNumber",
"value": "{data_account_number}"
},
{
"key": "contactAddress.houseNumber",
"value": "{data_contact_house_number}"
},
{
"key": "employerData.employerPhone",
"value": "{data_employer_phone}"
},
{
"key": "incomeData.monthlyExpenses",
"value": "toInt({data_expenses})"
},
{
"key": "residenceAddress.homeStatus",
"value": "{data_home_status}"
},
{
"key": "residenceAddress.houseNumber",
"value": "{data_house_number}"
},
{
"key": "personalInfo.identityCardNumber",
"value": "{data_identity_card_number}"
},
{
"key": "employerData.employerAddress.city",
"value": "{data_employer_address}"
}
],
"signature": null,
"insecure": null
}
}
},
{
"id": "2-4",
"type": "setNode",
"position": {
"x": 100,
"y": -40
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{redirect_url}",
"value": "{parsedBody.data.url}"
},
{
"key": "{external_id}",
"value": "{parsedBody.data.refNo}"
}
]
}
}
},
{
"id": "2-6",
"type": "endNode",
"position": {
"x": 320,
"y": -40
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "1-5",
"type": "modifyFieldNode",
"position": {
"x": 100,
"y": 440
},
"data": {
"formData": {
"active": true,
"title": "Reject reason",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.data.status}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Unspecified"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{body}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{body}"
},
{
"source": "{parsedBody.message}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{parsedBody.message}"
}
]
}
]
}
}
},
{
"id": "1-6",
"type": "endNode",
"position": {
"x": 320,
"y": 440
},
"data": {
"formData": {
"active": true,
"title": "Rejected",
"subtitle": "",
"success": "failed"
}
}
},
{
"id": "2-5",
"type": "modifyFieldNode",
"position": {
"x": 100,
"y": 120
},
"data": {
"formData": {
"active": true,
"title": "Reject reason",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.data.status}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Unspecified"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{body}",
"operator": "always",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{body}"
},
{
"source": "{parsedBody.message}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{parsedBody.message}"
}
]
}
]
}
}
},
{
"id": "2-7",
"type": "endNode",
"position": {
"x": 320,
"y": 120
},
"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": "{parsedBody.data.status}",
"operator": "equals",
"output": "Accepted",
"output2": ""
}
]
}
},
{
"id": "edge-1-3-1-5",
"source": "1-3",
"target": "1-5",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.data.status}",
"operator": "equals",
"output": "Rejected",
"output2": ""
}
]
}
},
{
"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": "",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.data.status}",
"operator": "equals",
"output": "Accepted",
"output2": ""
}
]
}
},
{
"id": "edge-2-3-2-5",
"source": "2-3",
"target": "2-5",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.data.status}",
"operator": "equals",
"output": "Rejected",
"output2": ""
}
]
}
},
{
"id": "edge-2-4-2-6",
"source": "2-4",
"target": "2-6",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-1-5-1-6",
"source": "1-5",
"target": "1-6",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-2-5-2-7",
"source": "2-5",
"target": "2-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
Two calls with the same shape: a cheap pre-check on a few identifying fields, then the full signup. Both return Accepted or Rejected in the body under HTTP 200.
The answer is always in data.status. The HTTP status code says nothing about the decision.
What will be needed from advertiser
| Key | Purpose |
|---|---|
endpoint | Base API URL. |
token | API token sent in the request body. |
username | Advertiser-provided value used as sourceDetail by the blueprint. |
partner_id | Partner code sent as code. |
Flows
Ping, POST /api/v1/leads/check. Name, national ID and address only. Returns data.status.
Post, POST /api/v1/leads/signup. Full payload. Returns data.status, plus refNo and url when accepted.
Calls
POST {endpoint}/api/v1/leads/check
POST {endpoint}/api/v1/leads/signup
Content-Type: application/json
format: application/json
Credentials travel in the body: code is the partner identifier and token the key. There is no auth header.
Request fields
Dotted paths for nesting.
Ping
| Field | Required | Value |
|---|---|---|
code | yes | {partner_id} |
token | yes | {token} |
sourceDetail | no | {send_id} |
personalInfo.firstName | yes | {g_name_first} |
personalInfo.lastName | yes | {g_name_last} |
personalInfo.birthNumber | yes | {g_id_national_number} |
residenceAddress.street | yes | {g_address_street} |
residenceAddress.houseNumber | yes | {g_address_street_number} |
residenceAddress.city | yes | {g_address_city} |
residenceAddress.zip | yes | {g_address_zip} |
residenceAddress.homeStatus | yes | {g_home_type}, see enums |
Post
Everything above, plus:
| Field | Required | Value |
|---|---|---|
personalInfo.email | yes | {g_email} |
personalInfo.cellPhone | yes | {g_phone} in +420XXXXXXXXX |
personalInfo.identityCardNumber | yes | {g_id_card_number} |
personalInfo.incomeType | yes | {g_fin_type}, see enums |
incomeData.monthlyIncome | yes | toInt({g_fin_income}) |
incomeData.monthlyExpenses | yes | toInt({g_fin_expenses}) |
employerData.employer | no | {g_employer_name} |
employerData.jobTitle | no | {g_employ_position} |
employerData.employedTime | no | {g_employ_time}, see enums |
employerData.employerPhone | no | {g_employer_phone} in +420XXXXXXXXX |
employerData.employerAddress.city | no | {g_employer_address} |
bankData.bankAccountNumber | yes | {g_bank_account_number} |
bankData.bankCode | yes | {g_bank_account_code} |
contactAddress.street | no | {g_address_contact_street} |
contactAddress.houseNumber | no | {g_address_contact_street_number} |
contactAddress.city | no | {g_address_contact_city} |
contactAddress.zip | no | {g_address_contact_zip} |
sameAddress | yes | inverse of {g_address_contact_status} |
requestedAmount | yes | toInt({g_amount}) |
period | yes | toInt({g_period}) |
product | yes | loan |
ipAddress | yes | {ip_address} |
Phone numbers must be in international form. personalInfo.Invalid phone number format and employerData.Invalid phone number format are the two most common 400s, and they account for most of them together. The advertiser wants +420 followed by nine digits.
sameAddress is inverted relative to a “contact address differs” checkbox, it is true when the addresses are the same.
Amounts, periods and employment length go as integers, so convert inline in the HTTP node with toInt(...) rather than adding a Modify step for it.
Enums
incomeType: EMPLOYED, SELF_EMPLOYED, MATERNITY_LEAVE, PENSION, UNEMPLOYED, OTHER.
homeStatus: HOME_OWNER, TENANT, DORMITORY, HOSTEL, MINISTRY, EMPLOYEE_BENEFIT, CO_OWNED.
employedTime is a number of buckets: 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
message is OK on every answer, accepted or not. It describes the call, not the decision, so nothing should branch on it. The decision is always data.status.
| Recognised by | HTTP | Meaning | Reject reason | Frequency |
|---|---|---|---|---|
data.status: Accepted | 200 | Approved | , | common |
data.status: Rejected | 200 | Refused, no reason given | Unspecified | common |
validationErrors ~ Invalid phone number format | 400 | Malformed phone | Invalid Data | occasional |
validationErrors ~ must be an email | 400 | Malformed e-mail | Invalid Data | rare |
data.status: Accepted, refNo and url null | 200 | Approved but no reference issued | , see below | rare |
| HTML error page | 500 | Advertiser-side failure | , (technical) | rare |
Two things in that table need care.
Accepted at the post arrives with and without refNo. Most acceptances carry a reference and a URL; a handful carry Accepted with both null. Those are not conversions there is nowhere to send the applicant and nothing to reconcile later, so the success condition needs url as well as the status.
Rejected at the post also arrives with a refNo and a url. The advertiser has created a record and still refused. Branch on data.status, never on the presence of the URL alone.
Rejected carries no reason at all. It is Unspecified, the largest bucket in the report and the thing to raise with the advertiser.
Reject reasons come from the standard list. See Reject reason for what each one means and when to use it.
Branching
Ping, approved:
{status} equals 200
{parsedBody.data.status} equals Accepted
Ping, refused:
{status} equals 200
{parsedBody.data.status} equals Rejected
Post, converted:
{status} equals 200
{parsedBody.data.status} equals Accepted
{parsedBody.data.url} is not empty
Post, refused, the catch-all, scoped to the business field:
{status} equals 200
{parsedBody.data.status} regex not match ^Accepted$
400 carries a documented validationErrors list naming the failed field, so it gets a branch. 500 returns an HTML page and gets none.
Stored values
| Parameter | Source |
|---|---|
{external_id} | {parsedBody.data.refNo} |
{redirect_url} | {parsedBody.data.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.
