Recipes
Werkende voorbeelden van veelvoorkomende workflows met de Corlega API.
Eindwerkende code-voorbeelden voor de meest gevraagde integraties. Kopieer-plak vriendelijk.
1. Intake-formulier op je eigen website → Corlega-agent
Doel: een formulier op je site stuurt een aanvraag naar Corlega, de Offerte-agent maakt een concept-offerte, jij ontvangt een webhook met de output.
Setup:
- Maak een API-key met scope
requests.write+webhooks.write - Maak een webhook-subscription voor
quote.created - Bouw je formulier-handler
Form-handler (Next.js Route):
// app/api/intake/route.ts
import { NextResponse } from "next/server";
export async function POST(req: Request) {
const form = await req.json();
const res = await fetch("https://api.corlega.com/v1/requests", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CORLEGA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
fromEmail: form.email,
fromName: form.name,
subject: form.subject,
bodyText: form.message,
externalRef: `web-form-${form.formId}`,
processImmediately: true,
}),
});
if (!res.ok) {
const err = await res.json();
return NextResponse.json(err, { status: res.status });
}
const { data } = await res.json();
return NextResponse.json({ requestId: data.id });
}Webhook-handler:
// app/api/webhooks/corlega/route.ts
import crypto from "node:crypto";
import { NextResponse } from "next/server";
export const runtime = "nodejs";
function verify(body: string, sig: string | null) {
if (!sig) return false;
const expected = crypto
.createHmac("sha256", process.env.CORLEGA_WEBHOOK_SECRET!)
.update(body)
.digest("hex");
const received = sig.replace(/^sha256=/, "");
return crypto.timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(received, "hex"),
);
}
export async function POST(req: Request) {
const body = await req.text();
const sig = req.headers.get("x-corlega-signature");
if (!verify(body, sig)) {
return new NextResponse("Invalid signature", { status: 401 });
}
const event = JSON.parse(body);
if (event.event === "quote.created") {
// Update je eigen CRM
console.log("Nieuw concept-offerte van Corlega:", event.data);
}
return NextResponse.json({ ok: true });
}2. Externe webshop → automatisch B2B-factuur
Doel: Bij een nieuwe Shopify B2B-order maak je automatisch een factuur in Corlega.
async function createInvoiceFromShopifyOrder(order: ShopifyOrder) {
// 1. Vind of maak een contact
let contact;
const search = await fetch(
`https://api.corlega.com/v1/contacts?page=1`,
{ headers: { Authorization: `Bearer ${process.env.CORLEGA_API_KEY}` } },
);
// …of haal het op via een externalRef die je in eerdere call hebt geset
if (!contact) {
const created = await fetch("https://api.corlega.com/v1/contacts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CORLEGA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
name: order.customer.companyName ?? order.customer.name,
email: order.customer.email,
kvkNumber: order.customer.kvkNumber,
vatNumber: order.customer.vatNumber,
billingAddressLine1: order.billingAddress.line1,
billingPostalCode: order.billingAddress.zip,
billingCity: order.billingAddress.city,
}),
});
contact = (await created.json()).data;
}
// 2. Maak een factuur
const items = order.lineItems.map((li) => ({
name: li.title,
quantity: li.quantity,
unitPrice: Number(li.price),
vatPercentage: 21,
}));
const res = await fetch("https://api.corlega.com/v1/invoices", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CORLEGA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
contactId: contact.id,
items,
currency: order.currency,
}),
});
return (await res.json()).data;
}3. Bulk-export van alle quotes naar je BI-tool
async function* allQuotes() {
let page = 1;
while (true) {
const res = await fetch(
`https://api.corlega.com/v1/quotes?page=${page}&pageSize=100`,
{ headers: { Authorization: `Bearer ${process.env.CORLEGA_API_KEY}` } },
);
const { data, meta } = await res.json();
for (const q of data) yield q;
if (!meta.hasMore) break;
page++;
}
}
const rows = [];
for await (const q of allQuotes()) {
rows.push({
id: q.id,
number: q.number,
status: q.status,
total: q.total,
createdAt: q.createdAt,
});
}
console.log(`Geëxporteerd: ${rows.length} quotes`);4. Agent op autopilot zetten. alleen voor service-offertes onder €500
curl -X PATCH https://api.corlega.com/v1/agents/{agentId}/autonomy \
-H "Authorization: Bearer corlega_..." \
-H "Content-Type: application/json" \
-d '{
"defaultMode": "manual",
"actionOverrides": {
"send_quote_under_500": { "mode": "auto_instant" }
}
}'5. n8n / Zapier. Corlega als trigger en action
n8n heeft een generieke HTTP Request node. Triggers ontvang je via webhooks.
n8n workflow:
- Webhook-node (Trigger). luistert op een URL die je in Corlega als webhook-endpoint registreert
- HTTP Request-node. actie op
https://api.corlega.com/v1/...
Voor Zapier-vergelijkbare flows: hetzelfde patroon met een Catch Hook + Custom Request.
6. Eigen CRM bidirectional syncen
Loop elke nacht:
import { allQuotes } from "./helpers"; // van recipe 3
const since = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
for await (const quote of allQuotes()) {
if (quote.updatedAt < since) continue;
await myCrm.upsertOpportunity({
externalId: quote.id,
title: `${quote.number}. €${quote.total}`,
status: mapStatus(quote.status),
customerId: quote.contactId,
});
}Andersom: gebruik webhooks (quote.created, quote.approved, invoice.paid) voor realtime updates.
7. Smoke-test je API-key
Snelle one-liner om te verifiëren dat je key werkt + welke scopes hij heeft:
curl -s https://api.corlega.com/v1/me \
-H "Authorization: Bearer $CORLEGA_API_KEY" | jqOutput:
{
"data": {
"apiKeyId": "01HE...",
"organizationId": "01HD...",
"scopes": ["contacts.*", "quotes.read"],
"prefix": "corlega_abc12345…"
}
}Volgende stap
- Volledig overzicht: API reference
- Webhooks. payload-shape per event-type
- Iets mist? Mail hello@corlega.com.