DEV Community

Alex Spinov
Alex Spinov

Posted on

Trigger.dev Has a Free API You're Not Using

Trigger.dev is a background jobs framework for TypeScript. It's like Sidekiq for Node.js — but with type safety, retries, and a dashboard built in.

The Free APIs You're Missing

1. defineJob — Type-Safe Background Jobs

import { task } from "@trigger.dev/sdk/v3";

export const processOrder = task({
  id: "process-order",
  retry: { maxAttempts: 3, factor: 2, minTimeoutInMs: 1000 },
  run: async (payload: { orderId: string; userId: string }) => {
    const order = await db.orders.findUnique({ where: { id: payload.orderId } });
    await chargePayment(order);
    await sendConfirmationEmail(payload.userId, order);
    await updateInventory(order.items);
    return { processed: true, orderId: payload.orderId };
  },
});
Enter fullscreen mode Exit fullscreen mode

2. Triggering — Multiple Ways to Start Jobs

// From your API route
await processOrder.trigger({ orderId: "order-123", userId: "user-456" });

// Batch trigger
await processOrder.batchTrigger(
  orders.map(order => ({ payload: { orderId: order.id, userId: order.userId } }))
);

// Delayed trigger
await processOrder.trigger(
  { orderId: "order-123", userId: "user-456" },
  { delay: "5m" }
);

// With idempotency key
await processOrder.trigger(
  { orderId: "order-123", userId: "user-456" },
  { idempotencyKey: "order-123" }
);
Enter fullscreen mode Exit fullscreen mode

3. Scheduled Tasks — Cron Jobs

import { schedules } from "@trigger.dev/sdk/v3";

export const dailyReport = schedules.task({
  id: "daily-report",
  cron: "0 9 * * *", // Every day at 9am
  run: async () => {
    const stats = await generateDailyStats();
    await sendSlackMessage(stats);
    return stats;
  },
});
Enter fullscreen mode Exit fullscreen mode

4. waitFor — Long-Running Workflows

export const onboardUser = task({
  id: "onboard-user",
  run: async (payload: { userId: string }) => {
    await createAccount(payload.userId);

    // Wait for email verification (up to 24h)
    const verified = await wait.for({ seconds: 86400 });

    if (verified) {
      await activateAccount(payload.userId);
      await sendWelcomeEmail(payload.userId);
    }
  },
});
Enter fullscreen mode Exit fullscreen mode

5. Sub-Tasks — Composable Workflows

export const processVideo = task({
  id: "process-video",
  run: async (payload: { videoUrl: string }) => {
    const downloaded = await downloadVideo.triggerAndWait({ url: payload.videoUrl });
    const transcoded = await transcodeVideo.triggerAndWait({ path: downloaded.path });
    const thumbnail = await generateThumbnail.triggerAndWait({ path: transcoded.path });

    return { video: transcoded.url, thumbnail: thumbnail.url };
  },
});
Enter fullscreen mode Exit fullscreen mode

Getting Started

npx trigger.dev@latest init
npx trigger.dev@latest dev
Enter fullscreen mode Exit fullscreen mode

Need data from any website delivered as clean JSON? I build production web scrapers that handle anti-bot, proxies, and rate limits. 77 scrapers running in production. Email me: Spinov001@gmail.com

Check out my awesome-web-scraping list for the best scraping tools and resources.

Top comments (0)