The boring infrastructure your app needs, behind one API key.
Scheduled jobs, a webhook relay, PDFs, and transactional email for apps built with Claude Code, Cursor, and other coding agents. An SDK, an MCP server, and plain-text docs mean your agent can wire it all up for you.
npm install oakstack
const oakstack = new Oakstack(); // reads OAKSTACK_API_KEY
await oakstack.clock.jobs.create({ name: "Nightly", schedule: "0 3 * * *", url: "https://..." });
await oakstack.post.emails.send({
from: "Acme <hello@acme.com>",
to: customer.email,
subject: "Your invoice",
html: "<p>Thanks for your order.</p>",
attachments: [{ filename: "invoice.pdf", print: { template: "invoice", data } }],
});The Free plan needs no card.
Scheduled jobs
Call a URL in your app on a cron schedule, in any time zone. Failed calls are retried, every run is logged, and a job that keeps failing pauses itself.
oakstack.clockWebhook relay
A permanent inbound URL for Stripe, GitHub, or any sender. Every event is stored, forwarded with its original headers, retried for hours if your app is down, and can be replayed.
oakstack.hookPDFs
Send HTML, or pick a hosted invoice, proposal, or report template and send data. Real Chrome renders it; you get a private download link.
oakstack.printRead documents
Turn photos, screenshots, PDFs, and pasted lists into clean data: products from a photo of boxes or a pre-order email, receipts, contacts. Unclear items are flagged for review.
oakstack.lensTransactional email from your own verified domain, with PDFs attached in the same call. Receive email at an Oakstack address and get it in your app as a webhook.
oakstack.postPush notifications
Notify a user on every browser, iPhone, and Android device they've signed in on, in one call. Devices that are gone are removed for you, and every delivery is logged.
oakstack.bellText messages
Texts from your own verified toll-free number: order updates, reminders, sign-in codes. STOP replies are handled for you, and replies reach your app as a webhook.
oakstack.ringEmail that stays out of spam folders
Every customer shares our sending reputation, so we protect it for everyone:
- Email only goes out from domains the customer has verified, signed with DKIM.
- Emailing anyone outside your own team needs a paid plan with a card on file.
- Addresses that bounce or mark email as spam are suppressed automatically and checked before every send.
- New senders have daily limits that rise over their first month.
- Sending pauses automatically above 5% bounces or 0.1% spam complaints until a person reviews it.
- Purchased or scraped lists are never allowed. See the Acceptable Use Policy.
Pricing
Flat monthly plans with hard limits: when you reach one, that feature stops instead of billing you more.
Free
$0 /month
- 3 scheduled jobs
- 5 webhook endpoints
- 1,000 webhook events a month
- 25 PDFs a month
- 100 emails a month, to your own team only
- 20 pages read a month
- Texts in test mode only
- 1,000 push notifications a month
- Logs kept 7 days
Builder
$20 /month
- 25 scheduled jobs
- 50 webhook endpoints
- 50,000 webhook events a month
- 1,000 PDFs a month
- 10,000 emails a month
- 200 pages read a month
- 100 texts a month
- 50,000 push notifications a month
- Logs kept 7 days
Studio
$49 /month
- 100 scheduled jobs
- 200 webhook endpoints
- 250,000 webhook events a month
- 5,000 PDFs a month
- 50,000 emails a month
- 500 pages read a month
- 300 texts a month
- 250,000 push notifications a month
- Logs kept 30 days
Add-ons for Builder and Studio, as many as you need: Reading pack (+1,000 pages a month, $25), SMS pack (+500 texts a month, $10), Extra phone number ($5). Everything else is included in the plan.