[{"data":1,"prerenderedAt":30},["ShallowReactive",2],{"content:docs":3},{"body":4,"toc":5},"\u003Ch1>Docs\u003C\u002Fh1>\n\u003Cp>cronservices calls HTTP endpoints on a schedule, or once at an exact time. A \u003Cstrong>job\u003C\u002Fstrong> pairs a schedule (a cron expression in any time zone, or a single \u003Ccode>run_at\u003C\u002Fcode> timestamp) with a chain of \u003Cstrong>steps\u003C\u002Fstrong>. Each step receives the previous step&#39;s output, so one job can fetch data, reshape it, and post it somewhere else. That&#39;s the work a scheduled serverless function usually does.\u003C\u002Fp>\n\u003Cp>A step is one of three things:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>a \u003Cstrong>request\u003C\u002Fstrong> to any HTTP endpoint,\u003C\u002Fli>\n\u003Cli>a \u003Cstrong>transform\u003C\u002Fstrong> that reshapes JSON without making a request, or\u003C\u002Fli>\n\u003Cli>a \u003Cstrong>built-in step\u003C\u002Fstrong> for a known API, such as \u003Ccode>slack_send_message\u003C\u002Fcode>, \u003Ccode>stripe_list_subscriptions\u003C\u002Fcode> or \u003Ccode>smtp_send_email\u003C\u002Fcode>. You fill in a few fields and cronservices builds the request. See \u003Ca href=\"\u002Fintegrations\">Integrations\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"quickstart\">\u003Ca class=\"anchor\" href=\"#quickstart\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Quickstart\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Ca href=\"\u002Flogin#signup\">Create an account\u003C\u002Fa>. The Hobby plan is free and needs no card.\u003C\u002Fli>\n\u003Cli>Create an API key in \u003Cstrong>Settings → API keys\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Create a job:\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">bash\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#C0CAF5\">curl\u003C\u002Fspan> \u003Cspan style=\"color:#E0AF68\">-X\u003C\u002Fspan> \u003Cspan style=\"color:#9ECE6A\">POST\u003C\u002Fspan> \u003Cspan style=\"color:#9ECE6A\">https:\u002F\u002Fapi.cron.services\u002Falarms\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">\\\u003C\u002Fspan>\n  \u003Cspan style=\"color:#E0AF68\">-H\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Authorization: Bearer \u003C\u002Fspan>\u003Cspan style=\"color:#C0CAF5\">$CRONSERVICES_API_KEY\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">\\\u003C\u002Fspan>\n  \u003Cspan style=\"color:#E0AF68\">-H\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Content-Type: application\u002Fjson\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">\\\u003C\u002Fspan>\n  \u003Cspan style=\"color:#E0AF68\">-d\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&#39;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">{\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">    &quot;name&quot;: &quot;Warm product cache&quot;,\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">    &quot;cron&quot;: { &quot;expression&quot;: &quot;*\u002F15 * * * *&quot; },\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">    &quot;nodes&quot;: [\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">      { &quot;id&quot;: &quot;warm&quot;, &quot;request&quot;: { &quot;method&quot;: &quot;POST&quot;, &quot;endpoint&quot;: &quot;https:\u002F\u002Fshop.example.com\u002Fapi\u002Fcache\u002Fwarm&quot; } }\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">    ]\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">  }\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&#39;\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">json\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">id\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">6f1c1f0e-2a4b-4d55-9a0e-7b1f3c2d9e10\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cp>cronservices now sends \u003Ccode>POST https:\u002F\u002Fshop.example.com\u002Fapi\u002Fcache\u002Fwarm\u003C\u002Fcode> every 15 minutes and records every run. To try it immediately, call \u003Ccode>POST \u002Falarms\u002F{id}\u002Frun\u003C\u002Fcode>, which runs the job now and returns the run.\u003C\u002Fp>\n\u003Ch2 id=\"schedules\">\u003Ca class=\"anchor\" href=\"#schedules\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Schedules\u003C\u002Fh2>\n\u003Cp>A repeating job has a \u003Ccode>cron\u003C\u002Fcode> object. \u003Ccode>expression\u003C\u002Fcode> is a standard 5-field cron expression, read as wall-clock time in \u003Ccode>time_zone\u003C\u002Fcode> (an IANA name such as \u003Ccode>America\u002FNew_York\u003C\u002Fcode>; defaults to \u003Ccode>UTC\u003C\u002Fcode>):\u003C\u002Fp>\n\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">text\u003C\u002Fspan>\u003Cpre>\u003Ccode>┌──────── minute        0-59\n│ ┌────── hour          0-23\n│ │ ┌──── day of month  1-31\n│ │ │ ┌── month         1-12 or JAN-DEC\n│ │ │ │ ┌ day of week   0-6 or SUN-SAT (0 is Sunday)\n│ │ │ │ │\n* * * * *\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cp>Each field takes \u003Ccode>*\u003C\u002Fcode>, a value, a range (\u003Ccode>1-5\u003C\u002Fcode>), a list (\u003Ccode>1,15\u003C\u002Fcode>), or a step (\u003Ccode>*\u002F10\u003C\u002Fcode>, \u003Ccode>0-30\u002F5\u003C\u002Fcode>). A few extensions cover schedules plain cron can&#39;t express:\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Expression\u003C\u002Fth>\n\u003Cth>Fires\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>*\u002F5 * * * *\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Every 5 minutes\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>0 9 * * 1-5\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>09:00 on weekdays\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>30 2 * * SUN\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>02:30 every Sunday\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>0 0 1 * *\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Midnight on the 1st of each month\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>0 0 L * *\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Midnight on the last day of each month\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>30 17 LW * *\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>17:30 on the last weekday of each month\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>0 9 15W * *\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>09:00 on the weekday nearest the 15th\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>0 8 * * MON#1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>08:00 on the first Monday of each month\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>0 16 * * FRI#L\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>16:00 on the last Friday of each month\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Cp>When both day-of-month and day-of-week are set (neither is \u003Ccode>*\u003C\u002Fcode>), the job fires on days that match either one, as in classic crontab.\u003C\u002Fp>\n\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">json\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">cron\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">expression\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">0 9 * * 1-5\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">time_zone\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Europe\u002FBerlin\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cp>\u003Cstrong>Daylight saving time.\u003C\u002Fstrong> A job at 09:00 in \u003Ccode>America\u002FNew_York\u003C\u002Fcode> fires at 09:00 local all year. A time skipped when the clocks go forward fires just after the change, and a time repeated when they go back fires once.\u003C\u002Fp>\n\u003Cp>The fastest schedule is every minute (\u003Ccode>* * * * *\u003C\u002Fcode>). There&#39;s no seconds field, and \u003Ccode>@daily\u003C\u002Fcode>-style shortcuts aren&#39;t supported.\u003C\u002Fp>\n\u003Ch3 id=\"one-time-jobs\">\u003Ca class=\"anchor\" href=\"#one-time-jobs\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>One-time jobs\u003C\u002Fh3>\n\u003Cp>To fire once, send \u003Ccode>run_at\u003C\u002Fcode> instead of \u003Ccode>cron\u003C\u002Fcode>. It&#39;s an ISO 8601 timestamp with an offset, in the future and within a year:\u003C\u002Fp>\n\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">bash\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#C0CAF5\">curl\u003C\u002Fspan> \u003Cspan style=\"color:#E0AF68\">-X\u003C\u002Fspan> \u003Cspan style=\"color:#9ECE6A\">POST\u003C\u002Fspan> \u003Cspan style=\"color:#9ECE6A\">https:\u002F\u002Fapi.cron.services\u002Falarms\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">\\\u003C\u002Fspan>\n  \u003Cspan style=\"color:#E0AF68\">-H\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Authorization: Bearer \u003C\u002Fspan>\u003Cspan style=\"color:#C0CAF5\">$CRONSERVICES_API_KEY\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">\\\u003C\u002Fspan>\n  \u003Cspan style=\"color:#E0AF68\">-H\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Content-Type: application\u002Fjson\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">\\\u003C\u002Fspan>\n  \u003Cspan style=\"color:#E0AF68\">-d\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&#39;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">{\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">    &quot;name&quot;: &quot;Trial ends: acme&quot;,\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">    &quot;run_at&quot;: &quot;2026-12-01T09:00:00-05:00&quot;,\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">    &quot;nodes&quot;: [\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">      { &quot;id&quot;: &quot;expire&quot;, &quot;request&quot;: { &quot;method&quot;: &quot;POST&quot;, &quot;endpoint&quot;: &quot;https:\u002F\u002Fapi.example.com\u002Ftrials\u002Facme\u002Fexpire&quot;, &quot;credential_id&quot;: &quot;YOUR_CREDENTIAL_ID&quot; } }\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">    ]\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ECE6A\">  }\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&#39;\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cp>The job fires within a few seconds of \u003Ccode>run_at\u003C\u002Fcode>, then sets \u003Ccode>complete_time\u003C\u002Fcode> and \u003Ccode>enabled: false\u003C\u002Fcode>. Its run stays in the job&#39;s history, and it no longer counts toward your plan&#39;s job limit. To run it again, \u003Ccode>PUT\u003C\u002Fcode> it with a new \u003Ccode>run_at\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"steps\">\u003Ca class=\"anchor\" href=\"#steps\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Steps\u003C\u002Fh2>\n\u003Cp>A job&#39;s \u003Ccode>nodes\u003C\u002Fcode> is a list of 1 to 20 steps, and at least one must make a request. Each step has an \u003Ccode>id\u003C\u002Fcode> (letters, digits, \u003Ccode>_\u003C\u002Fcode> and \u003Ccode>-\u003C\u002Fcode>, unique within the job), an optional \u003Ccode>name\u003C\u002Fcode>, and exactly one kind:\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Kind\u003C\u002Fth>\n\u003Cth>Does\u003C\u002Fth>\n\u003Cth>Output, which the next step gets as \u003Ccode>$\u003C\u002Fcode>\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>request\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Sends an HTTP request. The URL, headers, and body can use placeholders\u003C\u002Ftd>\n\u003Ctd>The response body, parsed as JSON when it parses, otherwise text\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>transform\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Renders a JSON template. No network\u003C\u002Ftd>\n\u003Ctd>The rendered JSON\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>A built-in step\u003C\u002Ftd>\n\u003Ctd>Sends the request a known API expects (see \u003Ca href=\"\u002Fintegrations\">Integrations\u003C\u002Fa>)\u003C\u002Ftd>\n\u003Ctd>The API&#39;s response\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Cp>The first step gets \u003Ccode>null\u003C\u002Fcode> as its input. A run stops at the first step that fails: a network error, a timeout, or a non-2xx status. The run records which step stopped it and why.\u003C\u002Fp>\n\u003Cp>This job posts open pull requests to Slack every weekday at 09:00 Berlin time:\u003C\u002Fp>\n\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">json\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan>\n  \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">name\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Open PRs to #eng\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n  \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">cron\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">expression\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">0 9 * * 1-5\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">time_zone\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Europe\u002FBerlin\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n  \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">nodes\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">[\u003C\u002Fspan>\n    \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">id\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">prs\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">name\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Open PRs\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n      \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">github_list_pull_requests\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7DCFFF\">credential_id\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">YOUR_GITHUB_CREDENTIAL_ID\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7DCFFF\">owner\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">acme\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7DCFFF\">repo\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">web\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7DCFFF\">state\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">open\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n    \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">id\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">lines\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">name\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">One line per PR\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n      \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">transform\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7DCFFF\">template\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">{ \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">count\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">: \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">{{ $.length }}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">, \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">lines\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">: { \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">{{#each $}}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">: \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">• &lt;{{ $.html_url }}|#{{ $.number }}&gt; {{ $.title }} ({{ $.user.login }})\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\"> } }\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n    \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">id\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">post\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">name\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Post to Slack\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n      \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">slack_send_message\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7DCFFF\">webhook_url\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">https:\u002F\u002Fhooks.slack.com\u002Fservices\u002FT000\u002FB000\u002FXXXX\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7DCFFF\">text\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">*{{ $.count }} open pull requests*\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">{{ join($.lines, \u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\\\\\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">n\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">\\&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">) }}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\n  \u003Cspan style=\"color:#9ABDF5\">]\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cp>The transform turns GitHub&#39;s array of pull requests into:\u003C\u002Fp>\n\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">json\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan>\n  \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">count\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#FF9E64\">2\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n  \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">lines\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">[\u003C\u002Fspan>\n    \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">• &lt;https:\u002F\u002Fgithub.com\u002Facme\u002Fweb\u002Fpull\u002F412|#412&gt; Fix retry backoff (ada)\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n    \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">• &lt;https:\u002F\u002Fgithub.com\u002Facme\u002Fweb\u002Fpull\u002F415|#415&gt; Add pipeline editor (grace)\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\n  \u003Cspan style=\"color:#9ABDF5\">]\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cp>and the Slack step posts:\u003C\u002Fp>\n\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">text\u003C\u002Fspan>\u003Cpre>\u003Ccode>*2 open pull requests*\n• &lt;https:\u002F\u002Fgithub.com\u002Facme\u002Fweb\u002Fpull\u002F412|#412&gt; Fix retry backoff (ada)\n• &lt;https:\u002F\u002Fgithub.com\u002Facme\u002Fweb\u002Fpull\u002F415|#415&gt; Add pipeline editor (grace)\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cp>The equivalent serverless function would need a deploy target, a cron trigger, secrets, a GitHub client, error handling, and logs. Here it&#39;s one JSON document, and every run is recorded.\u003C\u002Fp>\n\u003Ch3 id=\"request-steps\">\u003Ca class=\"anchor\" href=\"#request-steps\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Request steps\u003C\u002Fh3>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Notes\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>method\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>GET\u003C\u002Fcode>, \u003Ccode>POST\u003C\u002Fcode>, \u003Ccode>PUT\u003C\u002Fcode>, \u003Ccode>PATCH\u003C\u002Fcode> or \u003Ccode>DELETE\u003C\u002Fcode>. Defaults to \u003Ccode>POST\u003C\u002Fcode>. Responses spell it \u003Ccode>HTTP_METHOD_GET\u003C\u002Fcode> and so on, and requests accept either form\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>endpoint\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Full \u003Ccode>http:\u002F\u002F\u003C\u002Fcode> or \u003Ccode>https:\u002F\u002F\u003C\u002Fcode> URL. May contain placeholders\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>credential_id\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Optional. A \u003Ccode>bearer_token\u003C\u002Fcode>, \u003Ccode>basic_auth\u003C\u002Fcode> or \u003Ccode>api_key_header\u003C\u002Fcode> \u003Ca href=\"#credentials\">credential\u003C\u002Fa>, sent as its header\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>headers\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>array\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>[{ &quot;name&quot;: &quot;X-Source&quot;, &quot;value&quot;: &quot;cronservices&quot; }]\u003C\u002Fcode>. Values may contain placeholders. Up to 50\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>body\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Sent with \u003Ccode>POST\u003C\u002Fcode>, \u003Ccode>PUT\u003C\u002Fcode>, \u003Ccode>PATCH\u003C\u002Fcode> and \u003Ccode>DELETE\u003C\u002Fcode>. Up to 64 KiB\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Cp>A body that starts with \u003Ccode>{\u003C\u002Fcode> or \u003Ccode>[\u003C\u002Fcode> is a JSON template and must be valid JSON once its placeholders are filled in, and it&#39;s sent as \u003Ccode>application\u002Fjson\u003C\u002Fcode> unless you set \u003Ccode>Content-Type\u003C\u002Fcode>. Any other body is plain text with placeholders filled in, sent as \u003Ccode>text\u002Fplain\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"transform-steps\">\u003Ca class=\"anchor\" href=\"#transform-steps\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Transform steps\u003C\u002Fh3>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Notes\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>template\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Required. A JSON template, rendered against the previous step&#39;s output\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Cp>Use a transform to pick a few fields, rename them, or build a list that a later step sends or joins into text.\u003C\u002Fp>\n\u003Ch3 id=\"built-in-steps\">\u003Ca class=\"anchor\" href=\"#built-in-steps\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Built-in steps\u003C\u002Fh3>\n\u003Cp>A built-in step takes only the fields its API needs, and cronservices builds and signs the request. Each one counts as a request: a non-2xx response stops the job.\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Group\u003C\u002Fth>\n\u003Cth>Steps\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Chat\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>slack_send_message\u003C\u002Fcode>, \u003Ccode>discord_send_message\u003C\u002Fcode>, \u003Ccode>teams_post_message\u003C\u002Fcode>, \u003Ccode>google_chat_send_message\u003C\u002Fcode>, \u003Ccode>mattermost_send_message\u003C\u002Fcode>, \u003Ccode>telegram_send_message\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Push\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>ntfy_publish\u003C\u002Fcode>, \u003Ccode>pushover_send_notification\u003C\u002Fcode>, \u003Ccode>gotify_send_message\u003C\u002Fcode>, \u003Ccode>pushbullet_push_note\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Email and SMS\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>smtp_send_email\u003C\u002Fcode>, \u003Ccode>resend_send_email\u003C\u002Fcode>, \u003Ccode>sendgrid_send_email\u003C\u002Fcode>, \u003Ccode>twilio_send_sms\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Incidents and monitoring\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>pagerduty_trigger_incident\u003C\u002Fcode>, \u003Ccode>opsgenie_create_alert\u003C\u002Fcode>, \u003Ccode>datadog_post_event\u003C\u002Fcode>, \u003Ccode>healthchecks_ping\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Developer tools\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>github_create_issue\u003C\u002Fcode>, \u003Ccode>ifttt_trigger\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Fetch data\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>stripe_list_subscriptions\u003C\u002Fcode>, \u003Ccode>stripe_list_customers\u003C\u002Fcode>, \u003Ccode>stripe_retrieve_balance\u003C\u002Fcode>, \u003Ccode>github_list_pull_requests\u003C\u002Fcode>, \u003Ccode>slack_channel_history\u003C\u002Fcode>, \u003Ccode>pagerduty_list_on_calls\u003C\u002Fcode>, \u003Ccode>open_meteo_forecast\u003C\u002Fcode>, \u003Ccode>frankfurter_latest\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Cp>Each service&#39;s page under \u003Ca href=\"\u002Fintegrations\">Integrations\u003C\u002Fa> lists its fields and a complete example job. Text fields such as a message or subject are filled in as text, so \u003Ccode>&quot;Rain: {{ $.daily.precipitation_sum[0] }} mm&quot;\u003C\u002Fcode> works anywhere.\u003C\u002Fp>\n\u003Ch2 id=\"templates\">\u003Ca class=\"anchor\" href=\"#templates\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Templates\u003C\u002Fh2>\n\u003Cp>Placeholders use double braces and read from the previous step&#39;s output.\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Placeholder\u003C\u002Fth>\n\u003Cth>Value\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>{{ $ }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The whole previous output\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ $.user.login }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A nested field\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ $.items[0] }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A list element\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ $[&quot;first name&quot;] }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A key with spaces or symbols\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ $.items.length }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The length of a list, or of a string\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ $root.x }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The step&#39;s input, even inside \u003Ccode>#each\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ join($.names, &quot;, &quot;) }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A list as text. The separator defaults to \u003Ccode>&quot;, &quot;\u003C\u002Fcode>; use \u003Ccode>&quot;\\n&quot;\u003C\u002Fcode> for one item per line\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ now() }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>When the job runs, as an ISO 8601 string in UTC\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ now:America\u002FNew_York }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>That same instant in an IANA time zone\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ today(&quot;Europe\u002FLondon&quot;) }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Midnight at the start of the run&#39;s day in that zone (UTC without an argument)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ format(now(), &quot;YYYY-MM-DD&quot;) }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The run time in a layout. See \u003Ca href=\"#formats\">Formats\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ now() - days(14) }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Date math. Also \u003Ccode>hours\u003C\u002Fcode>, \u003Ccode>minutes\u003C\u002Fcode>, \u003Ccode>seconds\u003C\u002Fcode>, \u003Ccode>weeks\u003C\u002Fcode>, \u003Ccode>months\u003C\u002Fcode> and \u003Ccode>years\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ $.created_at + days(1) }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>An ISO 8601 time from the input, plus a duration\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{{ unix(now()) }}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Seconds since 1970. \u003Ccode>time(1793188800)\u003C\u002Fcode> goes the other way\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Cp>\u003Cstrong>Where they work:\u003C\u002Fstrong> request URLs, header values and bodies, transform templates, and the text fields of built-in steps.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Types are kept\u003C\u002Fstrong> when a placeholder is the entire JSON value. \u003Ccode>&quot;{{ $.count }}&quot;\u003C\u002Fcode> and a bare \u003Ccode>{{ $.count }}\u003C\u002Fcode> both render as the number \u003Ccode>2\u003C\u002Fcode>. A placeholder inside longer text becomes text: \u003Ccode>&quot;Total: {{ $.count }}&quot;\u003C\u002Fcode> renders as \u003Ccode>&quot;Total: 2&quot;\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Lists:\u003C\u002Fstrong> an object whose only key is \u003Ccode>{{#each &lt;list&gt;}}\u003C\u002Fcode> becomes an array. Its value is rendered once per item, with \u003Ccode>$\u003C\u002Fcode> bound to the item:\u003C\u002Fp>\n\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">json\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan>\n  \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">store\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">{{ $.store }}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n  \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">skus\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">{{#each $.rows}}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7DCFFF\">sku\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">{{ $.sku }}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7DCFFF\">store\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">{{ $root.store }}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">json\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">store\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">nyc\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">skus\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">[{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">sku\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">a\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">store\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">nyc\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">sku\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">b\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">store\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">nyc\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}]\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cp>To send a list as a chat message or an email, build a list of lines with \u003Ccode>#each\u003C\u002Fcode> in a transform step, then \u003Ccode>join\u003C\u002Fcode> it in the message, as in the \u003Ca href=\"#steps\">pull request example\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Times.\u003C\u002Fstrong> \u003Ccode>now()\u003C\u002Fcode> is when the job runs, in UTC. \u003Ccode>now:America\u002FNew_York\u003C\u002Fcode> is that same instant written in an IANA time zone, offset included. Add or subtract a duration, with spaces around \u003Ccode>+\u003C\u002Fcode> and \u003Ccode>-\u003C\u002Fcode>: \u003Ccode>now() - days(14)\u003C\u002Fcode>, \u003Ccode>now:America\u002FLos_Angeles + hours(9)\u003C\u002Fcode>. \u003Ccode>days\u003C\u002Fcode> and \u003Ccode>months\u003C\u002Fcode> follow that time zone&#39;s calendar. A field that is already an ISO 8601 timestamp shifts the same way.\u003C\u002Fp>\n\u003Ch3 id=\"formats\">\u003Ca class=\"anchor\" href=\"#formats\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Formats\u003C\u002Fh3>\n\u003Cp>\u003Ccode>format(now(), &quot;YYYY-MM-DD&quot;)\u003C\u002Fcode> writes a layout instead of ISO 8601, and an optional third argument picks the zone: \u003Ccode>format(now(), &quot;dddd, MMMM DD&quot;, &quot;America\u002FLos_Angeles&quot;)\u003C\u002Fcode>. \u003Ccode>format(now:America\u002FLos_Angeles - days(1), &quot;MM\u002FDD\u002FYYYY&quot;)\u003C\u002Fcode> is yesterday in that zone.\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Token\u003C\u002Fth>\n\u003Cth>Writes\u003C\u002Fth>\n\u003Cth>Example\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>YYYY\u003C\u002Fcode> \u002F \u003Ccode>YY\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Year\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>2026\u003C\u002Fcode> \u002F \u003Ccode>26\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>MM\u003C\u002Fcode> \u002F \u003Ccode>MMM\u003C\u002Fcode> \u002F \u003Ccode>MMMM\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Month\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>10\u003C\u002Fcode> \u002F \u003Ccode>Oct\u003C\u002Fcode> \u002F \u003Ccode>October\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DD\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Day of the month\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>05\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ddd\u003C\u002Fcode> \u002F \u003Ccode>dddd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Weekday\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>Wed\u003C\u002Fcode> \u002F \u003Ccode>Wednesday\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>HH\u003C\u002Fcode> \u002F \u003Ccode>hh\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Hour, 00–23 \u002F 01–12\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>14\u003C\u002Fcode> \u002F \u003Ccode>02\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>mm\u003C\u002Fcode> \u002F \u003Ccode>ss\u003C\u002Fcode> \u002F \u003Ccode>SSS\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Minute \u002F second \u002F millisecond\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>05\u003C\u002Fcode> \u002F \u003Ccode>09\u003C\u002Fcode> \u002F \u003Ccode>000\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>A\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>AM\u003C\u002Fcode> or \u003Ccode>PM\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>PM\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Z\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Offset\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>Z\u003C\u002Fcode> or \u003Ccode>-05:00\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Cp>Text in \u003Ccode>[brackets]\u003C\u002Fcode> is copied as is: \u003Ccode>&quot;ddd [at] hh:mm A&quot;\u003C\u002Fcode> writes \u003Ccode>Wed at 02:05 PM\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Missing values\u003C\u002Fstrong> render as \u003Ccode>null\u003C\u002Fcode> (or an empty string inside text) and are flagged in the editor preview. They don&#39;t fail the run.\u003C\u002Fp>\n\u003Ch2 id=\"credentials\">\u003Ca class=\"anchor\" href=\"#credentials\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Credentials\u003C\u002Fh2>\n\u003Cp>A credential is a saved secret that any number of jobs can use. Steps refer to it by \u003Ccode>credential_id\u003C\u002Fcode>, so the secret never appears in a job, a template, or the run history. Create credentials in \u003Cstrong>Settings → Credentials\u003C\u002Fstrong>, or through the API:\u003C\u002Fp>\n\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">bash\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#C0CAF5\">curl\u003C\u002Fspan> \u003Cspan style=\"color:#E0AF68\">-X\u003C\u002Fspan> \u003Cspan style=\"color:#9ECE6A\">POST\u003C\u002Fspan> \u003Cspan style=\"color:#9ECE6A\">https:\u002F\u002Fapi.cron.services\u002Fcredentials\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">\\\u003C\u002Fspan>\n  \u003Cspan style=\"color:#E0AF68\">-H\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Authorization: Bearer \u003C\u002Fspan>\u003Cspan style=\"color:#C0CAF5\">$CRONSERVICES_API_KEY\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">\\\u003C\u002Fspan>\n  \u003Cspan style=\"color:#E0AF68\">-H\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Content-Type: application\u002Fjson\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">\\\u003C\u002Fspan>\n  \u003Cspan style=\"color:#E0AF68\">-d\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&#39;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">{ &quot;name&quot;: &quot;GitHub (acme)&quot;, &quot;bearer_token&quot;: { &quot;token&quot;: &quot;ghp_your_token&quot; } }\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&#39;\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">json\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">id\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Xq3vK8mB2nT5wR7yL1pA\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Kind\u003C\u002Fth>\n\u003Cth>Fields\u003C\u002Fth>\n\u003Cth>Used by\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>bearer_token\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>token\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Request steps (as \u003Ccode>Authorization: Bearer\u003C\u002Fcode>), and the Stripe, GitHub, Slack history, Resend, SendGrid, Pushbullet and ntfy steps\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>basic_auth\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>username\u003C\u002Fcode>, \u003Ccode>password\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Request steps (as \u003Ccode>Authorization: Basic\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>api_key_header\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>header\u003C\u002Fcode>, \u003Ccode>value\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Request steps (as \u003Ccode>&lt;header&gt;: &lt;value&gt;\u003C\u002Fcode>, such as \u003Ccode>X-API-Key\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>smtp\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>host\u003C\u002Fcode>, \u003Ccode>port\u003C\u002Fcode>, \u003Ccode>security\u003C\u002Fcode> (\u003Ccode>tls\u003C\u002Fcode> or \u003Ccode>starttls\u003C\u002Fcode>), \u003Ccode>username\u003C\u002Fcode>, \u003Ccode>password\u003C\u002Fcode>, \u003Ccode>from_address\u003C\u002Fcode>, \u003Ccode>from_name\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>smtp_send_email\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>twilio\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>account_sid\u003C\u002Fcode>, \u003Ccode>auth_token\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>twilio_send_sms\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>telegram_bot\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>bot_token\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>telegram_send_message\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pushover\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>api_token\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>pushover_send_notification\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>gotify\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>server\u003C\u002Fcode>, \u003Ccode>token\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>gotify_send_message\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pagerduty_routing_key\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>routing_key\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>pagerduty_trigger_incident\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pagerduty_api_key\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>api_key\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>pagerduty_list_on_calls\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>opsgenie\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>region\u003C\u002Fcode>, \u003Ccode>api_key\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>opsgenie_create_alert\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>datadog\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>site\u003C\u002Fcode>, \u003Ccode>api_key\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>datadog_post_event\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ifttt\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>key\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>ifttt_trigger\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Cp>Secret fields (tokens, passwords, keys) are write-only. They&#39;re encrypted at rest and never returned, and reads show \u003Ccode>last4\u003C\u002Fcode> instead. Updating a credential with an empty secret keeps the stored one. Editing a credential changes what every job using it sends, starting with its next run. A credential can&#39;t be deleted while a job uses it.\u003C\u002Fp>\n\u003Ch2 id=\"api\">\u003Ca class=\"anchor\" href=\"#api\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>API\u003C\u002Fh2>\n\u003Cp>Base URL: \u003Ccode>https:\u002F\u002Fapi.cron.services\u003C\u002Fcode>. Send JSON, and authenticate every request with \u003Ccode>Authorization: Bearer &lt;API key&gt;\u003C\u002Fcode>. The machine-readable spec is at \u003Ca href=\"\u002Fopenapi.json\">\u002Fopenapi.json\u003C\u002Fa>. In the API, jobs are called \u003Cstrong>alarms\u003C\u002Fstrong> and steps are \u003Cstrong>nodes\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Path\u003C\u002Fth>\n\u003Cth>Does\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>GET\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Falarms\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>List your jobs, newest first\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>POST\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Falarms\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Create a job. Returns \u003Ccode>201 { &quot;id&quot;: &quot;…&quot; }\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>GET\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Falarms\u002F{id}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Get one job\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>PUT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Falarms\u002F{id}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Replace a job. Send every field. Returns \u003Ccode>204\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DELETE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Falarms\u002F{id}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Delete a job and its run history. Returns \u003Ccode>204\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>POST\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Falarms\u002F{id}\u002Frun\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Run the job now, outside its schedule, and return the finished run. Works on paused jobs and doesn&#39;t move the schedule\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>GET\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Falarms\u002F{id}\u002Fruns\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The job&#39;s runs, newest first. \u003Ccode>?page_size=\u003C\u002Fcode> (up to 500, default 100) and \u003Ccode>?page_token=\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>GET\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fcredentials\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>List credentials, without their secrets\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>POST\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fcredentials\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Create a credential. Returns \u003Ccode>201 { &quot;id&quot;: &quot;…&quot; }\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>PUT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fcredentials\u002F{id}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Replace a credential. An empty secret keeps the stored one. Returns \u003Ccode>204\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DELETE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fcredentials\u002F{id}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Delete a credential. Returns \u003Ccode>204\u003C\u002Fcode>, or \u003Ccode>409\u003C\u002Fcode> while a job uses it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>GET\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002Fhealth\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Health check. No auth\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Ch3 id=\"job-fields\">\u003Ca class=\"anchor\" href=\"#job-fields\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Job fields\u003C\u002Fh3>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Notes\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>id\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>UUID. Read-only\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>name\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Up to 80 characters\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cron\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>object\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>{ &quot;expression&quot;: &quot;0 9 * * *&quot;, &quot;time_zone&quot;: &quot;America\u002FNew_York&quot; }\u003C\u002Fcode>. Send this or \u003Ccode>run_at\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>run_at\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>ISO 8601 time for a one-time job, within a year. Send this or \u003Ccode>cron\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>nodes\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>array\u003C\u002Ftd>\n\u003Ctd>1 to 20 steps. See \u003Ca href=\"#steps\">Steps\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>enabled\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>false\u003C\u002Fcode> pauses the job. Defaults to \u003Ccode>true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>next_fire_at\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Read-only. The next scheduled run. Absent once a one-time job has fired\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>last_fired_at\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Read-only\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>last_status_code\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer\u003C\u002Ftd>\n\u003Ctd>Read-only. The last request&#39;s status, where \u003Ccode>0\u003C\u002Fcode> means it couldn&#39;t be sent\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>complete_time\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Read-only. When a one-time job fired\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>create_time\u003C\u002Fcode>, \u003Ccode>update_time\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Read-only\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Ch3 id=\"run-fields\">\u003Ca class=\"anchor\" href=\"#run-fields\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Run fields\u003C\u002Fh3>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Notes\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>id\u003C\u002Fcode>, \u003Ccode>alarm_id\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>trigger\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>RUN_TRIGGER_SCHEDULE\u003C\u002Fcode>, or \u003Ccode>RUN_TRIGGER_MANUAL\u003C\u002Fcode> for \u003Ccode>POST \u002Falarms\u002F{id}\u002Frun\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>fire_time\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>When the run started\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>duration\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Such as \u003Ccode>&quot;0.412s&quot;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>status_code\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer\u003C\u002Ftd>\n\u003Ctd>The last request&#39;s status. \u003Ccode>0\u003C\u002Fcode> means it couldn&#39;t be sent (DNS, TLS, or the 10-second timeout)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>failed_node_id\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>The step that stopped the run. Absent when it succeeded\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>error_message\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>Why it failed, such as \u003Ccode>HTTP 401: {&quot;message&quot;:&quot;Bad credentials&quot;}\u003C\u002Fcode>. Absent when it succeeded\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>steps\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>array\u003C\u002Ftd>\n\u003Ctd>One entry per request or built-in step: \u003Ccode>node_id\u003C\u002Fcode>, \u003Ccode>node_name\u003C\u002Fcode>, \u003Ccode>status\u003C\u002Fcode> (\u003Ccode>RUN_STEP_STATUS_SUCCEEDED\u003C\u002Fcode>, \u003Ccode>…_FAILED\u003C\u002Fcode> or \u003Ccode>…_SKIPPED\u003C\u002Fcode>), \u003Ccode>status_code\u003C\u002Fcode>, \u003Ccode>duration\u003C\u002Fcode>, \u003Ccode>error_message\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Cp>Fields that are empty, zero, or unset are left out of responses.\u003C\u002Fp>\n\u003Ch2 id=\"errors\">\u003Ca class=\"anchor\" href=\"#errors\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Errors\u003C\u002Fh2>\n\u003Cp>Errors return JSON with a stable \u003Ccode>code\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cdiv class=\"code-block site-code\">\u003Cspan class=\"code-lang\">json\u003C\u002Fspan>\u003Cpre>\u003Ccode>\u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan>\n  \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">code\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">validation_failed\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n  \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">message\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">Some fields are invalid\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">,\u003C\u002Fspan>\n  \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#7AA2F7\">fields\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">{\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#0DB9D7\">alarm.cron.expression\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">:\u003C\u002Fspan> \u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECE6A\">hour must be 0-23, *, or a list, range or step of those\u003C\u002Fspan>\u003Cspan style=\"color:#89DDFF\">&quot;\u003C\u002Fspan> \u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\n\u003Cspan style=\"color:#9ABDF5\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cbutton type=\"button\" class=\"icon-btn code-copy\" data-copy aria-label=\"Copy code\">\u003Csvg class=\"icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Status\u003C\u002Fth>\n\u003Cth>\u003Ccode>code\u003C\u002Fcode>\u003C\u002Fth>\n\u003Cth>Means\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>400\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>invalid_json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The body isn&#39;t valid JSON for this request, such as an unknown field or a timestamp without an offset. \u003Ccode>message\u003C\u002Fcode> says where\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>401\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>unauthenticated\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Missing or invalid API key\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>402\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>plan_limit\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A plan limit is reached\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>403\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>email_not_verified\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The account&#39;s email isn&#39;t verified yet\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>404\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>not_found\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Nothing with that id on this account\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>409\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>failed_precondition\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The change conflicts with current state, such as deleting a credential a job uses\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>422\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>validation_failed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>See \u003Ccode>fields\u003C\u002Fcode>, keyed by path: \u003Ccode>alarm.nodes[1].transform.template\u003C\u002Fcode>, or \u003Ccode>alarm\u003C\u002Fcode> for rules that span fields\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>500\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>internal\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Our fault. Retry with backoff\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Ch2 id=\"limits\">\u003Ca class=\"anchor\" href=\"#limits\" aria-hidden=\"true\" tabindex=\"-1\">#\u003C\u002Fa>Limits\u003C\u002Fh2>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Limit\u003C\u002Fth>\n\u003Cth>Value\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Request timeout\u003C\u002Ftd>\n\u003Ctd>10 seconds per request or built-in step\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Steps per job\u003C\u002Ftd>\n\u003Ctd>20\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Request body, template\u003C\u002Ftd>\n\u003Ctd>64 KiB each\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Schedule resolution\u003C\u002Ftd>\n\u003Ctd>1 minute\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>One-time \u003Ccode>run_at\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Up to one year ahead, any second\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Scheduler drift\u003C\u002Ftd>\n\u003Ctd>A job fires within about 5 seconds of its scheduled time\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003Cp>A request that takes longer than 10 seconds is recorded with status \u003Ccode>0\u003C\u002Fcode>. For longer work, have the endpoint accept the request, return \u003Ccode>202\u003C\u002Fcode>, and finish in the background.\u003C\u002Fp>\n",[6,9,12,15,18,21,24,27],{"id":7,"html":8},"quickstart","Quickstart",{"id":10,"html":11},"schedules","Schedules",{"id":13,"html":14},"steps","Steps",{"id":16,"html":17},"templates","Templates",{"id":19,"html":20},"credentials","Credentials",{"id":22,"html":23},"api","API",{"id":25,"html":26},"errors","Errors",{"id":28,"html":29},"limits","Limits",1793404039426]