Developer API · Intakes
Intakes op je eigen site
Leads plannen zelf een intake bij je gym en bevestigen die per mail. Zet het formulier op je site als widget of iframe, of bouw een eigen formulier op de intake-API.
Laatst bijgewerkt op 13 oktober 2026
Overzicht
De gym zet online plannen aan bij Instellingen → Intakes → Op je website. Daar staan ook de publieke code (zoals jouw-gym-a3f9c1), de code voor de widget en het iframe, en de API-sleutels.
Hoe een lead ook plant: de tijd wordt 30 minuten vastgehouden en de lead krijgt een mail om te bevestigen. Pas dan staat de intake vast, verschijnt de lead bij Leads en krijgt het staflid een agenda-uitnodiging.
- Publieke pagina: https://app.rxapp.io/intake/{code} (een link of QR-code)
- Widget: een formulier in je eigen pagina dat het lettertype van je site overneemt
- Iframe: de publieke pagina in je site, die zijn hoogte aanpast
- API: je eigen formulier, vanaf je eigen server, met een API-sleutel
Widget
Zet dit op de plek waar het formulier moet komen. De huisstijl van de gym (kleur, hoeken, achtergrond) komt vanzelf mee.
<div data-rxapp-intake="jouw-gym-a3f9c1"></div>
<script src="https://app.rxapp.io/intake/v1.js" async></script>Wijk per pagina af met deze attributen op de div:
| Attribuut | Betekenis |
|---|---|
data-mode | popup: een knop die het formulier als pop-up opent. Standaard: in de pagina. |
data-color | Accentkleur als #rrggbb. De tekst erop wordt vanzelf zwart of wit. |
data-radius | square, rounded of pill. |
data-fields | outlined of filled. |
data-background | light, dark of transparent. |
data-font | site (het lettertype van je site, standaard) of system. |
data-button-text | Tekst op de knop, hoogstens 40 tekens. |
data-language | nl of en. Standaard: de taal van de gym. |
Als knop met een pop-up:
<div data-rxapp-intake="jouw-gym-a3f9c1" data-mode="popup" data-button-text="Plan je intake"></div>
<script src="https://app.rxapp.io/intake/v1.js" async></script>De div stuurt events: rxapp:intake-requested als een lead een intake aanvraagt, rxapp:intake-error als er iets misgaat. Bijvoorbeeld voor je eigen statistieken:
document.addEventListener("rxapp:intake-requested", (event) => {
// event.detail.starts_at: the chosen time (UTC ISO)
window.dataLayer?.push({ event: "intake_requested", starts_at: event.detail.starts_at });
});Iframe
De publieke pagina in je site. Het script hieronder zet de hoogte van het iframe op de hoogte van het formulier.
<iframe src="https://app.rxapp.io/intake/jouw-gym-a3f9c1?embed=1" title="Plan your intake"
style="width:100%;border:0;min-height:560px" loading="lazy"></iframe>
<script>
window.addEventListener("message", function (event) {
if (event.origin !== "https://app.rxapp.io" || !event.data || event.data.type !== "rxapp:intake-height") return;
document.querySelectorAll('iframe[src^="https://app.rxapp.io/intake/jouw-gym-a3f9c1"]').forEach(function (frame) {
frame.style.height = event.data.height + "px";
});
});
</script>API
Voor een eigen formulier. De API-sleutel bepaalt de gym; je stuurt nooit een gym-ID mee. Base-URL: https://api.rxapp.io/api/v1/intake-api.
De gym maakt sleutels aan bij Instellingen → Intakes → API. Een sleutel wordt één keer getoond. Stuur hem als Bearer-token vanaf je server.
Authorization: Bearer rxk_...| Methode | Pad | Doel |
|---|---|---|
GET | /api/v1/intake-api | De gym: naam, adres, tijdzone, huisstijl, privacybeleid, duur en of online plannen beschikbaar is. |
GET | /api/v1/intake-api/slots?from&to | Vrije begintijden per datum (UTC), zoals leads ze zien. Hoogstens 31 dagen. |
POST | /api/v1/intake-api/requests | Een intake aanvragen voor een lead. 202: de tijd wordt vastgehouden en de lead krijgt een mail om te bevestigen. |
GET | /api/v1/intake-api/requests/{id} | De status van een aanvraag: requested, confirmed, expired of cancelled. |
Vrije tijden voor een week:
curl "https://api.rxapp.io/api/v1/intake-api/slots?from=2026-10-20&to=2026-10-26" \
-H "Authorization: Bearer $RXAPP_INTAKE_API_KEY"{
"items": [
{ "date": "2026-10-20", "slots": ["2026-10-20T07:00:00.000Z", "2026-10-20T07:30:00.000Z"] },
{ "date": "2026-10-21", "slots": [] }
]
}Een intake aanvragen (Node.js):
const response = await fetch("https://api.rxapp.io/api/v1/intake-api/requests", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RXAPP_INTAKE_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
starts_at: "2026-10-20T07:00:00.000Z",
name: "Sanne Smit",
email: "sanne@example.com",
phone: "06 1234 5678",
consent: true, // the lead agreed to the gym's privacy policy
language: "nl",
utm: { source: "website" },
}),
});
// 202 { "id": "…", "status": "requested", "expires_at": "…" }Velden van een aanvraag:
| Veld | Betekenis |
|---|---|
starts_at | Een van de vrije tijden, precies zoals de slots die teruggeven. |
name | De naam van de lead. |
email | Waar de bevestigingsmail heen gaat. |
phone | Verplicht; de gym kan de lead bellen. |
consent | true: de lead ging akkoord met het privacybeleid van de gym (toon de link in je formulier). |
language | Optioneel: nl of en voor de mails. |
utm | Optioneel: source, medium, campaign, term, content. |
Een aanvraag controleren:
curl "https://api.rxapp.io/api/v1/intake-api/requests/0d4e690e-284b-4ca2-82bc-b75e7501778c" \
-H "Authorization: Bearer $RXAPP_INTAKE_API_KEY"Van aanvraag tot intake
- Haal de vrije tijden op (slots). De regels van de gym gelden: minimale aanlooptijd, hoe ver vooruit, afwezigheid van staf.
- Stuur een aanvraag met een tijd en de gegevens van de lead. De tijd wordt 30 minuten vastgehouden.
- De lead krijgt een mail op naam van de gym met een knop om te bevestigen.
- Na bevestigen staat de intake vast: de lead verschijnt bij Leads (of de bestaande lead met dat e-mailadres wordt gebruikt), de lead en het staflid krijgen een agenda-uitnodiging, en de herinneringen worden ingepland.
- Niet binnen 30 minuten bevestigd? Dan vervalt de aanvraag en is de tijd weer vrij.
Fouten en limieten
Fouten zijn JSON met een message en, waar nuttig, een code.
| Status | Wat te doen |
|---|---|
400 | Controleer de velden (de message zegt welk), bijvoorbeeld een ongeldig e-mailadres of telefoonnummer. |
401 | INTAKE_API_KEY_INVALID: de sleutel ontbreekt, klopt niet of is ingetrokken. |
403 | INTAKE_ORIGIN_NOT_ALLOWED: deze site staat niet bij de toegestane domeinen van de gym (widget). |
404 | Onbekende code van de gym of onbekende aanvraag. |
409 | INTAKE_SLOT_UNAVAILABLE (tijd net vergeven: haal de tijden opnieuw op), INTAKE_REQUEST_LIMIT, INTAKE_ONLINE_DISABLED of INTAKE_CHANNEL_DISABLED. |
429 | Te veel aanvragen; wacht even en probeer het opnieuw. |
Limieten: de widget en de pagina staan 10 aanvragen per 15 minuten per IP-adres toe, hoogstens 3 aanvragen per e-mailadres per dag en 100 per gym per uur. De API staat 600 aanroepen per 15 minuten per sleutel toe.
Beveiliging
- Zet een API-sleutel nooit in een website, app of broncode; alleen op je server. Trek een sleutel meteen in als hij uitlekt.
- De widget en het iframe hebben geen sleutel nodig: de publieke code herkent de gym, en de toegestane domeinen bepalen waar ze mogen draaien.
- De toegestane domeinen voorkomen dat een ander het formulier van de gym op zijn site zet. Ze houden geen spam tegen; de bevestiging per mail doet dat.
- Een verborgen veld en een minimale invultijd vangen eenvoudige bots; zulke aanvragen krijgen hetzelfde antwoord, maar er gebeurt niets.