Getting started
Quickstart
Quickstart
Create your first scheduled webhook in under 5 minutes.
Underlayer is a webhook scheduler. Define tasks or cron jobs that point to any HTTP endpoint, and Underlayer takes care of delivery, retries, and observability. No infrastructure required.
1. Create a workspace
A workspace is your isolated environment. All tasks, cron jobs, API keys, and activity logs belong to a workspace. Create one from the dashboard after signing up.
2. Get an API key
Go to Settings → API Keys and create a key. This is the credential you will use in every API call. Keep it secret: it has full access to your workspace.
3. Use the TypeScript SDK (recommended)
Underlayer provides an official TypeScript SDK that is production-ready and fully typed. It covers tasks, cron jobs, runs, workspaces, and organizations.
npm install @underlayer-app/sdk
import { Underlayer } from "@underlayer-app/sdk"
const client = new Underlayer({ apiKey: "ul_live_xxx" })
const task = await client.tasks.create({
name: "send-welcome-email",
targetUrl: "https://api.example.com/webhooks/email",
executeAt: "2026-07-01T10:00:00Z",
method: "post",
payload: JSON.stringify({ userId: "u_123" }),
})
console.log(task.id)4. Schedule a one-off task
Send a POST /api/v1/scheduler/tasks with a target URL and a future execute_at timestamp. The field is required and must point to a future time.
curl -X POST https://api.underlayer.dev/api/v1/scheduler/tasks \
-H "X-Api-Key: ul_live_xxxx" \
-H "Content-Type: application/json" \
-d '{
"name": "send-welcome-email",
"url": "https://my-service.com/hooks/welcome",
"method": "POST",
"payload": { "user_id": 42 },
"execute_at": "2025-09-01T10:00:00Z"
}'5. Schedule a recurring cron job
Cron jobs run on a fixed schedule expressed as a standard 5-field cron expression. They keep dispatching until paused or deleted.
curl -X POST https://api.underlayer.dev/api/v1/scheduler/cronjobs \
-H "X-Api-Key: ul_live_xxxx" \
-H "Content-Type: application/json" \
-d '{
"name": "daily-report",
"url": "https://my-service.com/hooks/daily-report",
"method": "POST",
"cron": "0 8 * * *",
"timezone": "Europe/Madrid"
}'6. Check the activity log
Every dispatch attempt appears in Activity in the dashboard. You can filter by status, workspace, and date range, and drill into the full request/response for any run.
X-Api-Key: <key>.