Everytime a Job is triggered, a Run is created with a payload of data.

Anatomy of a Run

A Run is a record of the execution of a Job. It is created from run() function of a Job.

  id: "event-1",
  name: "Run when the foo.bar event happens",
  version: "0.0.1",
  trigger: eventTrigger({
    name: "foo.bar",
    schema: z.object({
      url: z.string(),
  // 1. Run function with params
  run: async (payload, io, ctx) => {
    // 2. Regular code and Tasks
    // 3. Optionally return data from run execution
    return { status: 'success' }
  1. The run() function is called with some useful parameters. More on that in a second.
  2. Inside the run function you can write regular code and use Tasks.
  3. You can return data, which will then be retrievable with getRun or the React hooks.


Runs can exceed the maximum timeout on serverless platforms. If a Run exceeds this limit, it will be re-run. When it is re-run, any completed Tasks return their original output and they aren’t re-run. Read more about Resumability.

Run function parameters


The payload is the data that triggered the Job. It is the same data that was sent to the Trigger that triggered the Job.

  • For Webhooks the payload is the data from the webhook.
  • For Events the payload is the data from the event, in the example above that’s { url: "https://..." }.
  • For Scheduled the payload is an object with the timestamp and the last timestamp (previous run).


The io object gives you access to Integrations and other useful functions. View the full reference for io.

A few things you can do with io:


The context object gives you access to information about the current Run, Job, Environment, Organization and Event. View the full reference for context.