NLFREN

← All documentation

Connect a contact form to your client's application

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.

What you need

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.

The call

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 one

Your 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.

We set the source of your submission

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.

The response

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…" }

⚠️ Keep sending your e-mail

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.

The honeypot field

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.

Example (PHP)

$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

Testing

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.

Privacy

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.


Questions?

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

One moment — reconnecting to the server.

Still no connection. Next attempt in seconds.

This happens during an application update or a temporary connection problem. As soon as the server is back, your screen continues on its own.

The connection could not be restored. Try again or reload the page.

This session has been paused.

The session could not be resumed. Try again or reload the page.