Developer and plugin guide
The local API
The desktop app runs a REST API on 127.0.0.1 only. Copy the port and token from Settings → API, then send them with every request:
curl -H "Authorization: Bearer $BLEND_TOKEN" http://127.0.0.1:$PORT/profiles
The full list of endpoints is in the API reference. Interactive Swagger docs are served by the app at /docs.
Starting a profile and attaching a framework
POST /profiles/{id}/start returns a wsEndpoint. Connect Puppeteer (puppeteer.connect({ browserWSEndpoint })), Playwright (chromium.connectOverCDP) or Selenium (debuggerAddress). See examples.
Flows, tasks and schedules
Flows are JSON graphs of nodes (start, open, click, type, wait, scroll, extract, condition, loop, end). Create them with POST /flows and run them with POST /flows/{id}/run (or on a schedule via POST /tasks). Schedules use every 15m, daily 09:30, weekly mon 09:30 or once 2026-10-20T09:30.
Webhooks
Register a URL with POST /webhooks. Each delivery has the header blend-signature: t=<unix>,v1=<hex>, an HMAC-SHA256 of t.body with your webhook secret. Reject requests older than 5 minutes.
import { createHmac, timingSafeEqual } from 'node:crypto';
const [t, v1] = sig.split(',').map((p) => p.split('=')[1]);
const ok = timingSafeEqual(Buffer.from(v1, 'hex'), createHmac('sha256', secret).update(`${t}.${body}`).digest());
Plugins
Blend profiles load standard Chrome extensions (Manifest V3). Upload them with POST /extensions or in the app, then enable them per profile. A native plugin SDK is planned. Until then, the API and webhooks are the supported extension points.
Contributing
The code is a pnpm/turbo monorepo: apps/desktop (Electron), apps/local-service (API), apps/api (cloud), apps/web (this site), and packages/*. Run pnpm install && pnpm test.