# Workers ## Create a worker template `workers.create(**kwargs) -> WorkerTemplate` **post** `/api/workers` Create a new worker. The worker is a reusable agent template; tasks are runs against this template. Use `POST /tasks` to actually run the agent. ### Parameters - `instructions: String` Persistent system prompt the worker uses for every task it runs. - `output_schema: Hash[Symbol, untyped]` Optional JSON Schema (Draft-07) describing the structured object the worker must produce. When set, every task response is validated against the schema and exposed as `structuredOutput`. - `prompt: String` Natural-language description of the worker to use for AI-generated instructions when `instructions` is omitted. - `summary: String` Short one-line description of the worker's purpose. Auto-generated when omitted and a `prompt` is provided. - `title: String` Optional display name. When omitted, Handinger assigns a random dog-themed name. - `visibility: :public | :private` `public` (default) is visible to all org members. `private` is only visible to invited members. - `:public` - `:private` ### Returns - `class WorkerTemplate` - `id: String` - `created_at: String` - `instructions: String` - `organization_id: String` - `output_schema: Hash[Symbol, untyped]` - `summary: String` - `title: String` - `updated_at: String` - `url: String` Web URL of the worker in the Handinger dashboard. - `user_id: String` - `visibility: :public | :private` - `:public` - `:private` ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") worker_template = handinger.workers.create puts(worker_template) ``` #### Response ```json { "id": "id", "createdAt": "createdAt", "instructions": "instructions", "organizationId": "organizationId", "outputSchema": { "foo": "bar" }, "summary": "summary", "title": "title", "updatedAt": "updatedAt", "url": "https://v3.handinger.com/worker/wrk_vk81XUHKHG-qr4", "userId": "userId", "visibility": "public" } ``` ## Retrieve a worker `workers.retrieve(worker_id, **kwargs) -> Worker` **get** `/api/workers/{workerId}` Retrieve the current worker state and messages from its most recent task (or a specific task via `taskId`). ### Parameters - `worker_id: String` - `task_id: String` Return the worker state and messages for a specific task instead of the most recent one. ### Returns - `class Worker` - `id: String` - `created_at: Integer` - `error: nil` - `files: Array[File{ filename, media_type, url, size}]` - `filename: String` - `media_type: String` - `url: String` - `size: Integer` - `incomplete_details: nil` - `messages: Array[untyped]` - `metadata: Hash[Symbol, untyped]` - `object: :worker` - `:worker` - `output: Array[Output{ id, content, role, 2 more}]` - `id: String` - `content: Array[Content{ text, type}]` - `text: String` - `type: :output_text` - `:output_text` - `role: :assistant` - `:assistant` - `status: :completed` - `:completed` - `type: :message` - `:message` - `output_text: String` - `running: bool` - `sources: Array[Source{ id, title, type, url}]` - `id: String` - `title: String` - `type: :url` - `:url` - `url: String` - `status: :running | :completed | :pending` - `:running` - `:completed` - `:pending` - `structured_output: Hash[Symbol, untyped]` - `url: String` Web URL of the worker in the Handinger dashboard. - `usage: Usage{ credits, duration_ms}` - `credits: Integer` - `duration_ms: Integer` ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") worker = handinger.workers.retrieve("t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM") puts(worker) ``` #### Response ```json { "id": "id", "created_at": 0, "error": null, "files": [ { "filename": "filename", "mediaType": "mediaType", "url": "url", "size": 0 } ], "incomplete_details": null, "messages": [ {} ], "metadata": { "foo": "bar" }, "object": "worker", "output": [ { "id": "id", "content": [ { "text": "text", "type": "output_text" } ], "role": "assistant", "status": "completed", "type": "message" } ], "output_text": "output_text", "running": true, "sources": [ { "id": "id", "title": "title", "type": "url", "url": "url" } ], "status": "running", "structured_output": { "foo": "bar" }, "url": "https://v3.handinger.com/worker/wrk_vk81XUHKHG-qr4", "usage": { "credits": 0, "durationMs": 0 } } ``` ## Update a worker template `workers.update(worker_id, **kwargs) -> WorkerTemplate` **patch** `/api/workers/{workerId}` Update a worker's instructions, title, summary, visibility, or output schema. Only the fields you send are changed; omitted fields keep their current values. Only the worker creator can update a worker. ### Parameters - `worker_id: String` - `instructions: String` Replaces the persistent system prompt. Subsequent tasks pick up the new instructions immediately; in-flight tasks keep using the previous version. - `output_schema: Hash[Symbol, untyped]` Replace the worker's structured output schema. Pass `null` to clear it and return to free-form text responses. - `summary: String` Replaces the worker's short one-line summary. - `title: String` New display name for the worker. - `visibility: :public | :private` Change visibility between `public` (any org member can run tasks) and `private` (only invited members). - `:public` - `:private` ### Returns - `class WorkerTemplate` - `id: String` - `created_at: String` - `instructions: String` - `organization_id: String` - `output_schema: Hash[Symbol, untyped]` - `summary: String` - `title: String` - `updated_at: String` - `url: String` Web URL of the worker in the Handinger dashboard. - `user_id: String` - `visibility: :public | :private` - `:public` - `:private` ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") worker_template = handinger.workers.update("t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM") puts(worker_template) ``` #### Response ```json { "id": "id", "createdAt": "createdAt", "instructions": "instructions", "organizationId": "organizationId", "outputSchema": { "foo": "bar" }, "summary": "summary", "title": "title", "updatedAt": "updatedAt", "url": "https://v3.handinger.com/worker/wrk_vk81XUHKHG-qr4", "userId": "userId", "visibility": "public" } ``` ## Delete a worker template `workers.delete(worker_id) -> DeleteWorkerResponse` **delete** `/api/workers/{workerId}` Soft-delete a worker template so it no longer appears in list or retrieve endpoints. Tasks, turns, files, schedules, and integrations remain in the database for analytics. Only the worker creator can delete a worker. ### Parameters - `worker_id: String` ### Returns - `class DeleteWorkerResponse` - `deleted: bool` ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") delete_worker_response = handinger.workers.delete("t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM") puts(delete_worker_response) ``` #### Response ```json { "deleted": true } ``` ## Retrieve a worker email address `workers.retrieve_email(worker_id) -> WorkerRetrieveEmailResponse` **get** `/api/workers/{workerId}/email` Retrieve the inbound email address for a worker. ### Parameters - `worker_id: String` ### Returns - `class WorkerRetrieveEmailResponse` - `email: String` ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") response = handinger.workers.retrieve_email("t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM") puts(response) ``` #### Response ```json { "email": "email" } ``` ## Domain Types ### Create Worker - `class CreateWorker` - `instructions: String` Persistent system prompt the worker uses for every task it runs. - `output_schema: Hash[Symbol, untyped]` Optional JSON Schema (Draft-07) describing the structured object the worker must produce. When set, every task response is validated against the schema and exposed as `structuredOutput`. - `prompt: String` Natural-language description of the worker to use for AI-generated instructions when `instructions` is omitted. - `summary: String` Short one-line description of the worker's purpose. Auto-generated when omitted and a `prompt` is provided. - `title: String` Optional display name. When omitted, Handinger assigns a random dog-themed name. - `visibility: :public | :private` `public` (default) is visible to all org members. `private` is only visible to invited members. - `:public` - `:private` ### Delete Worker Response - `class DeleteWorkerResponse` - `deleted: bool` ### Update Worker - `class UpdateWorker` - `instructions: String` Replaces the persistent system prompt. Subsequent tasks pick up the new instructions immediately; in-flight tasks keep using the previous version. - `output_schema: Hash[Symbol, untyped]` Replace the worker's structured output schema. Pass `null` to clear it and return to free-form text responses. - `summary: String` Replaces the worker's short one-line summary. - `title: String` New display name for the worker. - `visibility: :public | :private` Change visibility between `public` (any org member can run tasks) and `private` (only invited members). - `:public` - `:private` ### Worker - `class Worker` - `id: String` - `created_at: Integer` - `error: nil` - `files: Array[File{ filename, media_type, url, size}]` - `filename: String` - `media_type: String` - `url: String` - `size: Integer` - `incomplete_details: nil` - `messages: Array[untyped]` - `metadata: Hash[Symbol, untyped]` - `object: :worker` - `:worker` - `output: Array[Output{ id, content, role, 2 more}]` - `id: String` - `content: Array[Content{ text, type}]` - `text: String` - `type: :output_text` - `:output_text` - `role: :assistant` - `:assistant` - `status: :completed` - `:completed` - `type: :message` - `:message` - `output_text: String` - `running: bool` - `sources: Array[Source{ id, title, type, url}]` - `id: String` - `title: String` - `type: :url` - `:url` - `url: String` - `status: :running | :completed | :pending` - `:running` - `:completed` - `:pending` - `structured_output: Hash[Symbol, untyped]` - `url: String` Web URL of the worker in the Handinger dashboard. - `usage: Usage{ credits, duration_ms}` - `credits: Integer` - `duration_ms: Integer` ### Worker Template - `class WorkerTemplate` - `id: String` - `created_at: String` - `instructions: String` - `organization_id: String` - `output_schema: Hash[Symbol, untyped]` - `summary: String` - `title: String` - `updated_at: String` - `url: String` Web URL of the worker in the Handinger dashboard. - `user_id: String` - `visibility: :public | :private` - `:public` - `:private` ### Worker Retrieve Email Response - `class WorkerRetrieveEmailResponse` - `email: String` # Schedules ## List worker schedules `workers.schedules.list(worker_id) -> ScheduleListResponse` **get** `/api/workers/{workerId}/schedules` List scheduled tasks for a worker. ### Parameters - `worker_id: String` ### Returns - `class ScheduleListResponse` - `schedules: Array[WorkerSchedule]` - `class Scheduled` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `input: String` - `next_run_at: Time` - `type: :scheduled` - `:scheduled` - `class Delayed` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `delay_in_seconds: Integer` - `input: String` - `next_run_at: Time` - `type: :delayed` - `:delayed` - `class Cron` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `cron: String` - `input: String` - `next_run_at: Time` - `type: :cron` - `:cron` - `class Interval` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `input: String` - `interval_seconds: Integer` - `next_run_at: Time` - `type: :interval` - `:interval` - `worker_id: String` ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") schedules = handinger.workers.schedules.list("t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM") puts(schedules) ``` #### Response ```json { "schedules": [ { "id": "id", "budget": "low", "input": "input", "nextRunAt": "2019-12-27T18:11:19.117Z", "type": "scheduled" } ], "workerId": "workerId" } ``` ## Create a worker schedule `workers.schedules.create(worker_id, **kwargs) -> WorkerSchedule` **post** `/api/workers/{workerId}/schedules` Schedule a worker instruction for a future or recurring run. ### Parameters - `worker_id: String` - `input: String` - `when_: Scheduled{ date, type} | Delayed{ delay_in_seconds, type} | Cron{ cron, type} | Interval{ interval_seconds, type}` - `class Scheduled` - `date: String` - `type: :scheduled` - `:scheduled` - `class Delayed` - `delay_in_seconds: Integer` - `type: :delayed` - `:delayed` - `class Cron` - `cron: String` - `type: :cron` - `:cron` - `class Interval` - `interval_seconds: Integer` - `type: :interval` - `:interval` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` ### Returns - `WorkerSchedule = Scheduled{ id, budget, input, 2 more} | Delayed{ id, budget, delay_in_seconds, 3 more} | Cron{ id, budget, cron, 3 more} | Interval{ id, budget, input, 3 more}` - `class Scheduled` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `input: String` - `next_run_at: Time` - `type: :scheduled` - `:scheduled` - `class Delayed` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `delay_in_seconds: Integer` - `input: String` - `next_run_at: Time` - `type: :delayed` - `:delayed` - `class Cron` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `cron: String` - `input: String` - `next_run_at: Time` - `type: :cron` - `:cron` - `class Interval` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `input: String` - `interval_seconds: Integer` - `next_run_at: Time` - `type: :interval` - `:interval` ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") worker_schedule = handinger.workers.schedules.create( "t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM", input: "x", when_: {date: "x", type: :scheduled} ) puts(worker_schedule) ``` #### Response ```json { "id": "id", "budget": "low", "input": "input", "nextRunAt": "2019-12-27T18:11:19.117Z", "type": "scheduled" } ``` ## Cancel a worker schedule `workers.schedules.cancel(schedule_id, **kwargs) -> ScheduleCancelResponse` **delete** `/api/workers/{workerId}/schedules/{scheduleId}` Cancel a scheduled task for a worker. ### Parameters - `worker_id: String` - `schedule_id: String` ### Returns - `class ScheduleCancelResponse` - `cancelled: bool` ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") response = handinger.workers.schedules.cancel( "sch_01HZY31W2SZJ8MJ2FQTR3M1K9D", worker_id: "t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM" ) puts(response) ``` #### Response ```json { "cancelled": true } ``` ## Domain Types ### Worker Schedule - `WorkerSchedule = Scheduled{ id, budget, input, 2 more} | Delayed{ id, budget, delay_in_seconds, 3 more} | Cron{ id, budget, cron, 3 more} | Interval{ id, budget, input, 3 more}` - `class Scheduled` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `input: String` - `next_run_at: Time` - `type: :scheduled` - `:scheduled` - `class Delayed` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `delay_in_seconds: Integer` - `input: String` - `next_run_at: Time` - `type: :delayed` - `:delayed` - `class Cron` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `cron: String` - `input: String` - `next_run_at: Time` - `type: :cron` - `:cron` - `class Interval` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `input: String` - `interval_seconds: Integer` - `next_run_at: Time` - `type: :interval` - `:interval` ### Schedule List Response - `class ScheduleListResponse` - `schedules: Array[WorkerSchedule]` - `class Scheduled` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `input: String` - `next_run_at: Time` - `type: :scheduled` - `:scheduled` - `class Delayed` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `delay_in_seconds: Integer` - `input: String` - `next_run_at: Time` - `type: :delayed` - `:delayed` - `class Cron` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `cron: String` - `input: String` - `next_run_at: Time` - `type: :cron` - `:cron` - `class Interval` - `id: String` - `budget: :low | :standard | :high | :unlimited` - `:low` - `:standard` - `:high` - `:unlimited` - `input: String` - `interval_seconds: Integer` - `next_run_at: Time` - `type: :interval` - `:interval` - `worker_id: String` ### Schedule Cancel Response - `class ScheduleCancelResponse` - `cancelled: bool` # Webhooks ## Retrieve a worker webhook `workers.webhooks.retrieve(worker_id) -> Webhook` **get** `/api/workers/{workerId}/webhook` Retrieve the webhook URL and shared token configured for a worker. Both fields are `null` when no webhook is configured. Only the worker creator can read the webhook configuration. ### Parameters - `worker_id: String` ### Returns - `class Webhook` - `token: String` Shared secret sent in the `X-Handinger-Token` header on each delivery. `null` when no webhook is configured. - `url: String` HTTPS endpoint that receives webhook deliveries when a task completes. `null` when no webhook is configured. ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") webhook = handinger.workers.webhooks.retrieve("t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM") puts(webhook) ``` #### Response ```json { "token": "whk_01HZY31W2SZJ8MJ2FQTR3M1K9D", "url": "https://example.com/handinger-webhook" } ``` ## Update a worker webhook `workers.webhooks.update(worker_id, **kwargs) -> Webhook` **put** `/api/workers/{workerId}/webhook` Set or replace the webhook URL for a worker. A fresh token is generated the first time a URL is set; subsequent updates keep the existing token. Pass `url: null` to clear the webhook (use the dedicated DELETE for the same effect). Only the worker creator can update the webhook. ### Parameters - `worker_id: String` - `url: String` HTTPS endpoint Handinger should POST to when a task finishes. Pass `null` to remove the webhook and clear its token. ### Returns - `class Webhook` - `token: String` Shared secret sent in the `X-Handinger-Token` header on each delivery. `null` when no webhook is configured. - `url: String` HTTPS endpoint that receives webhook deliveries when a task completes. `null` when no webhook is configured. ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") webhook = handinger.workers.webhooks.update( "t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM", url: "https://example.com/handinger-webhook" ) puts(webhook) ``` #### Response ```json { "token": "whk_01HZY31W2SZJ8MJ2FQTR3M1K9D", "url": "https://example.com/handinger-webhook" } ``` ## Delete a worker webhook `workers.webhooks.delete(worker_id) -> Webhook` **delete** `/api/workers/{workerId}/webhook` Remove the webhook from a worker. Both `url` and `token` are cleared and no further deliveries are attempted. Only the worker creator can delete the webhook. ### Parameters - `worker_id: String` ### Returns - `class Webhook` - `token: String` Shared secret sent in the `X-Handinger-Token` header on each delivery. `null` when no webhook is configured. - `url: String` HTTPS endpoint that receives webhook deliveries when a task completes. `null` when no webhook is configured. ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") webhook = handinger.workers.webhooks.delete("t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM") puts(webhook) ``` #### Response ```json { "token": "whk_01HZY31W2SZJ8MJ2FQTR3M1K9D", "url": "https://example.com/handinger-webhook" } ``` ## Regenerate a worker webhook token `workers.webhooks.regenerate_token(worker_id) -> Webhook` **post** `/api/workers/{workerId}/webhook/regenerate-token` Issue a new shared token for the webhook, invalidating the previous one. The webhook URL is preserved. Only the worker creator can regenerate the token. ### Parameters - `worker_id: String` ### Returns - `class Webhook` - `token: String` Shared secret sent in the `X-Handinger-Token` header on each delivery. `null` when no webhook is configured. - `url: String` HTTPS endpoint that receives webhook deliveries when a task completes. `null` when no webhook is configured. ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") webhook = handinger.workers.webhooks.regenerate_token("t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM") puts(webhook) ``` #### Response ```json { "token": "whk_01HZY31W2SZJ8MJ2FQTR3M1K9D", "url": "https://example.com/handinger-webhook" } ``` ## List worker webhook executions `workers.webhooks.list_executions(worker_id, **kwargs) -> WebhookExecutionList` **get** `/api/workers/{workerId}/webhook/executions` List recent webhook delivery attempts for a worker, newest first, paginated 50 per page. Only the worker creator can read execution history. ### Parameters - `worker_id: String` - `page: Integer` Page number (1-indexed). Defaults to 1. ### Returns - `class WebhookExecutionList` - `logs: Array[WebhookExecution]` - `id: String` - `created_at: Time` - `duration_ms: Integer` Wall-clock time spent on the delivery attempt. - `error_message: String` Failure reason when `requestStatus` is `error`. - `request_status: :success | :error` `success` when the endpoint returned a 2xx response, `error` otherwise. - `:success` - `:error` - `response_status: Integer` HTTP status returned by the endpoint, when reachable. - `task_id: String` Task that triggered the delivery, when available. - `task_title: String` Title of the originating task, when available. - `url: String` Endpoint Handinger attempted to deliver to. - `worker_id: String` - `page: Integer` Current page number. - `page_count: Integer` Total number of pages available. - `total_count: Integer` Total number of executions recorded. ### Example ```ruby require "handinger" handinger = Handinger::Client.new(api_key: "My API Key") webhook_execution_list = handinger.workers.webhooks.list_executions("t_org_123_w_01HZY2ZJQ8G7K42W2D7WF6V4GM") puts(webhook_execution_list) ``` #### Response ```json { "logs": [ { "id": "whe_01HZY31W2SZJ8MJ2FQTR3M1K9D", "createdAt": "2019-12-27T18:11:19.117Z", "durationMs": 0, "errorMessage": "errorMessage", "requestStatus": "success", "responseStatus": 0, "taskId": "taskId", "taskTitle": "taskTitle", "url": "url", "workerId": "workerId" } ], "page": 0, "pageCount": 0, "totalCount": 0 } ``` ## Domain Types ### Update Webhook - `class UpdateWebhook` - `url: String` HTTPS endpoint Handinger should POST to when a task finishes. Pass `null` to remove the webhook and clear its token. ### Webhook - `class Webhook` - `token: String` Shared secret sent in the `X-Handinger-Token` header on each delivery. `null` when no webhook is configured. - `url: String` HTTPS endpoint that receives webhook deliveries when a task completes. `null` when no webhook is configured. ### Webhook Execution - `class WebhookExecution` - `id: String` - `created_at: Time` - `duration_ms: Integer` Wall-clock time spent on the delivery attempt. - `error_message: String` Failure reason when `requestStatus` is `error`. - `request_status: :success | :error` `success` when the endpoint returned a 2xx response, `error` otherwise. - `:success` - `:error` - `response_status: Integer` HTTP status returned by the endpoint, when reachable. - `task_id: String` Task that triggered the delivery, when available. - `task_title: String` Title of the originating task, when available. - `url: String` Endpoint Handinger attempted to deliver to. - `worker_id: String` ### Webhook Execution List - `class WebhookExecutionList` - `logs: Array[WebhookExecution]` - `id: String` - `created_at: Time` - `duration_ms: Integer` Wall-clock time spent on the delivery attempt. - `error_message: String` Failure reason when `requestStatus` is `error`. - `request_status: :success | :error` `success` when the endpoint returned a 2xx response, `error` otherwise. - `:success` - `:error` - `response_status: Integer` HTTP status returned by the endpoint, when reachable. - `task_id: String` Task that triggered the delivery, when available. - `task_title: String` Title of the originating task, when available. - `url: String` Endpoint Handinger attempted to deliver to. - `worker_id: String` - `page: Integer` Current page number. - `page_count: Integer` Total number of pages available. - `total_count: Integer` Total number of executions recorded.