{"openapi": "3.1.0", "info": {"title": "Cronbolt Public API", "version": "1.0.0", "description": "Create and operate HTTP schedules with a project-scoped API key. Send the key in the X-API-Key header."}, "paths": {"/api/v1/context": {"get": {"operationId": "get_agent_context", "summary": "Check API key access and limits", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AgentContextOut"}}}}}, "tags": ["agent"], "security": [{"ProjectApiKeyAuth": []}]}}, "/api/v1/jobs": {"get": {"operationId": "list_jobs", "summary": "List jobs", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/HttpJobOut"}, "title": "Response", "type": "array"}}}}}, "tags": ["jobs"], "security": [{"ProjectApiKeyAuth": []}]}, "post": {"operationId": "create_job", "summary": "Create a job", "parameters": [{"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "minLength": 1, "maxLength": 128}}], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HttpJobOut"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HttpJobCreateIn"}}}, "required": true}, "security": [{"ProjectApiKeyAuth": []}]}}, "/api/v1/jobs/preview": {"post": {"operationId": "preview_schedule", "summary": "Preview a recurring schedule", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SchedulePreviewOut"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SchedulePreviewIn"}}}, "required": true}, "security": [{"ProjectApiKeyAuth": []}]}}, "/api/v1/jobs/{job_id}": {"get": {"operationId": "get_job", "summary": "Get a job", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HttpJobOut"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "security": [{"ProjectApiKeyAuth": []}]}, "patch": {"operationId": "update_job", "summary": "Update a job", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HttpJobOut"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HttpJobPatchIn"}}}, "required": true}, "security": [{"ProjectApiKeyAuth": []}]}, "delete": {"operationId": "delete_job", "summary": "Delete a job", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "integer"}, "required": true}], "responses": {"204": {"description": "No Content"}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "security": [{"ProjectApiKeyAuth": []}]}}, "/api/v1/jobs/{job_id}/runs": {"get": {"operationId": "list_job_runs", "summary": "List job runs", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "integer"}, "required": true}, {"in": "query", "name": "limit", "schema": {"default": 25, "title": "Limit", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/JobRunOut"}, "title": "Response", "type": "array"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "422": {"description": "Unprocessable Content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "security": [{"ProjectApiKeyAuth": []}]}}, "/api/v1/jobs/{job_id}/runs/{run_id}": {"get": {"operationId": "get_job_run", "summary": "Get a job run", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "integer"}, "required": true}, {"in": "path", "name": "run_id", "schema": {"title": "Run Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JobRunDetailOut"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "security": [{"ProjectApiKeyAuth": []}]}}, "/api/v1/jobs/{job_id}/runs/{run_id}/retry": {"post": {"operationId": "retry_job_run", "summary": "Retry a failed run", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "integer"}, "required": true}, {"in": "path", "name": "run_id", "schema": {"title": "Run Id", "type": "integer"}, "required": true}, {"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "minLength": 1, "maxLength": 128}}], "responses": {"202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JobRunOut"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "security": [{"ProjectApiKeyAuth": []}]}}, "/api/v1/jobs/{job_id}/pause": {"post": {"operationId": "pause_job", "summary": "Pause a recurring job", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HttpJobOut"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "security": [{"ProjectApiKeyAuth": []}]}}, "/api/v1/jobs/{job_id}/resume": {"post": {"operationId": "resume_job", "summary": "Resume a recurring job", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "integer"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HttpJobOut"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "security": [{"ProjectApiKeyAuth": []}]}}, "/api/v1/jobs/{job_id}/run-now": {"post": {"operationId": "run_job_now", "summary": "Queue an immediate run", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "integer"}, "required": true}, {"name": "Idempotency-Key", "in": "header", "required": true, "schema": {"type": "string", "minLength": 1, "maxLength": 128}}], "responses": {"202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JobRunOut"}}}}, "400": {"description": "Bad Request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "404": {"description": "Not Found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "409": {"description": "Conflict", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}, "429": {"description": "Too Many Requests", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorResponse"}}}}}, "tags": ["jobs"], "security": [{"ProjectApiKeyAuth": []}]}}}, "components": {"schemas": {"AgentContextOut": {"properties": {"api_version": {"title": "Api Version", "type": "string"}, "project": {"$ref": "#/components/schemas/AgentProjectOut"}, "plan": {"$ref": "#/components/schemas/AgentPlanOut"}, "docs_url": {"title": "Docs Url", "type": "string"}, "mcp_url": {"title": "Mcp Url", "type": "string"}, "openapi_url": {"title": "Openapi Url", "type": "string"}}, "required": ["api_version", "project", "plan", "docs_url", "mcp_url", "openapi_url"], "title": "AgentContextOut", "type": "object"}, "AgentPlanOut": {"properties": {"name": {"title": "Name", "type": "string"}, "active_jobs": {"title": "Active Jobs", "type": "integer"}, "active_job_limit": {"title": "Active Job Limit", "type": "integer"}, "pending_one_time_requests": {"title": "Pending One Time Requests", "type": "integer"}, "one_time_request_limit": {"title": "One Time Request Limit", "type": "integer"}, "can_create_one_time_request": {"title": "Can Create One Time Request", "type": "boolean"}, "project_count": {"title": "Project Count", "type": "integer"}, "project_limit": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Project Limit"}, "can_create_project": {"title": "Can Create Project", "type": "boolean"}, "minimum_interval_seconds": {"title": "Minimum Interval Seconds", "type": "integer"}, "stored_job_limit": {"title": "Stored Job Limit", "type": "integer"}, "api_key_limit": {"title": "Api Key Limit", "type": "integer"}}, "required": ["name", "active_jobs", "active_job_limit", "pending_one_time_requests", "one_time_request_limit", "can_create_one_time_request", "project_count", "project_limit", "can_create_project", "minimum_interval_seconds", "stored_job_limit", "api_key_limit"], "title": "AgentPlanOut", "type": "object"}, "AgentProjectOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "name": {"title": "Name", "type": "string"}}, "required": ["id", "name"], "title": "AgentProjectOut", "type": "object"}, "HttpJobOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "project_id": {"title": "Project Id", "type": "integer"}, "name": {"title": "Name", "type": "string"}, "state": {"title": "State", "type": "string"}, "active": {"title": "Active", "type": "boolean"}, "schedule_type": {"enum": ["recurring", "one_time"], "title": "Schedule Type", "type": "string"}, "cron_expression": {"title": "Cron Expression", "type": "string"}, "run_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Run At"}, "timezone": {"title": "Timezone", "type": "string"}, "method": {"title": "Method", "type": "string"}, "url": {"title": "Url", "type": "string"}, "timeout_seconds": {"title": "Timeout Seconds", "type": "integer"}, "max_retries": {"title": "Max Retries", "type": "integer"}, "retry_backoff_seconds": {"title": "Retry Backoff Seconds", "type": "integer"}, "expected_status_min": {"title": "Expected Status Min", "type": "integer"}, "expected_status_max": {"title": "Expected Status Max", "type": "integer"}, "response_contains": {"title": "Response Contains", "type": "string"}, "alert_webhook_url": {"title": "Alert Webhook Url", "type": "string"}, "next_run_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Next Run At"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "updated_at": {"format": "date-time", "title": "Updated At", "type": "string"}, "has_headers": {"title": "Has Headers", "type": "boolean"}, "has_body": {"title": "Has Body", "type": "boolean"}}, "required": ["id", "project_id", "name", "state", "active", "schedule_type", "cron_expression", "run_at", "timezone", "method", "url", "timeout_seconds", "max_retries", "retry_backoff_seconds", "expected_status_min", "expected_status_max", "response_contains", "alert_webhook_url", "next_run_at", "created_at", "updated_at", "has_headers", "has_body"], "title": "HttpJobOut", "type": "object"}, "ErrorField": {"properties": {"field": {"title": "Field", "type": "string"}, "message": {"title": "Message", "type": "string"}, "type": {"title": "Type", "type": "string"}}, "required": ["field", "message", "type"], "title": "ErrorField", "type": "object"}, "ErrorResponse": {"properties": {"code": {"title": "Code", "type": "string"}, "message": {"title": "Message", "type": "string"}, "request_id": {"title": "Request Id", "type": "string"}, "action_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Action Url"}, "retry_after_seconds": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Retry After Seconds"}, "errors": {"anyOf": [{"items": {"$ref": "#/components/schemas/ErrorField"}, "type": "array"}, {"type": "null"}], "title": "Errors"}}, "required": ["code", "message", "request_id"], "title": "ErrorResponse", "type": "object"}, "HttpJobCreateIn": {"discriminator": {"mapping": {"one_time": "#/components/schemas/OneTimeHttpJobCreateIn", "recurring": "#/components/schemas/RecurringHttpJobCreateIn"}, "propertyName": "schedule_type"}, "oneOf": [{"$ref": "#/components/schemas/RecurringHttpJobCreateIn"}, {"$ref": "#/components/schemas/OneTimeHttpJobCreateIn"}]}, "HttpMethod": {"enum": ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"], "type": "string"}, "OneTimeHttpJobCreateIn": {"additionalProperties": false, "properties": {"name": {"anyOf": [{"maxLength": 120, "minLength": 1, "type": "string"}, {"type": "null"}], "description": "Optional label. Cronbolt derives one from the callback hostname when omitted.", "title": "Name"}, "timezone": {"default": "UTC", "maxLength": 64, "minLength": 1, "title": "Timezone", "type": "string"}, "method": {"allOf": [{"$ref": "#/components/schemas/HttpMethod"}], "default": "GET"}, "url": {"description": "A publicly reachable HTTP or HTTPS callback URL.", "examples": ["https://example.com/webhooks/cronbolt"], "maxLength": 2048, "minLength": 1, "title": "Url", "type": "string"}, "headers": {"additionalProperties": {"type": "string"}, "title": "Headers", "type": "object"}, "body": {"anyOf": [{"maxLength": 65536, "type": "string"}, {"type": "null"}], "title": "Body"}, "timeout_seconds": {"default": 30, "maximum": 120, "minimum": 1, "title": "Timeout Seconds", "type": "integer"}, "max_retries": {"default": 2, "maximum": 5, "minimum": 0, "title": "Max Retries", "type": "integer"}, "retry_backoff_seconds": {"default": 30, "maximum": 3600, "minimum": 0, "title": "Retry Backoff Seconds", "type": "integer"}, "expected_status_min": {"default": 200, "maximum": 599, "minimum": 100, "title": "Expected Status Min", "type": "integer"}, "expected_status_max": {"default": 299, "maximum": 599, "minimum": 100, "title": "Expected Status Max", "type": "integer"}, "response_contains": {"default": "", "maxLength": 500, "title": "Response Contains", "type": "string"}, "alert_webhook_url": {"default": "", "maxLength": 2048, "title": "Alert Webhook Url", "type": "string"}, "schedule_type": {"const": "one_time", "title": "Schedule Type", "type": "string"}, "run_at": {"description": "Future date and time for a one-time request. A value without an offset is interpreted in timezone.", "examples": ["2035-01-01T09:00:00"], "format": "date-time", "title": "Run At", "type": "string"}}, "required": ["url", "schedule_type", "run_at"], "title": "OneTimeHttpJobCreateIn", "type": "object"}, "RecurringHttpJobCreateIn": {"additionalProperties": false, "properties": {"name": {"anyOf": [{"maxLength": 120, "minLength": 1, "type": "string"}, {"type": "null"}], "description": "Optional label. Cronbolt derives one from the callback hostname when omitted.", "title": "Name"}, "timezone": {"default": "UTC", "maxLength": 64, "minLength": 1, "title": "Timezone", "type": "string"}, "method": {"allOf": [{"$ref": "#/components/schemas/HttpMethod"}], "default": "GET"}, "url": {"description": "A publicly reachable HTTP or HTTPS callback URL.", "examples": ["https://example.com/webhooks/cronbolt"], "maxLength": 2048, "minLength": 1, "title": "Url", "type": "string"}, "headers": {"additionalProperties": {"type": "string"}, "title": "Headers", "type": "object"}, "body": {"anyOf": [{"maxLength": 65536, "type": "string"}, {"type": "null"}], "title": "Body"}, "timeout_seconds": {"default": 30, "maximum": 120, "minimum": 1, "title": "Timeout Seconds", "type": "integer"}, "max_retries": {"default": 2, "maximum": 5, "minimum": 0, "title": "Max Retries", "type": "integer"}, "retry_backoff_seconds": {"default": 30, "maximum": 3600, "minimum": 0, "title": "Retry Backoff Seconds", "type": "integer"}, "expected_status_min": {"default": 200, "maximum": 599, "minimum": 100, "title": "Expected Status Min", "type": "integer"}, "expected_status_max": {"default": 299, "maximum": 599, "minimum": 100, "title": "Expected Status Max", "type": "integer"}, "response_contains": {"default": "", "maxLength": 500, "title": "Response Contains", "type": "string"}, "alert_webhook_url": {"default": "", "maxLength": 2048, "title": "Alert Webhook Url", "type": "string"}, "active": {"default": true, "title": "Active", "type": "boolean"}, "schedule_type": {"const": "recurring", "title": "Schedule Type", "type": "string"}, "cron_expression": {"description": "A standard five-field cron expression.", "examples": ["*/15 * * * *"], "maxLength": 120, "minLength": 1, "title": "Cron Expression", "type": "string"}}, "required": ["url", "schedule_type", "cron_expression"], "title": "RecurringHttpJobCreateIn", "type": "object"}, "SchedulePreviewOut": {"properties": {"next_run_at": {"format": "date-time", "title": "Next Run At", "type": "string"}}, "required": ["next_run_at"], "title": "SchedulePreviewOut", "type": "object"}, "SchedulePreviewIn": {"additionalProperties": false, "properties": {"cron_expression": {"description": "A standard five-field cron expression.", "examples": ["*/15 * * * *"], "maxLength": 120, "minLength": 1, "title": "Cron Expression", "type": "string"}, "timezone": {"default": "UTC", "description": "An IANA timezone name.", "examples": ["UTC"], "maxLength": 64, "minLength": 1, "title": "Timezone", "type": "string"}}, "required": ["cron_expression"], "title": "SchedulePreviewIn", "type": "object"}, "HttpJobPatchIn": {"properties": {"name": {"anyOf": [{"maxLength": 120, "minLength": 1, "type": "string"}, {"type": "null"}], "title": "Name"}, "active": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Active"}, "cron_expression": {"anyOf": [{"maxLength": 120, "minLength": 1, "type": "string"}, {"type": "null"}], "title": "Cron Expression"}, "run_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Run At"}, "timezone": {"anyOf": [{"maxLength": 64, "minLength": 1, "type": "string"}, {"type": "null"}], "title": "Timezone"}, "method": {"anyOf": [{"$ref": "#/components/schemas/HttpMethod"}, {"type": "null"}]}, "url": {"anyOf": [{"maxLength": 2048, "minLength": 1, "type": "string"}, {"type": "null"}], "title": "Url"}, "headers": {"anyOf": [{"additionalProperties": {"type": "string"}, "type": "object"}, {"type": "null"}], "title": "Headers"}, "body": {"anyOf": [{"maxLength": 65536, "type": "string"}, {"type": "null"}], "title": "Body"}, "timeout_seconds": {"anyOf": [{"maximum": 120, "minimum": 1, "type": "integer"}, {"type": "null"}], "title": "Timeout Seconds"}, "max_retries": {"anyOf": [{"maximum": 5, "minimum": 0, "type": "integer"}, {"type": "null"}], "title": "Max Retries"}, "retry_backoff_seconds": {"anyOf": [{"maximum": 3600, "minimum": 0, "type": "integer"}, {"type": "null"}], "title": "Retry Backoff Seconds"}, "expected_status_min": {"anyOf": [{"maximum": 599, "minimum": 100, "type": "integer"}, {"type": "null"}], "title": "Expected Status Min"}, "expected_status_max": {"anyOf": [{"maximum": 599, "minimum": 100, "type": "integer"}, {"type": "null"}], "title": "Expected Status Max"}, "response_contains": {"anyOf": [{"maxLength": 500, "type": "string"}, {"type": "null"}], "title": "Response Contains"}, "alert_webhook_url": {"anyOf": [{"maxLength": 2048, "type": "string"}, {"type": "null"}], "title": "Alert Webhook Url"}}, "title": "HttpJobPatchIn", "type": "object"}, "JobRunOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "project_id": {"title": "Project Id", "type": "integer"}, "job_id": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Job Id"}, "status": {"title": "Status", "type": "string"}, "trigger": {"title": "Trigger", "type": "string"}, "scheduled_for": {"format": "date-time", "title": "Scheduled For", "type": "string"}, "snapshot_method": {"title": "Snapshot Method", "type": "string"}, "attempt_count": {"title": "Attempt Count", "type": "integer"}, "next_attempt_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Next Attempt At"}, "finished_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Finished At"}, "coalesced_missed_count": {"title": "Coalesced Missed Count", "type": "integer"}, "coalesced_window_ends_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Coalesced Window Ends At"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "updated_at": {"format": "date-time", "title": "Updated At", "type": "string"}}, "required": ["id", "project_id", "job_id", "status", "trigger", "scheduled_for", "snapshot_method", "attempt_count", "next_attempt_at", "finished_at", "coalesced_missed_count", "coalesced_window_ends_at", "created_at", "updated_at"], "title": "JobRunOut", "type": "object"}, "JobAttemptOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "attempt_number": {"title": "Attempt Number", "type": "integer"}, "status": {"title": "Status", "type": "string"}, "started_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Started At"}, "finished_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Finished At"}, "status_code": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Status Code"}, "error_code": {"title": "Error Code", "type": "string"}, "duration_ms": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Duration Ms"}, "response_content_type": {"title": "Response Content Type", "type": "string"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}}, "required": ["id", "attempt_number", "status", "started_at", "finished_at", "status_code", "error_code", "duration_ms", "response_content_type", "created_at"], "title": "JobAttemptOut", "type": "object"}, "JobRunDetailOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "project_id": {"title": "Project Id", "type": "integer"}, "job_id": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Job Id"}, "status": {"title": "Status", "type": "string"}, "trigger": {"title": "Trigger", "type": "string"}, "scheduled_for": {"format": "date-time", "title": "Scheduled For", "type": "string"}, "snapshot_method": {"title": "Snapshot Method", "type": "string"}, "attempt_count": {"title": "Attempt Count", "type": "integer"}, "next_attempt_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Next Attempt At"}, "finished_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Finished At"}, "coalesced_missed_count": {"title": "Coalesced Missed Count", "type": "integer"}, "coalesced_window_ends_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Coalesced Window Ends At"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "updated_at": {"format": "date-time", "title": "Updated At", "type": "string"}, "attempts": {"items": {"$ref": "#/components/schemas/JobAttemptOut"}, "title": "Attempts", "type": "array"}}, "required": ["id", "project_id", "job_id", "status", "trigger", "scheduled_for", "snapshot_method", "attempt_count", "next_attempt_at", "finished_at", "coalesced_missed_count", "coalesced_window_ends_at", "created_at", "updated_at", "attempts"], "title": "JobRunDetailOut", "type": "object"}}, "securitySchemes": {"ProjectApiKeyAuth": {"type": "apiKey", "in": "header", "name": "X-API-Key"}}}, "servers": []}