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": -358.51408450704,
"y": 228.49295774648
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "ping",
"beType": "integration"
}
}
},
{
"id": "2-1",
"type": "startNode",
"position": {
"x": -481.5,
"y": -28.5
},
"data": {
"formData": {
"active": true,
"title": "",
"subtitle": "",
"flow": "post",
"beType": "integration"
}
}
},
{
"id": "1-2",
"type": "modifyFieldNode",
"position": {
"x": -192.5,
"y": 155.5
},
"data": {
"formData": {
"active": true,
"title": "Transform data",
"subtitle": "",
"data": [
{
"fieldName": "{data_nin}",
"fields": [
{
"source": "{data_nin}",
"operator": "always",
"value": "",
"value2": "",
"modification": "regex_replace",
"pattern": "(\\d{6})(\\d{3,4})",
"output": "$1/$2"
}
]
},
{
"fieldName": "{data_income_type}",
"fields": [
{
"source": "{data_income_type}",
"operator": "equals",
"value": "full-time",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "EMPLOYMENT"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "self-employed",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "SELF_EMPLOYMENT"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "parental",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "SOCIAL_OR_PARENTAL_SUPPORT"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "pension",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "PENSION"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "other",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "OTHER"
},
{
"source": "{data_income_type}",
"operator": "equals",
"value": "unemployed",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "OTHER"
}
]
}
]
}
}
},
{
"id": "1-3",
"type": "httpNode",
"position": {
"x": -59.5,
"y": 267.5
},
"data": {
"formData": {
"active": true,
"title": "Ping",
"subtitle": "",
"method": "POST",
"endpoint": "{endpoint}/api/public/partners/{partner_id}/requests",
"timeout": 30,
"format": null,
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "X-Api-Key",
"value": "{token}"
},
{
"key": "Content-Type",
"value": "application/json"
}
],
"query": [],
"body": [
{
"key": "email",
"value": "{data_email}"
},
{
"key": "last_name",
"value": "{data_last_name}"
},
{
"key": "first_name",
"value": "{data_first_name}"
},
{
"key": "national_id",
"value": "{data_nin}"
},
{
"key": "mobile_phone",
"value": "{data_cell_phone}"
},
{
"key": "income_source",
"value": "{data_income_type}"
},
{
"key": "living_expenses",
"value": "{data_expenses}"
},
{
"key": "net_monthly_income",
"value": "{data_monthly_income}"
},
{
"key": "requested_principal",
"value": "{data_requested_amount}"
},
{
"key": "expenses_on_existing_loans",
"value": "0"
}
],
"signature": null,
"insecure": null
}
}
},
{
"id": "1-4",
"type": "setNode",
"position": {
"x": 97.5,
"y": 131.8125
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{external_id}",
"value": "{parsedBody.request_uuid}"
}
]
}
}
},
{
"id": "1-7",
"type": "endNode",
"position": {
"x": 293.50431757158,
"y": 173.63153106718
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "2-4",
"type": "httpNode",
"position": {
"x": -244.38893078905,
"y": -287.39736298286
},
"data": {
"formData": {
"active": true,
"title": "Status",
"subtitle": "",
"method": "GET",
"endpoint": "{endpoint}/api/public/partners/{partner_id}/requests/{external_id}",
"timeout": 30,
"format": null,
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "X-Api-Key",
"value": "{token}"
},
{
"key": "Content-Type",
"value": "application/json"
}
],
"query": [],
"body": [
{
"key": "email",
"value": "{data_email}"
},
{
"key": "last_name",
"value": "{data_last_name}"
},
{
"key": "first_name",
"value": "{data_first_name}"
},
{
"key": "national_id",
"value": "{data_identity_card_number}"
},
{
"key": "mobile_phone",
"value": "{data_cell_phone}"
},
{
"key": "income_source",
"value": "{data_income_type}"
},
{
"key": "living_expenses",
"value": "{data_expenses}"
},
{
"key": "net_monthly_income",
"value": "{data_monthly_income}"
},
{
"key": "requested_principal",
"value": "{data_requested_amount}"
},
{
"key": "expenses_on_existing_loans",
"value": "0"
}
],
"signature": null,
"insecure": null
}
}
},
{
"id": "2-10",
"type": "setNode",
"position": {
"x": 302.53878619553,
"y": -133.90663788756
},
"data": {
"formData": {
"active": true,
"title": "Store response",
"subtitle": "",
"fields": [
{
"key": "{redirect_url}",
"value": "{parsedBody.redirect_url}"
}
]
}
}
},
{
"id": "2-2",
"type": "waitNode",
"position": {
"x": -280.83943177874,
"y": 25.651915559501
},
"data": {
"formData": {
"active": true,
"title": "Wait 3s",
"subtitle": "",
"type": "delay",
"delayValue": 3,
"delayUnit": "seconds",
"untilDate": null
}
}
},
{
"id": "2-5",
"type": "httpNode",
"position": {
"x": -77.788471532623,
"y": -139.3085673168
},
"data": {
"formData": {
"active": true,
"title": "Post",
"subtitle": "",
"method": "POST",
"endpoint": "{endpoint}/api/public/partners/{partner_id}/requests/{external_id}/accept",
"timeout": 40,
"format": "application/json",
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "X-Api-Key",
"value": "{token}"
},
{
"key": "Content-Type",
"value": "application/json"
}
],
"query": [],
"body": [],
"signature": null,
"insecure": null
}
}
},
{
"id": "2-9",
"type": "httpNode",
"position": {
"x": 139.80261398431,
"y": -31.44990073426
},
"data": {
"formData": {
"active": true,
"title": "Status after accept",
"subtitle": "",
"method": "GET",
"endpoint": "{endpoint}/api/public/partners/{partner_id}/requests/{external_id}",
"timeout": 30,
"format": null,
"parser": "json",
"notsend": null,
"convert_data": null,
"headers": [
{
"key": "X-Api-Key",
"value": "{token}"
},
{
"key": "Content-Type",
"value": "application/json"
}
],
"query": [],
"body": [
{
"key": "email",
"value": "{data_email}"
},
{
"key": "last_name",
"value": "{data_last_name}"
},
{
"key": "first_name",
"value": "{data_first_name}"
},
{
"key": "national_id",
"value": "{data_identity_card_number}"
},
{
"key": "mobile_phone",
"value": "{data_cell_phone}"
},
{
"key": "income_source",
"value": "{data_income_type}"
},
{
"key": "living_expenses",
"value": "{data_expenses}"
},
{
"key": "net_monthly_income",
"value": "{data_monthly_income}"
},
{
"key": "requested_principal",
"value": "{data_requested_amount}"
},
{
"key": "expenses_on_existing_loans",
"value": "0"
}
],
"signature": null,
"insecure": null
}
}
},
{
"id": "2-7",
"type": "waitNode",
"position": {
"x": 79.57147619086,
"y": -201.75762736685
},
"data": {
"formData": {
"active": true,
"title": "Wait 3s",
"subtitle": "",
"type": "delay",
"delayValue": 3,
"delayUnit": "seconds",
"untilDate": null
}
}
},
{
"id": "2-12",
"type": "endNode",
"position": {
"x": 513.8223081858,
"y": -153.93392562595
},
"data": {
"formData": {
"active": true,
"title": "Success",
"subtitle": "",
"success": "success"
}
}
},
{
"id": "1-5",
"type": "modifyFieldNode",
"position": {
"x": 91.082862387772,
"y": 276.93279633276
},
"data": {
"formData": {
"active": true,
"title": "Reject reason · Invalid field",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.field_errors.0.field_name}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Product Mismatch"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{parsedBody.field_errors.0.field_name}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{parsedBody.field_errors.0.field_name}: {parsedBody.field_errors.0.error_message}"
}
]
}
]
}
}
},
{
"id": "2-6",
"type": "modifyFieldNode",
"position": {
"x": -69.819893455799,
"y": -298.07445834702
},
"data": {
"formData": {
"active": true,
"title": "Reject reason · Status",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.status}",
"operator": "equals",
"value": "INVALID",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Not Eligible"
},
{
"source": "{parsedBody.status}",
"operator": "equals",
"value": "FAILED",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Unspecified"
},
{
"source": "{parsedBody.status}",
"operator": "equals",
"value": "CANCELLED",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Cancelled by Advertiser"
},
{
"source": "{parsedBody.status}",
"operator": "equals",
"value": "EXPIRED",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Expired"
},
{
"source": "{parsedBody.errors.0.error_code}",
"operator": "equals",
"value": "OPEN_LOAN_APPLICATION",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Existing Customer"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{parsedBody.status}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{parsedBody.status}"
}
]
}
]
}
}
},
{
"id": "2-3",
"type": "breakerNode",
"position": {
"x": -400.09804338708,
"y": -249.6716260295
},
"data": {
"formData": {
"active": true,
"title": "Breaker 4x",
"subtitle": "",
"maxRepetition": "4"
}
}
},
{
"id": "1-8",
"type": "endNode",
"position": {
"x": 270.14518454561,
"y": 292.76661025696
},
"data": {
"formData": {
"active": true,
"title": "Rejected",
"subtitle": "",
"success": "failed"
}
}
},
{
"id": "2-8",
"type": "endNode",
"position": {
"x": 189.97184058348,
"y": -308.75155371118
},
"data": {
"formData": {
"active": true,
"title": "Rejected · Status",
"subtitle": "",
"success": "failed"
}
}
},
{
"id": "2-11",
"type": "modifyFieldNode",
"position": {
"x": 300.31941250167,
"y": 23.662015292937
},
"data": {
"formData": {
"active": true,
"title": "Reject reason · Status after accept",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.status}",
"operator": "equals",
"value": "INVALID",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Not Eligible"
},
{
"source": "{parsedBody.status}",
"operator": "equals",
"value": "FAILED",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Unspecified"
},
{
"source": "{parsedBody.status}",
"operator": "equals",
"value": "CANCELLED",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Cancelled by Advertiser"
},
{
"source": "{parsedBody.status}",
"operator": "equals",
"value": "EXPIRED",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Expired"
},
{
"source": "{parsedBody.errors.0.error_code}",
"operator": "equals",
"value": "OPEN_LOAN_APPLICATION",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Existing Customer"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{parsedBody.status}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{parsedBody.status}"
}
]
}
]
}
}
},
{
"id": "2-13",
"type": "endNode",
"position": {
"x": 497.03336978445,
"y": 49.052374722548
},
"data": {
"formData": {
"active": true,
"title": "Rejected · Status after accept",
"subtitle": "",
"success": "failed"
}
}
},
{
"id": "1-6",
"type": "modifyFieldNode",
"position": {
"x": 63.881191692614,
"y": 406.18286898936
},
"data": {
"formData": {
"active": true,
"title": "Reject reason · Business error",
"subtitle": "",
"data": [
{
"fieldName": "{reason}",
"fields": [
{
"source": "{parsedBody.errors.0.error_code}",
"operator": "equals",
"value": "OPEN_LOAN_APPLICATION",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "Existing Customer"
}
]
},
{
"fieldName": "{reason_detail}",
"fields": [
{
"source": "{parsedBody.errors.0.error_code}",
"operator": "is_not_empty",
"value": "",
"value2": "",
"modification": "replace",
"pattern": "",
"output": "{parsedBody.errors.0.error_message}"
}
]
}
]
}
}
}
],
"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": "200",
"output2": ""
},
{
"value": "{parsedBody.errors.0.error_code}",
"operator": "is_empty",
"output": "",
"output2": ""
},
{
"value": "{parsedBody.field_errors.0.field_name}",
"operator": "is_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-3-1-5",
"source": "1-3",
"target": "1-5",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.field_errors.0.field_name}",
"operator": "is_not_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-3-1-6",
"source": "1-3",
"target": "1-6",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.errors.0.error_code}",
"operator": "is_not_empty",
"output": "",
"output2": ""
}
]
}
},
{
"id": "edge-1-4-1-7",
"source": "1-4",
"target": "1-7",
"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": []
}
},
{
"id": "edge-2-4-2-2",
"source": "2-4",
"target": "2-2",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.status}",
"operator": "equals",
"output": "NEW",
"output2": ""
}
]
}
},
{
"id": "edge-2-4-2-5",
"source": "2-4",
"target": "2-5",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.status}",
"operator": "equals",
"output": "LOAN_OFFER_GENERATED",
"output2": ""
}
]
}
},
{
"id": "edge-2-4-2-6",
"source": "2-4",
"target": "2-6",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{2-4.parsedBody.status}",
"operator": "regex_match",
"output": "INVALID|CANCELLED|FAILED|EXPIRED",
"output2": ""
}
]
}
},
{
"id": "edge-2-9-2-10",
"source": "2-9",
"target": "2-10",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{parsedBody.status}",
"operator": "regex_match",
"output": "ACCEPTED|COMPLETED|LOAN_ISSUED",
"output2": ""
}
]
}
},
{
"id": "edge-2-10-2-12",
"source": "2-10",
"target": "2-12",
"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-5-2-7",
"source": "2-5",
"target": "2-7",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-2-7-2-9",
"source": "2-7",
"target": "2-9",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-2-9-2-11",
"source": "2-9",
"target": "2-11",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": [
{
"value": "{2-9.parsedBody.status}",
"operator": "regex_match",
"output": "INVALID|CANCELLED|FAILED|EXPIRED",
"output2": ""
}
]
}
},
{
"id": "edge-1-5-1-8",
"source": "1-5",
"target": "1-8",
"type": "customEdge",
"data": {
"active": true,
"title": "",
"subtitle": "",
"conditions": []
}
},
{
"id": "edge-2-6-2-8",
"source": "2-6",
"target": "2-8",
"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-2-11-2-13",
"source": "2-11",
"target": "2-13",
"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
An asynchronous, state-machine API. The application request returns immediately with status: NEW; the offer is generated a few seconds later. Nothing is decided in the first response, so the integration has to poll.
Two things shape every decision here: HTTP 200 does not mean accepted, and an application left open blocks the next lead from the same person.
What will be needed from advertiser
| Key | Purpose |
|---|---|
endpoint | Base API URL. |
token | API key sent in X-Api-Key. |
partner_id | Partner ID used in the request path. |
Flows
Ping, POST /requests. Submits the application. Returns request_uuid and status: NEW, or a rejection in the body under 200.
Post, polls GET /requests/{request_uuid} until the status is terminal, then POST /requests/{request_uuid}/accept, then polls again.
The request_uuid from the ping is what the post addresses, so the ping must store it in {external_id} before anything else.
The state machine
NEW → LOAN_OFFER_GENERATED → ACCEPTED → COMPLETED → LOAN_ISSUED
| Status | Meaning | Terminal |
|---|---|---|
NEW | Submitted, offer not yet generated | no, keep polling |
LOAN_OFFER_GENERATED | Offer ready, accept or cancel it | no, accept |
ACCEPTED | The client accepted the offer | yes, success |
COMPLETED | Processing has started | yes, success |
LOAN_ISSUED | Loan paid out | yes, success |
INVALID | Failed validation | yes, rejection |
CANCELLED | Failed rule checks, or the client declined | yes, rejection |
FAILED | Processing ended in an error | yes, rejection |
EXPIRED | Did not finish in time | yes, rejection |
Every one of these needs a branch, including the terminal ones you do not expect to see. A status missing from the loop conditions is a Dead End waiting to happen, and this API has nine of them.
Cancel the offers you do not take
POST /requests/{request_uuid}/cancel closes an offer that will not be accepted.
If it is never called, ViaSMS keeps the application open. The next lead from the same person then comes back with error_code: OPEN_LOAN_APPLICATION, a rejection the integration caused itself. An integration that polls, gives up on the Breaker and walks away without cancelling manufactures its own duplicates.
Calls
POST {endpoint}/api/public/partners/{partner_id}/requests
GET {endpoint}/api/public/partners/{partner_id}/requests/{external_id}
POST {endpoint}/api/public/partners/{partner_id}/requests/{external_id}/accept
POST {endpoint}/api/public/partners/{partner_id}/requests/{external_id}/cancel
X-Api-Key: {token}
Content-Type: application/json
format: application/json
Set format: application/json on every node that sends a JSON body. It is not inherited from another node, and a request without it is refused with 400.
The GET calls take no body. Guard them: when {external_id} is empty the URL collapses to a trailing slash and the advertiser answers 404, which reads as a broken endpoint rather than as a missing identifier.
The advertiser restricts access by IP address, so the addresses the calls originate from have to be registered with them before anything works.
Request fields
| Field | Required | Value |
|---|---|---|
first_name | yes | {g_name_first} |
last_name | yes | {g_name_last} |
national_id | yes | {g_id_national_number} with the slash |
email | yes | {g_email} |
mobile_phone | yes | {g_phone} |
income_source | yes | {g_fin_type}, see enums |
net_monthly_income | yes | {g_fin_income} |
living_expenses | yes | {g_fin_expenses} |
expenses_on_existing_loans | yes | {g_fin_expenses_credit} |
requested_principal | yes | {g_amount} |
national_id goes in the Czech written form with the slash:
{g_id_national_number} always regex_replace (\d{6})(\d{3,4}) → $1/$2
expenses_on_existing_loans is required. Send 0 rather than leaving it empty, an empty required field is refused.
Enums
income_source: EMPLOYMENT, SELF_EMPLOYMENT, SOCIAL_OR_PARENTAL_SUPPORT, PENSION, OTHER. Unemployed has no option; map it to OTHER.
Outcomes
errors and field_errors are present on every response and empty on success, which is what makes them usable as conditions. But only with an index. {parsedBody.errors.0.error_code} resolves; {parsedBody.errors.error_code} comes back as literal text, and literal text is never empty, so an “is not empty” test on it fires on every single response. A flow built that way labels every lead with the same rejection and never reaches its own success branch.
| Recognised by | HTTP | Meaning | Reject reason | Frequency |
|---|---|---|---|---|
status: NEW, no errors | 200 | Submitted, poll for the offer | , | common |
status: LOAN_OFFER_GENERATED | 200 | Offer ready, accept it | , | common |
status ~ `ACCEPTED | COMPLETED | LOAN_ISSUED` | 200 | Converted |
errors.0.error_code: OPEN_LOAN_APPLICATION | 200 | An application is already open | Existing Customer | common |
field_errors.0.field_name present | 200 | A field failed validation | Product Mismatch | occasional |
status: INVALID | 200 | Failed validation | Not Eligible | occasional |
status: CANCELLED | 200 | Failed rule checks or client declined | Cancelled by Advertiser | occasional |
status: FAILED | 200 | Processing error | Unspecified | rare |
status: EXPIRED | 200 | Not finished in time | Expired | rare |
| Cloudflare error page | 530 | Advertiser unreachable | , (technical) | rare |
field_errors names the field, so {reason_detail} should carry both parts: {parsedBody.field_errors.0.field_name}: {parsedBody.field_errors.0.error_message}.
OPEN_LOAN_APPLICATION is worth watching rather than accepting. Some of it is genuine repeat traffic; some of it is applications this integration opened and never cancelled.
Reject reasons come from the standard list. See Reject reason for what each one means and when to use it.
Branching
Ping, submitted, both error arrays checked, with the index:
{status} equals 200
{parsedBody.errors.0.error_code} is empty
{parsedBody.field_errors.0.field_name} is empty
Ping, field validation failed:
{parsedBody.field_errors.0.field_name} is not empty
Ping, business error:
{parsedBody.errors.0.error_code} is not empty
Status poll, keep waiting:
{parsedBody.status} equals NEW
Status poll, accept the offer:
{parsedBody.status} equals LOAN_OFFER_GENERATED
Status poll, converted:
{parsedBody.status} regex match ACCEPTED|COMPLETED|LOAN_ISSUED
Status poll, refused:
{parsedBody.status} regex match INVALID|CANCELLED|FAILED|EXPIRED
The polling loop needs a Breaker with its count in the title. Watch the synchronous limit while setting it, the applicant is on a loading screen for the whole loop.
Stored values
| Parameter | Source |
|---|---|
{external_id} | {parsedBody.request_uuid} from the ping |
{redirect_url} | {parsedBody.redirect_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.
