openapi: 3.2.0 info: title: Toksta Public Jobs API description: Public API for Toksta creator data, analysis jobs, and SaaS workspace workflows. version: 0.1.0 servers: - url: https://api.toksta.com tags: - name: Jobs paths: /v1/jobs/{id}: get: operationId: getJobStatus summary: Get job status tags: - Jobs description: 'Get the status of a creator-discovery job. The `{id}` path parameter must be a **plain UUID** (no prefix). NOTE: content-fit / audience-fit / enrichment jobs are NOT retrievable here — use their dedicated results endpoints.' parameters: - schema: type: string in: path name: id required: true description: Job UUID (plain, unprefixed). security: - bearerAuth: [] responses: '200': description: Job status. `status` is one of queued, running, succeeded, failed, canceled, expired. content: application/json: schema: type: object description: Job status. `status` is one of queued, running, succeeded, failed, canceled, expired. required: - success - data - meta properties: success: type: boolean enum: - true data: type: object additionalProperties: true description: Operation payload. See the example for the exact field structure. meta: type: object additionalProperties: true required: - request_id properties: request_id: type: string trace_id: type: string example: success: true data: job: id: 56232ac2-8068-4dcb-9d1a-1f2e3a4b5c6d job_type: creator_discovery status: succeeded source_status: completed is_terminal: true progress: total_items: 120 completed_items: 120 approved_items: 38 failed_items: 82 campaign_id: null platform: linkedin created_list_id: null created_at: '2026-05-28T09:00:00Z' updated_at: '2026-05-28T09:06:00Z' completed_at: '2026-05-28T09:06:00Z' result_expires_at: '2026-06-27T09:06:00Z' result_retention_days: 30 error_message: null meta: request_id: req_01HXYZ... trace_id: 4f1d...c2 '400': description: Bad request or validation error (`BAD_REQUEST` / `VALIDATION_ERROR`). content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Bad request or validation error (`BAD_REQUEST` / `VALIDATION_ERROR`). '401': description: Missing, invalid, or revoked API key. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Missing, invalid, or revoked API key. '402': description: Insufficient credits for this operation. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Insufficient credits for this operation. '403': description: API access disabled or workspace entitlement required. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: API access disabled or workspace entitlement required. '404': description: Resource not found, or result expired past retention. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Resource not found, or result expired past retention. '429': description: Rate limit exceeded — back off per `Retry-After`. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Rate limit exceeded — back off per `Retry-After`. '500': description: Unexpected server error. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Unexpected server error. '501': description: Endpoint is registered but not implemented yet. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Endpoint is registered but not implemented yet. /v1/jobs/results: post: operationId: getJobResults summary: Get one job result tags: - Jobs description: Fetch the full result of one creator-discovery job. `job_id` must be a **plain UUID** (not prefixed). Use `limit` (alias `results_limit`, max 200) to cap the number of candidate rows returned. requestBody: required: true content: application/json: schema: type: object additionalProperties: true required: - job_id properties: job_id: type: string description: Discovery job UUID (plain, unprefixed). REQUIRED. limit: type: integer minimum: 1 maximum: 200 description: 'Max candidate rows (1-200). Defaults to 50. Alias: results_limit.' example: job_id: 56232ac2-8068-4dcb-9d1a-1f2e3a4b5c6d limit: 50 security: - bearerAuth: [] responses: '200': description: Single discovery job result with candidate rows. content: application/json: schema: type: object description: Single discovery job result with candidate rows. required: - success - data - meta properties: success: type: boolean enum: - true data: type: object additionalProperties: true description: Operation payload. See the example for the exact field structure. meta: type: object additionalProperties: true required: - request_id properties: request_id: type: string trace_id: type: string example: success: true data: job: job_id: 56232ac2-8068-4dcb-9d1a-1f2e3a4b5c6d job_type: creator_discovery status: succeeded source_status: completed is_terminal: true progress: total_items: 120 completed_items: 120 approved_items: 38 failed_items: 82 platform: linkedin campaign_id: null created_list_id: null result_expires_at: '2026-06-27T09:06:00Z' result_retention_days: 30 results_truncated: false result_count: 1 results: - creator_id: f0e1d2c3-b4a5-4678-9abc-def012345678 creator_name: Jane Marketer status: approved search_rank: 1 relevance_score: 0.92 relevance_reasoning: Strong topical match. processed_at: '2026-05-28T09:05:00Z' meta: request_id: req_01HXYZ... trace_id: 4f1d...c2 '400': description: Bad request or validation error (`BAD_REQUEST` / `VALIDATION_ERROR`). content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Bad request or validation error (`BAD_REQUEST` / `VALIDATION_ERROR`). '401': description: Missing, invalid, or revoked API key. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Missing, invalid, or revoked API key. '402': description: Insufficient credits for this operation. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Insufficient credits for this operation. '403': description: API access disabled or workspace entitlement required. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: API access disabled or workspace entitlement required. '404': description: Resource not found, or result expired past retention. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Resource not found, or result expired past retention. '429': description: Rate limit exceeded — back off per `Retry-After`. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Rate limit exceeded — back off per `Retry-After`. '500': description: Unexpected server error. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Unexpected server error. '501': description: Endpoint is registered but not implemented yet. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Endpoint is registered but not implemented yet. /v1/jobs/results{bulk}: post: operationId: getBulkJobResults summary: Get multiple job results tags: - Jobs description: 'Fetch results for multiple creator-discovery jobs in one call. **URL:** `POST /v1/jobs/results:bulk` (note the `:bulk` action suffix). Body requires `job_ids`: an array of 1-20 **plain UUIDs** (not prefixed). Each entry in the response carries `found` plus the job result or a per-job error.' requestBody: required: true content: application/json: schema: type: object additionalProperties: true required: - job_ids properties: job_ids: type: array items: type: string description: UUID v4 string. minItems: 1 maxItems: 20 description: 1-20 discovery job UUIDs (plain, unprefixed). REQUIRED. limit: type: integer minimum: 1 maximum: 200 description: 'Max candidate rows per job (1-200). Defaults to 50. Alias: results_limit.' example: job_ids: - 56232ac2-8068-4dcb-9d1a-1f2e3a4b5c6d - 7a8b9c0d-1e2f-4a3b-8c9d-0e1f2a3b4c5d limit: 25 security: - bearerAuth: [] parameters: - schema: type: string in: path name: bulk required: true responses: '200': description: Bulk job results. `meta` includes requested_count, found_count, not_found_count. content: application/json: schema: type: object description: Bulk job results. `meta` includes requested_count, found_count, not_found_count. required: - success - data - meta properties: success: type: boolean enum: - true data: type: object additionalProperties: true description: Operation payload. See the example for the exact field structure. meta: type: object additionalProperties: true required: - request_id properties: request_id: type: string trace_id: type: string example: success: true data: jobs: - found: true job_id: 56232ac2-8068-4dcb-9d1a-1f2e3a4b5c6d job_type: creator_discovery status: succeeded progress: total_items: 120 completed_items: 120 approved_items: 38 failed_items: 82 result_count: 38 results: [] - job_id: 7a8b9c0d-1e2f-4a3b-8c9d-0e1f2a3b4c5d found: false meta: request_id: req_01HXYZ... trace_id: 4f1d...c2 '400': description: Bad request or validation error (`BAD_REQUEST` / `VALIDATION_ERROR`). content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Bad request or validation error (`BAD_REQUEST` / `VALIDATION_ERROR`). '401': description: Missing, invalid, or revoked API key. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Missing, invalid, or revoked API key. '402': description: Insufficient credits for this operation. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Insufficient credits for this operation. '403': description: API access disabled or workspace entitlement required. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: API access disabled or workspace entitlement required. '404': description: Resource not found, or result expired past retention. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Resource not found, or result expired past retention. '429': description: Rate limit exceeded — back off per `Retry-After`. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Rate limit exceeded — back off per `Retry-After`. '500': description: Unexpected server error. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Unexpected server error. '501': description: Endpoint is registered but not implemented yet. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Endpoint is registered but not implemented yet. /v1/jobs/{id}/cancel: post: operationId: cancelJob summary: Cancel a running job tags: - Jobs description: 'Cancel a running creator-discovery job. The `{id}` path parameter must be a **plain UUID**. A JSON body is required even when empty — send `{}` (sending no body returns `400 Request body must be valid JSON`). Already-terminal jobs return `canceled: false` with a `reason`.' requestBody: required: true content: application/json: schema: type: object additionalProperties: true description: Empty object `{}` is valid. properties: {} example: {} description: Empty object `{}` is valid. parameters: - schema: type: string in: path name: id required: true description: Job UUID (plain, unprefixed). security: - bearerAuth: [] responses: '200': description: Cancellation result. content: application/json: schema: type: object description: Cancellation result. required: - success - data - meta properties: success: type: boolean enum: - true data: type: object additionalProperties: true description: Operation payload. See the example for the exact field structure. meta: type: object additionalProperties: true required: - request_id properties: request_id: type: string trace_id: type: string example: success: true data: job: id: 56232ac2-8068-4dcb-9d1a-1f2e3a4b5c6d status: canceled source_status: cancelled canceled: true reason: cancel_applied progress: total_items: 120 completed_items: 40 approved_items: 12 failed_items: 28 created_at: '2026-05-28T09:00:00Z' updated_at: '2026-05-28T09:03:00Z' completed_at: '2026-05-28T09:03:00Z' result_expires_at: '2026-06-27T09:03:00Z' result_retention_days: 30 error_message: Canceled via public API. meta: request_id: req_01HXYZ... trace_id: 4f1d...c2 '400': description: Bad request or validation error (`BAD_REQUEST` / `VALIDATION_ERROR`). content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Bad request or validation error (`BAD_REQUEST` / `VALIDATION_ERROR`). '401': description: Missing, invalid, or revoked API key. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Missing, invalid, or revoked API key. '402': description: Insufficient credits for this operation. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Insufficient credits for this operation. '403': description: API access disabled or workspace entitlement required. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: API access disabled or workspace entitlement required. '404': description: Resource not found, or result expired past retention. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Resource not found, or result expired past retention. '429': description: Rate limit exceeded — back off per `Retry-After`. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Rate limit exceeded — back off per `Retry-After`. '500': description: Unexpected server error. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Unexpected server error. '501': description: Endpoint is registered but not implemented yet. content: application/json: schema: type: object required: - success - error - meta properties: success: type: boolean enum: - false error: type: object required: - code - message properties: code: type: string message: type: string details: type: object additionalProperties: true meta: type: object required: - request_id properties: request_id: type: string trace_id: type: string description: Endpoint is registered but not implemented yet. components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: API key