> ## Documentation Index
> Fetch the complete documentation index at: https://cadenya.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a schedule

> Fire an objective on a cadence. Calendar rules for wall-clock times, interval rules for fixed durations, and a skip policy so runs never stack.

A schedule owns the timer so you do not have to. Each fire creates an [objective](/docs/api-reference/objectiveservice/create-a-new-objective) on the agent, with the message and prompt data you set here.

Only `spec.schedule` is required, and inside it, `timezone` plus at least one rule.

<CodeGroup>
  ```typescript TypeScript theme={null}
  const schedule = await client.agents.schedules.create(agentId, {
    workspaceId,
    metadata: { name: 'Weekday digest', externalId: 'weekday-digest' },
    spec: {
      firstUserMessage: 'Summarize open tickets and post the digest.',
      overlapPolicy: 'OVERLAP_POLICY_SKIP',
      schedule: {
        timezone: 'America/New_York',
        calendars: [
          { hour: [{ start: 9 }], minute: [{ start: 0 }], dayOfWeek: [{ start: 1, end: 5 }] },
        ],
      },
    },
  });

  console.log(schedule.state); // STATE_ACTIVE
  ```

  ```go Go theme={null}
  schedule, err := client.Agents.Schedules.New(ctx, agentID,
  	cadenya.AgentScheduleNewParams{
  		WorkspaceID: cadenya.String(workspaceID),
  		Metadata: shared.CreateResourceMetadataParam{
  			Name:       "Weekday digest",
  			ExternalID: cadenya.String("weekday-digest"),
  		},
  		Spec: cadenya.AgentScheduleSpecParam{
  			FirstUserMessage: cadenya.String("Summarize open tickets and post the digest."),
  			OverlapPolicy:    cadenya.AgentScheduleSpecOverlapPolicyOverlapPolicySkip,
  			Schedule: cadenya.AgentScheduleSpecScheduleParam{
  				Timezone: cadenya.String("America/New_York"),
  				Calendars: []cadenya.ScheduleCalendarParam{{
  					Hour:      []cadenya.ScheduleRangeParam{{Start: cadenya.Int(9)}},
  					Minute:    []cadenya.ScheduleRangeParam{{Start: cadenya.Int(0)}},
  					DayOfWeek: []cadenya.ScheduleRangeParam{{Start: cadenya.Int(1), End: cadenya.Int(5)}},
  				}},
  			},
  		},
  	})
  ```

  ```ruby Ruby theme={null}
  schedule = cadenya.agents.schedules.create(
    agent_id,
    workspace_id: workspace_id,
    metadata: {name: "Weekday digest", externalId: "weekday-digest"},
    spec: {
      firstUserMessage: "Summarize open tickets and post the digest.",
      overlapPolicy: :OVERLAP_POLICY_SKIP,
      schedule: {
        timezone: "America/New_York",
        calendars: [
          {hour: [{start: 9}], minute: [{start: 0}], dayOfWeek: [{start: 1, end: 5}]}
        ]
      }
    }
  )

  puts schedule.state # STATE_ACTIVE
  ```

  ```bash cURL theme={null}
  curl -X POST "https://api.cadenya.com/v1/workspaces/${WORKSPACE_ID}/agents/external_id:support/schedules" \
    -H "Authorization: Bearer ${CADENYA_API_KEY}" \
    -H "Content-Type: application/json" \
    -d '{
          "metadata": { "name": "Weekday digest", "externalId": "weekday-digest" },
          "spec": {
            "firstUserMessage": "Summarize open tickets and post the digest.",
            "overlapPolicy": "OVERLAP_POLICY_SKIP",
            "schedule": {
              "timezone": "America/New_York",
              "calendars": [
                { "hour": [{ "start": 9 }], "minute": [{ "start": 0 }], "dayOfWeek": [{ "start": 1, "end": 5 }] }
              ]
            }
          }
        }'
  ```
</CodeGroup>

<Warning>
  **Only published agents fire.** A schedule on a draft agent records a skip instead of creating an objective, and unpublishing an agent pauses its schedules. The schedule still reads `STATE_ACTIVE`, so a silent lack of runs usually means the agent is not published.
</Warning>

## Two kinds of rule

A schedule holds up to 16 `calendars` and up to 16 `intervals`, and it fires whenever **any** of them matches. `timezone` is required and applies to both.

**Calendar** rules fire at wall-clock times. Each field takes a list of ranges, and the fire times are the cartesian product across fields.

```json theme={null}
{ "hour": [{ "start": 9 }], "minute": [{ "start": 0 }], "dayOfWeek": [{ "start": 1, "end": 5 }] }
```

**Interval** rules fire every fixed duration from a stable anchor, with an optional `offset` to phase-shift within the period.

```json theme={null}
{ "intervals": [{ "every": "3600s", "offset": "900s" }] }
```

That fires at fifteen minutes past every hour. The minimum `every` is one minute (`60s`); anything shorter is a `400`. The `offset` must be less than `every`.

### The empty-field rule that catches everyone

Calendar fields do not all default the same way, and this is the one thing to get right:

* Leave `second`, `minute`, or `hour` empty and it means **zero**, the top of that unit.
* Leave `dayOfMonth`, `month`, or `dayOfWeek` empty and it means **any**.

So the preceding example pins `hour` and `minute` to fire once at 9:00. Drop the `minute` and it still fires once, at 9:00, because an empty minute means zero, not "every minute." Drop the `hour` and you get midnight, not hourly.

A `Range` is `{ start, end, step }`. `end` defaults to `start`, and `step` defaults to `1`. So `{ "start": 0, "end": 23, "step": 2 }` on `hour` is every other hour, and `{ "start": 9 }` means 9 o'clock and nothing else. `dayOfWeek` runs 0 to 6 from Sunday, which makes `{ "start": 1, "end": 5 }` Monday through Friday.

## What a fire creates

Each fire calls create-objective on your behalf, carrying the schedule's fields across:

| Schedule field         | Becomes                                                                                                  |
| ---------------------- | -------------------------------------------------------------------------------------------------------- |
| `firstUserMessage`     | The objective's opening message. Omit it and the variation's `firstUserMessageTemplate` renders instead. |
| `systemPromptData`     | The data rendered into the variation's `systemPromptTemplate`.                                           |
| `firstUserMessageData` | The data rendered into the variation's `firstUserMessageTemplate`.                                       |
| `variationId`          | A pinned variation. Omit it and the agent's selection mode chooses per fire.                             |

<Warning>
  When the agent declares a `systemPromptDataSchema`, the schedule's `systemPromptData` must satisfy it. A schedule that omits it fails validation on **every fire**, from inside the worker. Nothing surfaces on the schedule itself.
</Warning>

Objectives created by a schedule get a generated `metadata.externalId` shaped like `schedule:<scheduleId>:<nanoseconds>`, so you cannot set your own external ID on them. Find them by filtering instead:

```typescript theme={null}
const runs = await client.objectives.list({
  workspaceId,
  agentScheduleId: schedule.metadata.id, // or 'external_id:weekday-digest'
});
```

## Overlap: skip or stack

`overlapPolicy` decides what happens when the previous run is still `STATE_PENDING` or `STATE_RUNNING` at fire time.

* `OVERLAP_POLICY_SKIP` skips the fire and records why. **This is the default**, and it is what you want for a digest or a sweep that must not double-post.
* `OVERLAP_POLICY_ALLOW` fires anyway, so runs stack.

Leaving `overlapPolicy` unset stores `OVERLAP_POLICY_UNSPECIFIED`, which behaves as skip.

## Confirm it is running

Read the schedule back with `includeInfo` and `info` tells you what has happened.

```typescript theme={null}
const schedule = await client.agents.schedules.retrieve(agentId, scheduleId, {
  workspaceId, includeInfo: true,
});

console.log(schedule.info?.nextFireAt);      // 2026-07-09T09:00:00Z
console.log(schedule.info?.totalFires);      // 2
console.log(schedule.info?.lastFireAt);      // 2026-07-08T17:14:00Z
console.log(schedule.info?.lastObjectiveId); // obj_01KX1BHR0V66C77CZ075DQAPY0
console.log(schedule.info?.lastSkipReason);  // "previous objective still running"
```

`lastObjectiveId` is the fastest way to see what the last run did. `lastSkippedAt` and `lastSkipReason` explain a schedule that looks active but produces nothing.

`info.nextFireAt` is the timestamp of the upcoming fire, computed from the spec, so you can confirm a new schedule is live before it has ever run. It is present on an active schedule with future fire times, and absent on a paused or archived one. So a fresh `STATE_ACTIVE` schedule reads `totalFires: 0` with a real `nextFireAt`, which is exactly the "yes, this runs, at this time" signal a dashboard wants.

## Pause, resume, archive

Lifecycle is a set of actions, not a field. `state` is read-only.

```typescript theme={null}
await client.agents.schedules.pause(agentId, scheduleId, { workspaceId });   // stop firing, keep it
await client.agents.schedules.resume(agentId, scheduleId, { workspaceId });  // start again
await client.agents.schedules.archive(agentId, scheduleId, { workspaceId }); // terminal
await client.agents.schedules.delete(agentId, scheduleId, { workspaceId });  // gone
```

Archiving is one-way. An archived schedule never fires and cannot be resumed, updated, or paused; create a new one instead. Pausing is idempotent, so a retried pause is safe.

<Warning>
  A `PATCH` that sets `spec.status` returns `200` and does nothing, because no such field exists. Use `pause`.
</Warning>

## Related

<CardGroup cols={2}>
  <Card title="Schedule an agent" icon="clock" href="/docs/guides/schedule-an-agent">
    The hands-on lesson, from cadence to first fire.
  </Card>

  <Card title="Create an objective" icon="bullseye" href="/docs/api-reference/objectiveservice/create-a-new-objective">
    What every fire builds, and the fields a schedule carries into it.
  </Card>

  <Card title="Agents and variations" icon="code" href="/docs/guides/sdk/agents">
    Publishing an agent, which a schedule requires to fire.
  </Card>

  <Card title="Webhooks" icon="bell" href="/docs/guides/webhooks">
    Hear about a scheduled run without polling for it.
  </Card>
</CardGroup>


## OpenAPI

````yaml post /v1/workspaces/{workspaceId}/agents/{agentId}/schedules
openapi: 3.1.0
info:
  title: Cadenya API
  description: API for the Cadenya Agent Runtime platform.
  version: '1.0'
servers:
  - url: https://api.cadenya.com
    description: Production server
security:
  - bearerAuth: []
tags:
  - name: AIProviderKeyService
  - name: APIKeyService
    description: |-
      Issue, rotate, disable, and revoke a workspace's API keys. Every key
       belongs to exactly one workspace; the system-managed global account key is
       managed via GlobalAPIKeyService instead.
  - name: AccountService
    description: >-
      Manage the authenticated account. Accounts are the top-level
      organizational
       unit and contain one or more workspaces.
  - name: AgentScheduleService
    description: >-
      Manage recurring schedules attached to agents. Schedules trigger
      objectives
       on a cadence defined by AgentScheduleSpec.Schedule.
  - name: AgentService
    description: >-
      Manage AI agents within a workspace. Agents define AI behavior and tool
      access.
  - name: AgentVariationService
    description: >-
      Manage variations of an agent and their tool, sub-agent, and memory layer
      assignments.
  - name: GlobalAPIKeyService
    description: |-
      Manage the account's system-provisioned global API key. The global key is
       the only key that spans every workspace; it is created by the system and
       cannot be deleted, so the surface is retrieve, rotate, and the
       disable/enable kill switch.
  - name: MemoryService
    description: >-
      Manage memory layers and their entries. Layers are named containers that
      can
       be composed into an objective's memory cascade; entries are the keyed values
       within a layer. System-managed layers (e.g., episodic layers created by the
       runtime) cannot be mutated through this API.
  - name: ModelService
    description: |-
      Manage LLM models available to a workspace. Models represent provider and
       family pairs (e.g., "anthropic/claude-sonnet-4.6"). Workspaces are seeded
       with the supported models and you can enable or disable each one.
  - name: ObjectiveEventStreamsService
  - name: ObjectiveService
  - name: ProfilesService
    description: |-
      Operations on profiles, the account-level principals (users, API keys,
       system) that authenticate against the API.
  - name: SearchService
  - name: TenantService
    description: >-
      Read and erase tenants and the subjects under them. Tenants and subjects
      are
       created by assertion — on objective creation or widget session mint — never
       directly, so this service has no create or update: it exists to enumerate what
       assertions have produced, and to destroy it on request.
  - name: ToolService
    description: >-
      Manage tool sets and the tools they contain. Tool sets group related
      tools,
       and tools define specific capabilities available to agents.

       When a tool set is managed, only API key actors can modify its tools; human
       (profile) actors cannot.
  - name: UploadService
    description: |-
      Issue short-lived presigned URLs for direct client-to-object-storage
       uploads. Created uploads can be referenced by id when creating or updating
       resources that accept binary content (e.g., MemoryEntry).
  - name: WidgetService
    description: |-
      Manage embeddable chat widgets. A widget binds an agent to a globally
       unique hostname with a per-widget origin allowlist; browsers reach it with
       session tokens minted via WidgetSessionService.
  - name: WidgetSessionService
    description: >-
      Mint and manage widget sessions. Session creation is server-to-server
      only:
       the customer's backend authenticates its visitor, asserts tenant/subject
       context, attaches any per-visitor secrets, and receives a short-lived
       bearer token the browser uses against the widget host.
  - name: WorkspaceAdminService
    description: >-
      Administer workspaces across the account: create and archive workspaces
      and
       manage their membership. These operations are account-scoped and require the
       admin role (a token whose profile holds the WorkOS admin role); they live
       under /v1/account/workspaces rather than the workspace-scoped /v1/workspaces
       tree so an admin can manage any workspace in the account, including ones they
       are not themselves a member of.
  - name: WorkspaceSecretService
  - name: WorkspaceService
    description: |-
      Manage workspaces within an account. Workspaces provide organizational
       grouping and isolation for resources such as agents, tools, and API keys.

       This is the workspace-scoped, end-user surface. Administrative operations
       (create / archive workspaces, manage members) live in WorkspaceAdminService
       under /v1/account/workspaces and require the admin role.
paths:
  /v1/workspaces/{workspaceId}/agents/{agentId}/schedules:
    post:
      tags:
        - AgentScheduleService
        - Agent Schedules
      summary: Create a new schedule
      description: Creates a new schedule for an agent
      operationId: AgentScheduleService_CreateAgentSchedule
      parameters:
        - name: workspaceId
          in: path
          description: Workspace ID.
          required: true
          schema:
            type: string
            example: workspace_01HXKD2E5NQM3T9AYWCF133E3Q
        - name: agentId
          in: path
          description: >-
            Agent ID. Accepts the canonical `agent_…` form or the
            `external_id:<value>` form.
          required: true
          schema:
            example: agent_01HXKD2E5NQM3T9AYWCFMGWT9Y
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAgentScheduleRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentSchedule'
        default:
          description: Default error response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Status'
      x-codeSamples:
        - lang: JavaScript
          source: >-
            import Cadenya from '@cadenya/cadenya';


            const client = new Cadenya({
              apiKey: process.env['CADENYA_API_KEY'], // This is the default and can be omitted
            });


            const agentSchedule = await
            client.agents.schedules.create('agent_01HXKD2E5NQM3T9AYWCFMGWT9Y', {
              workspaceId: 'workspace_01HXKD2E5NQM3T9AYWCF133E3Q',
              metadata: { name: 'name' },
              spec: { schedule: {} },
            });


            console.log(agentSchedule.metadata);
        - lang: Python
          source: |-
            import os
            from cadenya import Cadenya

            client = Cadenya(
                api_key=os.environ.get("CADENYA_API_KEY"),  # This is the default and can be omitted
            )
            agent_schedule = client.agents.schedules.create(
                agent_id="agent_01HXKD2E5NQM3T9AYWCFMGWT9Y",
                workspace_id="workspace_01HXKD2E5NQM3T9AYWCF133E3Q",
                metadata={
                    "name": "name"
                },
                spec={
                    "schedule": {}
                },
            )
            print(agent_schedule.metadata)
        - lang: Go
          source: "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"go.cadenya.com/cadenya-go\"\n\t\"go.cadenya.com/cadenya-go/option\"\n\t\"go.cadenya.com/cadenya-go/shared\"\n)\n\nfunc main() {\n\tclient := cadenya.NewClient(\n\t\toption.WithAPIKey(\"My API Key\"),\n\t)\n\tagentSchedule, err := client.Agents.Schedules.New(\n\t\tcontext.TODO(),\n\t\t\"agent_01HXKD2E5NQM3T9AYWCFMGWT9Y\",\n\t\tcadenya.AgentScheduleNewParams{\n\t\t\tWorkspaceID: cadenya.String(\"workspace_01HXKD2E5NQM3T9AYWCF133E3Q\"),\n\t\t\tMetadata: shared.CreateResourceMetadataParam{\n\t\t\t\tName: \"name\",\n\t\t\t},\n\t\t\tSpec: cadenya.AgentScheduleSpecParam{\n\t\t\t\tSchedule: cadenya.AgentScheduleSpecScheduleParam{},\n\t\t\t},\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", agentSchedule.Metadata)\n}\n"
        - lang: Ruby
          source: |-
            require "cadenya"

            cadenya = Cadenya::Client.new(api_key: "My API Key")

            agent_schedule = cadenya.agents.schedules.create(
              "agent_01HXKD2E5NQM3T9AYWCFMGWT9Y",
              workspace_id: "workspace_01HXKD2E5NQM3T9AYWCF133E3Q",
              metadata: {name: "name"},
              spec: {schedule: {}}
            )

            puts(agent_schedule)
        - lang: CLI
          source: |-
            cadenya agents:schedules create \
              --api-key 'My API Key' \
              --workspace-id workspace_01HXKD2E5NQM3T9AYWCF133E3Q \
              --agent-id agent_01HXKD2E5NQM3T9AYWCFMGWT9Y \
              --metadata '{name: name}' \
              --spec '{schedule: {}}'
components:
  schemas:
    CreateAgentScheduleRequest:
      required:
        - metadata
        - spec
      type: object
      properties:
        workspaceId:
          readOnly: true
          example: workspace_01HXKD2E5NQM3T9AYWCF133E3Q
          type: string
          description: Workspace ID.
        agentId:
          readOnly: true
          example: agent_01HXKD2E5NQM3T9AYWCFMGWT9Y
          type: string
          description: >-
            Agent ID. Accepts the canonical `agent_…` form or the
            `external_id:<value>` form.
        metadata:
          $ref: '#/components/schemas/CreateResourceMetadata'
        spec:
          $ref: '#/components/schemas/AgentScheduleSpec'
      description: Create agent schedule request.
    AgentSchedule:
      required:
        - metadata
        - spec
        - state
      type: object
      properties:
        metadata:
          $ref: '#/components/schemas/ResourceMetadata'
        spec:
          $ref: '#/components/schemas/AgentScheduleSpec'
        info:
          $ref: '#/components/schemas/AgentScheduleInfo'
        state:
          readOnly: true
          enum:
            - STATE_UNSPECIFIED
            - STATE_ACTIVE
            - STATE_PAUSED
            - STATE_ARCHIVED
          type: string
          description: >-
            The current lifecycle state of the schedule. Output only. Schedules
            are
             created STATE_ACTIVE; use the :pause, :resume, and :archive actions to
             transition between states.
          format: enum
      description: |-
        AgentSchedule resource — a recurring trigger attached to an agent that
         creates objectives on its cadence.
    Status:
      type: object
      properties:
        code:
          type: integer
          description: >-
            The status code, which should be an enum value of
            [google.rpc.Code][google.rpc.Code].
          format: int32
        message:
          type: string
          description: >-
            A developer-facing error message, which should be in English. Any
            user-facing error message should be localized and sent in the
            [google.rpc.Status.details][google.rpc.Status.details] field, or
            localized by the client.
        details:
          type: array
          items:
            $ref: '#/components/schemas/GoogleProtobufAny'
          description: >-
            A list of messages that carry the error details.  There is a common
            set of message types for APIs to use.
      description: >-
        The `Status` type defines a logical error model that is suitable for
        different programming environments, including REST APIs and RPC APIs. It
        is used by [gRPC](https://github.com/grpc). Each `Status` message
        contains three pieces of data: error code, error message, and error
        details. You can find out more about this error model and how to work
        with it in the [API Design
        Guide](https://cloud.google.com/apis/design/errors).
    CreateResourceMetadata:
      required:
        - name
      type: object
      properties:
        name:
          type: string
          description: >-
            Human-readable name for the resource (e.g., "Customer Support
            Agent", "Email Tool")
        externalId:
          type: string
          description: >-
            External ID for the resource (e.g., a workflow ID from an external
            system)
        labels:
          type: object
          additionalProperties:
            type: string
          description: |-
            Key-value pairs for categorization and filtering. Values are 0-63
             alphanumeric characters with "-", "_", or "." allowed between; keys
             follow the same shape and additionally accept an optional DNS-subdomain
             prefix (e.g. "cadenya.com/") of at most 253 characters.
             Examples: {"environment": "production", "team": "platform", "version": "v2"}
      description: |-
        CreateResourceMetadata contains the user-provided fields for creating
         a workspace-scoped resource. Read-only fields (id, account_id, workspace_id, profile_id,
         created_at) are excluded since they are set by the server.
    AgentScheduleSpec:
      required:
        - schedule
      type: object
      properties:
        schedule:
          allOf:
            - $ref: '#/components/schemas/AgentScheduleSpec_Schedule'
          description: When to fire. Required.
        overlapPolicy:
          enum:
            - OVERLAP_POLICY_UNSPECIFIED
            - OVERLAP_POLICY_ALLOW
            - OVERLAP_POLICY_SKIP
          type: string
          description: >-
            What to do when the previous run is still in flight. Defaults to
            SKIP.
          format: enum
        firstUserMessage:
          type: string
          description: >-
            Optional explicit first user message passed to CreateObjective on
            each fire.
             Becomes the first user message in the objective's chat history. When unset, the
             fired objective defers to the selected variation's first_user_message_template.
        variationId:
          example: agentvar_01HXKD2E5NQM3T9AYWCF32BSPP
          type: string
          description: >-
            Optional explicit variation. When unset, the agent's
            variation_selection_mode
             chooses per fire.
        systemPromptData:
          type: object
          description: >-
            Optional data rendered into the variation's system_prompt_template
            when each
             fired objective is created. If the agent has a system_prompt_data_schema,
             this must satisfy it.
          x-stainless-any: true
        firstUserMessageData:
          type: object
          description: >-
            Optional data rendered into the variation's
            first_user_message_template when
             each fired objective is created. Separate from `system_prompt_data`, which
             renders the system prompt template.
          x-stainless-any: true
      description: AgentScheduleSpec is the user-provided configuration for a schedule.
    ResourceMetadata:
      required:
        - id
        - accountId
        - workspaceId
        - name
        - profileId
        - createdAt
      type: object
      properties:
        id:
          readOnly: true
          type: string
          description: >-
            Unique identifier for the resource (prefixed ULID, e.g.,
            "agent_01HXK...")
        accountId:
          readOnly: true
          example: account_01HXKD2E5NQM3T9AYWCFTJHJVF
          type: string
          description: >-
            Account this resource belongs to for multi-tenant isolation
            (prefixed ULID)
        workspaceId:
          readOnly: true
          example: workspace_01HXKD2E5NQM3T9AYWCF133E3Q
          type: string
          description: >-
            Workspace this resource belongs to for organizational grouping
            (prefixed ULID)
        name:
          type: string
          description: >-
            Human-readable name for the resource (e.g., "Customer Support
            Agent", "Email Tool")
             Required for resources that users interact with directly
        externalId:
          type: string
          description: >-
            External ID for the resource (e.g., a workflow ID from an external
            system)
        labels:
          type: object
          additionalProperties:
            type: string
          description: |-
            Key-value pairs for categorization and filtering. Values are 0-63
             alphanumeric characters with "-", "_", or "." allowed between; keys
             follow the same shape and additionally accept an optional DNS-subdomain
             prefix (e.g. "cadenya.com/") of at most 253 characters.
             Examples: {"environment": "production", "team": "platform", "version": "v2"}
        profileId:
          readOnly: true
          example: profile_01HXKD2E5NQM3T9AYWCFS0AP08
          type: string
          description: ID of the actor (user or service account) that created this resource
        createdAt:
          readOnly: true
          type: string
          description: Timestamp when this resource was created
          format: date-time
        updatedAt:
          readOnly: true
          type: string
          description: Timestamp when this resource was last updated
          format: date-time
      description: >-
        Standard metadata for persistent, named resources (e.g., agents, tools,
        prompts)
    AgentScheduleInfo:
      type: object
      properties:
        nextFireAt:
          readOnly: true
          type: string
          description: >-
            When the schedule will next fire. Computed from the spec; absent
            when
             the schedule is STATE_PAUSED/STATE_ARCHIVED or has no future fire times.
          format: date-time
        lastFireAt:
          readOnly: true
          type: string
          description: When the schedule last fired (regardless of objective outcome).
          format: date-time
        lastObjectiveId:
          readOnly: true
          example: obj_01HXKD2E5NQM3T9AYWCFQAZGFV
          type: string
          description: ID of the most recent objective the schedule created.
        lastSkippedAt:
          readOnly: true
          type: string
          description: >-
            When the schedule most recently skipped a fire (SKIP policy + prior
            in flight).
          format: date-time
        lastSkipReason:
          readOnly: true
          type: string
          description: >-
            Reason for the most recent skip (e.g. "previous objective still
            running").
        totalFires:
          readOnly: true
          type: integer
          description: Lifetime count of objectives created by this schedule.
          format: int32
        createdBy:
          $ref: '#/components/schemas/Profile'
      description: AgentScheduleInfo provides read-only runtime data about a schedule.
    GoogleProtobufAny:
      type: object
      properties:
        '@type':
          type: string
          description: The type of the serialized message.
      additionalProperties: true
      description: >-
        Contains an arbitrary serialized message along with a @type that
        describes the type of the serialized message.
    AgentScheduleSpec_Schedule:
      type: object
      properties:
        calendars:
          type: array
          items:
            $ref: '#/components/schemas/Schedule_Calendar'
          description: Wall-clock rules. May be empty if `intervals` is non-empty.
        intervals:
          type: array
          items:
            $ref: '#/components/schemas/Schedule_Interval'
          description: Duration-based rules. May be empty if `calendars` is non-empty.
        timezone:
          type: string
          description: >-
            IANA tz name (e.g. "America/New_York"). Required. Applies to
            calendars;
             intervals fire on wall-clock cadence anchored in this zone.
      description: >-
        Schedule defines WHEN the schedule fires. Temporal-style structured
        form:
         a list of calendar rules (wall-clock) and/or interval rules (duration),
         OR'd together. At least one rule is required.
    Profile:
      required:
        - metadata
        - spec
      type: object
      properties:
        metadata:
          $ref: '#/components/schemas/AccountResourceMetadata'
        spec:
          $ref: '#/components/schemas/ProfileSpec'
      description: |-
        A profile identifies a user or non-human principal (such as an API key)
         at the account level. Profiles are account-scoped and can be granted access
         to multiple workspaces.
    Schedule_Calendar:
      type: object
      properties:
        second:
          type: array
          items:
            $ref: '#/components/schemas/Schedule_Range'
        minute:
          type: array
          items:
            $ref: '#/components/schemas/Schedule_Range'
        hour:
          type: array
          items:
            $ref: '#/components/schemas/Schedule_Range'
        dayOfMonth:
          type: array
          items:
            $ref: '#/components/schemas/Schedule_Range'
        month:
          type: array
          items:
            $ref: '#/components/schemas/Schedule_Range'
        dayOfWeek:
          type: array
          items:
            $ref: '#/components/schemas/Schedule_Range'
        comment:
          type: string
      description: |-
        Calendar is a wall-clock rule. Empty field-list semantics:
           - second/minute/hour: empty means [{start: 0}] (top of the unit)
           - day_of_month/month/day_of_week: empty means "any value"
         Fire times = cartesian product across all fields.
    Schedule_Interval:
      type: object
      properties:
        every:
          pattern: ^-?(?:0|[1-9][0-9]{0,11})(?:\.[0-9]{1,9})?s$
          type: string
        offset:
          pattern: ^-?(?:0|[1-9][0-9]{0,11})(?:\.[0-9]{1,9})?s$
          type: string
          description: Phase shift within `every`. Must be < `every` (enforced at runtime).
      description: |-
        Interval is a duration-based rule. Fires every `every` from a stable
         anchor (workspace epoch), optionally phase-shifted by `offset`.
    AccountResourceMetadata:
      required:
        - id
        - accountId
        - name
        - profileId
      type: object
      properties:
        id:
          readOnly: true
          type: string
          description: >-
            Unique identifier for the resource (prefixed ULID, e.g.,
            "apikey_01HXK...")
        accountId:
          readOnly: true
          example: account_01HXKD2E5NQM3T9AYWCFTJHJVF
          type: string
          description: >-
            Account this resource belongs to for multi-tenant isolation
            (prefixed ULID)
        name:
          type: string
          description: >-
            Human-readable name for the resource (e.g., "Customer Support
            Agent", "Email Tool")
             Required for resources that users interact with directly
        externalId:
          type: string
          description: >-
            External ID for the resource (e.g., a workflow ID from an external
            system)
        labels:
          type: object
          additionalProperties:
            type: string
          description: |-
            Key-value pairs for categorization and filtering. Values are 0-63
             alphanumeric characters with "-", "_", or "." allowed between; keys
             follow the same shape and additionally accept an optional DNS-subdomain
             prefix (e.g. "cadenya.com/") of at most 253 characters.
             Examples: {"environment": "production", "team": "platform", "version": "v2"}
        profileId:
          readOnly: true
          example: profile_01HXKD2E5NQM3T9AYWCFS0AP08
          type: string
        createdAt:
          readOnly: true
          type: string
          format: date-time
      description: >-
        AccountResourceMetadata is used to represent a resource that is
        associated to an account but not to a workspace.
    ProfileSpec:
      required:
        - type
      type: object
      properties:
        email:
          type: string
          description: >-
            Email address of the profile. Required and unique within an account
            for
             user profiles.
        name:
          type: string
          description: Display name (e.g., "Bobby Tables").
        type:
          enum:
            - PROFILE_TYPE_UNSPECIFIED
            - PROFILE_TYPE_USER
            - PROFILE_TYPE_API_KEY
            - PROFILE_TYPE_SYSTEM
          type: string
          description: >-
            Whether this profile represents a human user, an API key, or a
            system
             principal.
          format: enum
      description: Configuration for a profile.
    Schedule_Range:
      type: object
      properties:
        start:
          type: integer
          format: int32
        end:
          type: integer
          format: int32
        step:
          type: integer
          format: int32
      description: |-
        Inclusive numeric range with optional step.
           {start: 9}                    → 9
           {start: 9, end: 17}           → 9..17
           {start: 0, end: 59, step: 15} → 0,15,30,45
         `end` defaults to `start`; `step` defaults to 1.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````