Freestyle Cron API

Schedule recurring serverless runs. Create, update, and delete cron schedules; list past executions; inspect per-schedule success rate and a metrics timeline for observability.

OpenAPI Specification

freestyle-cron-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Freestyle Cron API
  version: 0.1.0
  description: "Schedule recurring serverless runs \u2014 create/update/delete cron schedules and inspect executions, success\
    \ rate, and metrics timeline."
  contact:
    name: Ben
    email: ben@freestyle.sh
  license:
    name: Closed Source
servers:
- url: https://api.freestyle.sh
  description: Production
tags: []
paths:
  /v1/cron/schedules:
    get:
      tags:
      - Cron
      operationId: handle_list_schedules
      parameters:
      - name: deploymentId
        in: query
        required: false
        schema:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/DeploymentId'
      - name: metricsStart
        in: query
        required: false
        schema:
          type:
          - string
          - 'null'
          format: date-time
      - name: metricsEnd
        in: query
        required: false
        schema:
          type:
          - string
          - 'null'
          format: date-time
      responses:
        '200':
          description: Schedules retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListSchedulesResponse'
        '500':
          description: Internal server error
    post:
      tags:
      - Cron
      operationId: handle_create_schedule
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateScheduleRequest'
        required: true
      responses:
        '200':
          description: Schedule created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateScheduleResponse'
        '400':
          description: Invalid request
        '500':
          description: Internal server error
  /v1/cron/schedules/{id}:
    get:
      tags:
      - Cron
      operationId: handle_get_schedule
      parameters:
      - name: id
        in: path
        description: Schedule ID
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Schedule retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetScheduleResponse'
        '404':
          description: Schedule not found
        '500':
          description: Internal server error
    delete:
      tags:
      - Cron
      operationId: handle_delete_schedule
      parameters:
      - name: id
        in: path
        description: Schedule ID
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Schedule deleted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteScheduleResponse'
        '500':
          description: Internal server error
    patch:
      tags:
      - Cron
      operationId: handle_update_schedule
      parameters:
      - name: id
        in: path
        description: Schedule ID
        required: true
        schema:
          type: string
          format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateScheduleRequest'
        required: true
      responses:
        '200':
          description: Schedule updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpdateScheduleResponse'
        '404':
          description: Schedule not found
        '500':
          description: Internal server error
  /v1/cron/schedules/{id}/executions:
    get:
      tags:
      - Cron
      operationId: handle_list_schedule_executions
      parameters:
      - name: id
        in: path
        description: Schedule ID
        required: true
        schema:
          type: string
          format: uuid
      - name: limit
        in: query
        required: false
        schema:
          type:
          - integer
          - 'null'
          format: int64
      - name: offset
        in: query
        required: false
        schema:
          type:
          - integer
          - 'null'
          format: int64
      responses:
        '200':
          description: Executions retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListScheduleExecutionsResponse'
        '404':
          description: Schedule not found
        '500':
          description: Internal server error
  /v1/cron/schedules/{id}/metrics-timeline:
    get:
      tags:
      - Cron
      operationId: handle_get_metrics_timeline
      parameters:
      - name: id
        in: path
        description: Schedule ID
        required: true
        schema:
          type: string
          format: uuid
      - name: start
        in: query
        required: true
        schema:
          type: string
          format: date-time
      - name: end
        in: query
        required: true
        schema:
          type: string
          format: date-time
      - name: bucketMinutes
        in: query
        required: false
        schema:
          type:
          - integer
          - 'null'
          format: int64
      responses:
        '200':
          description: Metrics timeline retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MetricsTimelineResponseBody'
        '404':
          description: Schedule not found
        '500':
          description: Internal server error
  /v1/cron/schedules/{id}/success-rate:
    get:
      tags:
      - Cron
      operationId: handle_get_schedule_success_rate
      parameters:
      - name: id
        in: path
        description: Schedule ID
        required: true
        schema:
          type: string
          format: uuid
      - name: start
        in: query
        required: true
        schema:
          type: string
          format: date-time
      - name: end
        in: query
        required: true
        schema:
          type: string
          format: date-time
      responses:
        '200':
          description: Success rate retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduleSuccessRateResponseBody'
        '404':
          description: Schedule not found
        '500':
          description: Internal server error
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
  schemas:
    CronRunConfig:
      allOf:
      - $ref: '#/components/schemas/CronRunConfigParams'
      - type: object
        required:
        - code
        properties:
          code:
            type: string
            description: The JavaScript or TypeScript module to execute. Must export a default function.
      description: "Configuration for running a serverless script when a cron schedule fires.\nThis is an alternative to targeting\
        \ a deployment \u2014 use this to run ad-hoc\ncode on each cron tick without needing a deployed project."
    ExecutionAttempt:
      type: object
      required:
      - id
      - executionId
      - attemptNumber
      - status
      - startedAt
      - createdAt
      - updatedAt
      properties:
        id:
          type: string
          format: uuid
        executionId:
          type: string
          format: uuid
        attemptNumber:
          type: integer
          format: int32
        status:
          $ref: '#/components/schemas/ExecutionStatus'
        instanceId:
          type:
          - string
          - 'null'
        error:
          type:
          - string
          - 'null'
        startedAt:
          type: string
          format: date-time
        completedAt:
          type:
          - string
          - 'null'
          format: date-time
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    GetScheduleResponse:
      type: object
      required:
      - schedule
      properties:
        schedule:
          $ref: '#/components/schemas/Schedule'
    ExecutionStatus:
      type: string
      enum:
      - queued
      - running
      - succeeded
      - failed
      - retry
    ExecutionWithAttempts:
      allOf:
      - $ref: '#/components/schemas/Execution'
      - type: object
        required:
        - attemptHistory
        properties:
          attemptHistory:
            type: array
            items:
              $ref: '#/components/schemas/ExecutionAttempt'
    ListScheduleExecutionsResponse:
      type: object
      required:
      - executions
      - total
      - offset
      - limit
      properties:
        executions:
          type: array
          items:
            $ref: '#/components/schemas/ExecutionWithAttempts'
        total:
          type: integer
          format: int64
        offset:
          type: integer
          format: int64
        limit:
          type: integer
          format: int64
    MetricsDataPoint:
      type: object
      description: 'A single bucket of execution metrics.


        `succeeded_count` includes every terminal success. The first-try and retry

        success counts split that total and sum to `succeeded_count`.

        `execution_count` is `succeeded_count + failed_count`.'
      required:
      - timestamp
      - executionCount
      - succeededCount
      - succeededOnFirstTryCount
      - succeededOnRetryCount
      - failedCount
      properties:
        timestamp:
          type: string
          format: date-time
        executionCount:
          type: integer
          format: int64
        succeededCount:
          type: integer
          format: int64
        succeededOnFirstTryCount:
          type: integer
          format: int64
        succeededOnRetryCount:
          type: integer
          format: int64
        failedCount:
          type: integer
          format: int64
        averageLatencyMs:
          type:
          - number
          - 'null'
          format: double
        averageSuccessLatencyMs:
          type:
          - number
          - 'null'
          format: double
        averageFailureLatencyMs:
          type:
          - number
          - 'null'
          format: double
        p50SuccessLatencyMs:
          type:
          - number
          - 'null'
          format: double
        p90SuccessLatencyMs:
          type:
          - number
          - 'null'
          format: double
        p99SuccessLatencyMs:
          type:
          - number
          - 'null'
          format: double
    Execution:
      type: object
      required:
      - id
      - scheduleId
      - runAt
      - status
      - attempts
      - maxAttempts
      - createdAt
      - updatedAt
      properties:
        id:
          type: string
          format: uuid
        scheduleId:
          type: string
          format: uuid
        deploymentId:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/DeploymentId'
        runAt:
          type: string
          format: date-time
        nextRetryAt:
          type:
          - string
          - 'null'
          format: date-time
        status:
          $ref: '#/components/schemas/ExecutionStatus'
        attempts:
          type: integer
          format: int32
        maxAttempts:
          type: integer
          format: int32
        lockedAt:
          type:
          - string
          - 'null'
          format: date-time
        lockOwner:
          type:
          - string
          - 'null'
        lastError:
          type:
          - string
          - 'null'
        instanceId:
          type:
          - string
          - 'null'
        startedAt:
          type:
          - string
          - 'null'
          format: date-time
        completedAt:
          type:
          - string
          - 'null'
          format: date-time
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    Schedule:
      type: object
      required:
      - id
      - accountId
      - cron
      - timezone
      - retries
      - payload
      - active
      - createdAt
      - updatedAt
      properties:
        id:
          type: string
          format: uuid
        accountId:
          type: string
          format: uuid
        deploymentId:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/DeploymentId'
            description: The deployment to invoke on each tick. Mutually exclusive with `runConfig`.
        name:
          type:
          - string
          - 'null'
        path:
          type:
          - string
          - 'null'
        cron:
          type: string
        timezone:
          type: string
        retries:
          type: integer
          format: int32
        payload: {}
        active:
          type: boolean
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        runConfig:
          description: Serverless run config to execute on each tick. Mutually exclusive with `deploymentId`.
    ListSchedulesResponse:
      type: object
      required:
      - schedules
      properties:
        schedules:
          type: array
          items:
            $ref: '#/components/schemas/ScheduleWithStats'
    CreateScheduleResponse:
      type: object
      required:
      - schedule
      properties:
        schedule:
          $ref: '#/components/schemas/Schedule'
    ScheduleWithStats:
      allOf:
      - $ref: '#/components/schemas/Schedule'
      - type: object
        properties:
          successRate:
            type:
            - number
            - 'null'
            format: double
          averageLatencyMs:
            type:
            - number
            - 'null'
            format: double
          executionCount:
            type:
            - integer
            - 'null'
            format: int64
    DeleteScheduleResponse:
      type: object
      required:
      - success
      properties:
        success:
          type: boolean
    CreateScheduleRequest:
      type: object
      required:
      - cron
      properties:
        deploymentId:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/DeploymentId'
            description: The deployment to invoke on each tick. Exactly one of `deploymentId` or `run` must be set.
        name:
          type:
          - string
          - 'null'
        path:
          type:
          - string
          - 'null'
        cron:
          type: string
        timezone:
          type: string
        retries:
          type: integer
          format: int32
        payload: {}
        run:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/CronRunConfig'
            description: Serverless run config to execute on each tick. Exactly one of `deploymentId` or `run` must be set.
    MetricsTimelineResponseBody:
      type: object
      required:
      - scheduleId
      - dataPoints
      - start
      - end
      properties:
        scheduleId:
          type: string
          format: uuid
        dataPoints:
          type: array
          items:
            $ref: '#/components/schemas/MetricsDataPoint'
        start:
          type: string
          format: date-time
        end:
          type: string
          format: date-time
    ScheduleSuccessRateResponseBody:
      type: object
      description: 'Aggregate success-rate stats over a time window.


        Only terminal executions are counted: `total = succeeded + failed`.

        In-flight executions (status `queued`, `running`, or `retry`) are excluded.

        `succeeded` counts a run as successful regardless of how many retries it

        took to get there - i.e. retries are included in `succeeded` once the run

        ultimately completes successfully.'
      required:
      - total
      - succeeded
      - failed
      - successRate
      - start
      - end
      properties:
        total:
          type: integer
          format: int64
        succeeded:
          type: integer
          format: int64
        failed:
          type: integer
          format: int64
        successRate:
          type: number
          format: double
        start:
          type: string
          format: date-time
        end:
          type: string
          format: date-time
        averageLatencyMs:
          type:
          - number
          - 'null'
          format: double
    UpdateScheduleRequest:
      type: object
      properties:
        deploymentId:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/DeploymentId'
        name:
          type:
          - string
          - 'null'
        active:
          type:
          - boolean
          - 'null'
        path:
          type:
          - string
          - 'null'
        cron:
          type:
          - string
          - 'null'
        timezone:
          type:
          - string
          - 'null'
        retries:
          type:
          - integer
          - 'null'
          format: int32
        payload: {}
        run:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/CronRunConfig'
            description: Update the serverless run config. Set to null to clear (requires a deploymentId to be set separately).
    CronRunConfigParams:
      type: object
      description: Optional configuration for a cron-triggered serverless run.
      properties:
        envVars:
          type: object
          description: Environment variables available to the script
          default: {}
          additionalProperties:
            type: string
          propertyNames:
            type: string
        nodeModules:
          type: object
          description: "Node modules to install (package name \u2192 version)"
          default: {}
          additionalProperties:
            type: string
          propertyNames:
            type: string
        inferNodeModules:
          type: boolean
          description: If true, Freestyle will best-effort infer npm packages from script imports.
          default: false
        timeout:
          type:
          - integer
          - 'null'
          format: int32
          description: Script execution timeout in seconds
          default: null
          minimum: 0
        tags:
          type: array
          items:
            type: string
          description: Tags for organizing runs
          default: []
        peerDependencyResolution:
          type:
          - boolean
          - 'null'
          description: If false, peer dependencies are not auto-resolved.
          default: null
        networkPermissions:
          description: Outbound network permission rules.
        customHeaders:
          type: object
          description: Headers injected into outgoing fetch requests.
          default: {}
          additionalProperties:
            type: string
          propertyNames:
            type: string
        proxy:
          type:
          - string
          - 'null'
          description: Proxy URL for outbound requests.
          default: null
        egress:
          description: Egress control configuration.
        zeroRetention:
          type:
          - boolean
          - 'null'
          description: If true, avoid retaining logs/results/code for this run.
          default: null
    UpdateScheduleResponse:
      type: object
      required:
      - success
      properties:
        success:
          type: boolean
    DeploymentId:
      type: string
      format: uuid
security:
- bearerAuth: []