For the web developer of an ADM-Concept client. Today your contact form sends an e-mail; with this integration the same data arrives directly as a lead in the application your client uses. No knowledge of ADM One is required — one address and one key are enough.
Your contact form sends an e-mail today. Post the same data to this address as well, and it appears directly in your client's application.
One API key, provided by ADM-Concept. That key belongs to one website of one client.
⚠️ The key belongs on your server, not in the page. Send the request from your backend — where you already send the e-mail. Never put it in JavaScript, in the HTML, or in a public repository: anyone who reads it can write leads into your client's application.
POST https://platform.digitalcloud.be/api/v1/leads
X-Api-Key: <the key you received>
Content-Type: application/json
{
"name": "Jan Peeters", // recommended
"email": "jan@peeters.be", // recommended — used for deduplication
"phone": "+32 475 12 34 56",
"company": "Peeters Roofing",
"message": "I would like a quote for a flat roof of 80 m².",
"subject": "Quote request",
"externalRef": "form-2026-08-11-00427", // your own reference — see below
"pageUrl": "https://bavo-saunabouw.be/contact",
"locale": "en",
"botcheck": "", // honeypot: leave empty (see below)
"fields": { // every other field of your form, free to choose
"square metres": "80",
"preferred start date": "September",
"how did you find us": "Google"
}
}
No field is required, as long as there is something usable: at least one of email, phone or message.
A completely empty submission is rejected.
Do not reshape your form to fit this schema. You have fields that do not appear here — just put them in
fields. That map is passed through unchanged all the way into the application. You do not have to drop or
rename anything.
externalRef — please send oneYour own reference for this submission: a sequence number, a uuid, whatever you like, as long as it is
unique per submission. If you send the same externalRef twice (a retry after a timeout, a visitor
double-clicking), you get the same response back and no second lead is created. Without an externalRef we
derive one from the content, but that is less reliable.
You do not need to send a source — and you cannot. Every submission automatically carries the name of your key as its source: if your key is called "contact form main site", your client sees that on every lead coming through it.
Why this way? Otherwise that field would be filled in by whoever posts, and the question "which channel brings in customers" could no longer be answered reliably. One form sending the wrong value by mistake, and the whole reporting is off.
Have several forms? Then ask for one key per form — main site, campaign page, quote request. That is exactly what this is for, and it costs nothing extra. Your client then sees where each lead came from, and revoking one key affects only that form.
If you do send a source field, it simply ends up in fields — it does not override the source.
| Code | Meaning | What to do |
|---|---|---|
202 |
Accepted | Show your visitor the usual thank-you message |
400 |
Content unusable (all empty, or invalid JSON) | Check it; retrying will not help |
401 |
Key missing or incorrect | Check the X-Api-Key header |
413 |
Too large (over 64 KB) | Shorten the message; attachments are not supported |
429 |
Too many requests | Wait and retry (see Retry-After) |
5xx |
Something wrong on our side | Retrying later is fine |
// 202
{ "accepted": true, "id": "9f1c…" }
Certainly for the first few months. If our service is briefly unavailable or the key is wrong, that submission is otherwise simply gone — and nobody notices, because a lead that does not exist never asks why. Let your form send the e-mail as it does today, and treat this call as an addition. Once it has run smoothly for months, your client can decide to drop the e-mail.
Also, never let this call block your thank-you page: if it fails, just show your normal confirmation. The visitor cannot do anything about it.
Add a field to your form that a human never fills in (hidden with CSS, not with type="hidden") and send its
content as botcheck. If it contains anything, it is a bot: we then simply answer 202 but create no lead. A
bot should not learn that it has been caught.
$payload = [
'name' => $_POST['name'] ?? '',
'email' => $_POST['email'] ?? '',
'phone' => $_POST['tel'] ?? '',
'message' => $_POST['message'] ?? '',
'botcheck' => $_POST['website'] ?? '', // the hidden field
'externalRef' => bin2hex(random_bytes(12)),
'pageUrl' => 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],
'fields' => ['preferred start date' => $_POST['startdate'] ?? ''],
];
$ch = curl_init('https://platform.digitalcloud.be/api/v1/leads');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'X-Api-Key: ' . LEADS_API_KEY],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5, // short: the visitor must not wait for this
]);
curl_exec($ch); // may fail — the e-mail below still goes out
curl_close($ch);
mail($recipient, $subject, $text); // keep doing this for now
curl -i -X POST https://platform.digitalcloud.be/api/v1/leads \
-H "X-Api-Key: <key>" -H "Content-Type: application/json" \
-d '{"name":"Test","email":"test@example.be","message":"Test from the website","externalRef":"test-1"}'
Expect 202. Send the same externalRef again: 202 once more, and the application still holds only one lead.
What you send is personal data of a visitor. Send only what was in the form — no IP addresses, no cookie IDs, no tracking data. ADM One stores the submission temporarily: as soon as your client's application has fetched it, it is deleted on our side — confirmed submissions are erased after 30 days. A submission the application never fetches does stay; it does not belong to anyone yet. Mention the form in the website's privacy statement.
Contact ADM-Concept at support@adm-concept.be. Mention which client and which website it concerns; the key is tied to that one website.
This page describes the integration as it is live today. No copy of this document will be circulated that could go stale — bookmark the link instead of copying the text.
ADM-Concept · support@adm-concept.be