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.

All API calls must include X-Api-Key: <key>.