openapi: 3.2.0 info: title: GPT Backend Agent Jobs API version: 0.1.0 servers: - url: https://api.usepomo.ai description: Base URL declared by the provider in apis.yml (roadmap#122). tags: - name: agent-jobs paths: /api/chat/agentic/async: post: tags: - agent-jobs summary: Start Async Job description: 'Start an async job (returns immediately with job_id). Job runs in background. Client can monitor via SSE stream or poll status. Per Issue #271 specification.' operationId: start_async_job_api_chat_agentic_async_post requestBody: content: application/json: schema: $ref: '#/components/schemas/AsyncJobRequest' required: true responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/JobResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' security: - HTTPBearer: [] /api/chat/agentic/jobs/{job_id}/stream: get: tags: - agent-jobs summary: Stream Job Progress description: "SSE endpoint for real-time job progress.\n\nStream format:\n event: started\n data: {\"job_id\": \"...\", \"job_type\": \"...\", \"timestamp\": \"...\"}\n\n event: progress\n data: {\"step\": \"...\", \"message\": \"...\", \"progress\": 0.5}\n\n event: completed\n data: {\"job_id\": \"...\", \"result\": {...}, \"duration_seconds\": 45.2}\n\n event: failed\n data: {\"job_id\": \"...\", \"error\": \"...\", \"error_type\": \"...\"}\n\nPer Issue #271 specification." operationId: stream_job_progress_api_chat_agentic_jobs__job_id__stream_get security: - HTTPBearer: [] parameters: - name: job_id in: path required: true schema: type: string title: Job Id - name: Last-Event-ID in: header required: false schema: anyOf: - type: string - type: 'null' title: Last-Event-Id responses: '200': description: Successful Response content: application/json: schema: {} '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/chat/agentic/jobs/{job_id}: get: tags: - agent-jobs summary: Get Job Status description: 'Poll job status (for clients that don''t want to use SSE). Per Issue #271 specification.' operationId: get_job_status_api_chat_agentic_jobs__job_id__get security: - HTTPBearer: [] parameters: - name: job_id in: path required: true schema: type: string title: Job Id responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/JobStatusResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/chat/agentic/jobs/{job_id}/cancel: post: tags: - agent-jobs summary: Cancel Job description: 'Cancel a running job. Returns 204 No Content on success.' operationId: cancel_job_api_chat_agentic_jobs__job_id__cancel_post security: - HTTPBearer: [] parameters: - name: job_id in: path required: true schema: type: string title: Job Id responses: '204': description: Successful Response '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' /api/chat/agentic/jobs: get: tags: - agent-jobs summary: List Jobs description: 'List user''s jobs. Filters: - status: Optional filter by job status (running, completed, failed, cancelled) - limit: Maximum number of jobs (default 100, max 1000) Returns jobs sorted by created_at descending (most recent first).' operationId: list_jobs_api_chat_agentic_jobs_get security: - HTTPBearer: [] parameters: - name: status in: query required: false schema: anyOf: - type: string - type: 'null' description: Filter by status title: Status description: Filter by status - name: limit in: query required: false schema: type: integer maximum: 1000 description: Maximum number of jobs to return default: 100 title: Limit description: Maximum number of jobs to return responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/JobListResponse' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' components: schemas: HTTPValidationError: properties: detail: items: $ref: '#/components/schemas/ValidationError' type: array title: Detail type: object title: HTTPValidationError PublicExecutionStep: properties: step_id: anyOf: - type: string maxLength: 128 pattern: ^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$ - type: 'null' title: Step Id description: Optional stable machine identity for reconciling one public step across live snapshot revisions. It is not user-visible. category: type: string maxLength: 64 minLength: 1 pattern: ^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$ title: Category code: type: string maxLength: 128 minLength: 1 pattern: ^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$ title: Code state: type: string maxLength: 64 minLength: 1 pattern: ^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$ title: State terminal: type: boolean title: Terminal title: type: string maxLength: 160 minLength: 1 title: Title detail: anyOf: - type: string maxLength: 500 minLength: 1 - type: 'null' title: Detail duration_ms: anyOf: - type: integer maximum: 9007199254740991.0 minimum: 0.0 - type: 'null' title: Duration Ms cost_micros: anyOf: - type: integer minimum: 0.0 - type: 'null' title: Cost Micros input_tokens: anyOf: - type: integer minimum: 0.0 - type: 'null' title: Input Tokens output_tokens: anyOf: - type: integer minimum: 0.0 - type: 'null' title: Output Tokens cached_input_tokens: anyOf: - type: integer minimum: 0.0 - type: 'null' title: Cached Input Tokens result_count: anyOf: - type: integer maximum: 1000000.0 minimum: 0.0 - type: 'null' title: Result Count total_count: anyOf: - type: integer maximum: 1000000.0 minimum: 0.0 - type: 'null' title: Total Count result_state: anyOf: - type: string maxLength: 64 minLength: 1 pattern: ^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$ - type: 'null' title: Result State type: object required: - category - code - state - terminal - title title: PublicExecutionStep description: 'One bounded, presentation-ready item in a public execution snapshot. The optional result fields are public operational facts, never model reasoning or raw tool arguments. They let clients explain what a step accomplished without parsing display copy.' AsyncJobRequest: properties: job_type: type: string title: Job Type description: Type of job to execute job_data: additionalProperties: true type: object title: Job Data description: Job-specific parameters organization_id: type: string format: uuid title: Organization Id description: Organization context company_profile_id: anyOf: - type: string format: uuid - type: 'null' title: Company Profile Id description: Optional company profile context type: object required: - job_type - job_data - organization_id title: AsyncJobRequest description: Request to start an async job example: company_profile_id: 123e4567-e89b-12d3-a456-426614174001 job_data: campaign_name: Summer Sale 2025 copy_prompt: 50% off all products creative_prompt: Beach vacation theme platform: facebook job_type: ad_creation organization_id: 123e4567-e89b-12d3-a456-426614174000 PublicDispositionKind: type: string enum: - answered - partial - needs_input - declined - no_answer - cancelled - failed title: PublicDispositionKind description: 'Closed customer meaning for one terminal assistant execution. Runtime lifecycle and internal stop causes remain separate. Unknown internal outcomes must be projected to ``FAILED`` with an ``unknown_terminal_outcome`` reason before crossing this public boundary.' ValidationError: properties: loc: items: anyOf: - type: string - type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type type: object required: - loc - msg - type title: ValidationError PublicExecutionSummary: properties: api_version: type: string maxLength: 64 pattern: ^pomo\.agent\.execution/v[1-9][0-9]*$ title: Api Version default: pomo.agent.execution/v1 execution_id: type: string format: uuid title: Execution Id revision: type: integer minimum: 0.0 title: Revision default: 0 state: type: string maxLength: 64 minLength: 1 pattern: ^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$ title: State terminal: type: boolean title: Terminal outcome: anyOf: - type: string maxLength: 64 minLength: 1 pattern: ^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$ - type: 'null' title: Outcome disposition: anyOf: - $ref: '#/components/schemas/PublicTerminalDisposition' - type: 'null' progress: anyOf: - type: number maximum: 1.0 minimum: 0.0 - type: 'null' title: Progress summary: anyOf: - type: string maxLength: 2000 minLength: 1 - type: 'null' title: Summary started_at: anyOf: - type: string format: date-time - type: 'null' title: Started At completed_at: anyOf: - type: string format: date-time - type: 'null' title: Completed At duration_ms: anyOf: - type: integer maximum: 9007199254740991.0 minimum: 0.0 - type: 'null' title: Duration Ms cost_micros: anyOf: - type: integer minimum: 0.0 - type: 'null' title: Cost Micros total_step_count: type: integer maximum: 1000000.0 minimum: 0.0 title: Total Step Count default: 0 omitted_step_count: type: integer maximum: 1000000.0 minimum: 0.0 title: Omitted Step Count default: 0 steps: items: $ref: '#/components/schemas/PublicExecutionStep' type: array maxItems: 40 title: Steps default: [] type: object required: - execution_id - state - terminal title: PublicExecutionSummary description: A complete public snapshot of one assistant execution. JobListResponse: properties: jobs: items: $ref: '#/components/schemas/JobListItem' type: array title: Jobs description: List of jobs total: type: integer title: Total description: Total number of jobs matching filter type: object required: - jobs - total title: JobListResponse description: Response for listing jobs example: jobs: - completed_at: '2025-01-15T10:32:15Z' created_at: '2025-01-15T10:30:00Z' job_id: 987fcdeb-51a2-43f7-9876-543210987654 status: completed type: ad_creation - created_at: '2025-01-15T10:25:00Z' job_id: 123e4567-e89b-12d3-a456-426614174002 status: running type: pdf_processing total: 2 JobListItem: properties: job_id: type: string title: Job Id type: type: string title: Type status: type: string title: Status created_at: type: string format: date-time title: Created At completed_at: anyOf: - type: string format: date-time - type: 'null' title: Completed At type: object required: - job_id - type - status - created_at title: JobListItem description: Summary info for a job in a list example: completed_at: '2025-01-15T10:32:15Z' created_at: '2025-01-15T10:30:00Z' job_id: 987fcdeb-51a2-43f7-9876-543210987654 status: completed type: ad_creation PublicTerminalDisposition: properties: schema_version: type: string const: pomo.public-disposition/v1 title: Schema Version default: pomo.public-disposition/v1 kind: $ref: '#/components/schemas/PublicDispositionKind' reason: anyOf: - type: string maxLength: 128 minLength: 1 pattern: ^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$ - type: 'null' title: Reason type: object required: - kind title: PublicTerminalDisposition description: Versioned, server-authored customer meaning for a terminal result. JobStatusResponse: properties: job_id: type: string title: Job Id description: Job identifier type: type: string title: Type description: Job type status: type: string title: Status description: 'Current status: pending, running, completed, failed, cancelled' result: anyOf: - additionalProperties: true type: object - type: 'null' title: Result description: Job result (only when completed) error: anyOf: - type: string - type: 'null' title: Error description: Error message (only when failed) progress: anyOf: - additionalProperties: true type: object - type: 'null' title: Progress description: Current progress data public_execution: anyOf: - $ref: '#/components/schemas/PublicExecutionSummary' - type: 'null' description: Bounded, engine-neutral execution summary. A higher revision replaces the complete previous snapshot. created_at: type: string format: date-time title: Created At description: Job creation timestamp started_at: anyOf: - type: string format: date-time - type: 'null' title: Started At description: Job start timestamp completed_at: anyOf: - type: string format: date-time - type: 'null' title: Completed At description: Job completion timestamp type: object required: - job_id - type - status - created_at title: JobStatusResponse description: Response for job status query example: created_at: '2025-01-15T10:30:00Z' job_id: 987fcdeb-51a2-43f7-9876-543210987654 progress: message: Generating ad creative... progress: 0.25 step: generate_creative started_at: '2025-01-15T10:30:01Z' status: running type: ad_creation JobResponse: properties: job_id: type: string title: Job Id description: Unique job identifier status: type: string title: Status description: Initial job status (typically 'running') stream_url: type: string title: Stream Url description: SSE endpoint for real-time progress poll_url: type: string title: Poll Url description: HTTP endpoint for polling status type: object required: - job_id - status - stream_url - poll_url title: JobResponse description: Response after submitting a job example: job_id: 987fcdeb-51a2-43f7-9876-543210987654 poll_url: /api/chat/agentic/jobs/987fcdeb-51a2-43f7-9876-543210987654 status: running stream_url: /api/chat/agentic/jobs/987fcdeb-51a2-43f7-9876-543210987654/stream securitySchemes: HTTPBearer: type: http scheme: bearer