---
title: "Create Job"
method: POST
path: "/v1/jobs"
tags: ["jobs"]
---

# Create Job

`POST /v1/jobs`

## Request

- Base URL: `https://api.actuato.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.actuato.com/v1/jobs`
- Auth: none declared

## Request body

- JobCreate
  - `title` string, required
  - `summary` string, nullable
  - `description_md` string, nullable
  - `structured_spec` StructuredSpec: What the worker needs to know, written for the worker.
    - `symptoms` string[]
    - `likely_cause` string, nullable
    - `tasks` string[]
    - `materials` Material[]
      - `name` string, required
      - `quantity` string, nullable
      - `provided_by` string
    - `access_instructions` string, nullable
    - `hazards` string[]
    - `success_criteria` string[]
    - `notes` string, nullable
  - `category_slug` string, required
  - `skill_slugs` string[]
  - `location` LatLng, required
    - `lat` number, required
    - `lng` number, required
  - `address` Address, required
    - `line1` string, nullable
    - `line2` string, nullable
    - `city` string, required
    - `region` string, required: State / province code, e.g. MD
    - `postal_code` string, nullable
    - `country` string
  - `address_visibility` 'exact_after_hire' | 'approximate_only' | 'exact_public'
  - `urgency` 'asap' | 'today' | 'this_week' | 'flexible' | 'scheduled'
  - `window_start` string, date-time, nullable
  - `window_end` string, date-time, nullable
  - `estimated_duration_minutes` integer, nullable
  - `budget_type` 'fixed' | 'hourly' | 'open'
  - `budget_min_cents` integer, nullable
  - `budget_max_cents` integer, nullable
  - `reimbursable_max_cents` integer, nullable: Purchase allowance: expenses up to this total (with receipts) are reimbursed without asking.
  - `required_cert_slugs` string[], nullable: Defaults to the category's required certifications.
  - `cert_enforcement` 'strict' | 'preferred'
  - `max_applicants` integer, nullable
  - `applications_close_at` string, date-time, nullable
  - `visibility` 'public' | 'invite_only'
  - `invite_worker_ids` string[]: Workers you have hired before to ask first. With visibility invite_only, only they can see and bid on the job.
  - `attachments` AttachmentIn[]
    - `file_id` string, uuid, required
    - `kind` 'photo' | 'video' | 'document'
    - `caption` string, nullable
  - `external_ref` string, nullable
  - `publish` boolean

## Response `201`

Successful Response

- union
  - JobOut: Owner / agent view: exact location and full spec.
    - `id` string, uuid, required
    - `principal_user_id` string, uuid, required
    - `posted_by_agent_id` string, uuid, nullable, required
    - `sandbox` boolean
    - `title` string, required
    - `summary` string, nullable, required
    - `description_md` string, nullable, required
    - `structured_spec` object, required
    - `spec_quality_score` integer, required
    - `category_slug` string, required
    - `skill_slugs` string[], required
    - `location` LatLng, required
      - `lat` number, required
      - `lng` number, required
    - `address` object, required
    - `address_visibility` 'exact_after_hire' | 'approximate_only' | 'exact_public', required
    - `urgency` 'asap' | 'today' | 'this_week' | 'flexible' | 'scheduled', required
    - `window_start` string, date-time, nullable, required
    - `window_end` string, date-time, nullable, required
    - `estimated_duration_minutes` integer, nullable, required
    - `budget_type` 'fixed' | 'hourly' | 'open', required
    - `budget_min_cents` integer, nullable, required
    - `budget_max_cents` integer, nullable, required
    - `reimbursable_max_cents` integer, nullable
    - `required_cert_slugs` string[], required
    - `cert_enforcement` 'strict' | 'preferred', required
    - `max_applicants` integer, nullable, required
    - `applications_close_at` string, date-time, nullable, required
    - `status` 'draft' | 'pending_approval' | 'open' | 'on_hold' | 'hired' | 'funded' | 'in_progress' | 'work_submitted' | 'completed' | 'closed' | 'disputed' | 'cancelled' | 'expired', required
    - `status_changed_at` string, date-time, nullable, required
    - `hired_contract_id` string, uuid, nullable, required
    - `visibility` 'public' | 'invite_only', required
    - `moderation_status` 'pending' | 'approved' | 'flagged' | 'rejected', required
    - `source` 'web' | 'api' | 'mcp' | 'consumer_agent', required
    - `external_ref` string, nullable, required
    - `attachments` AttachmentOut[], required
      - `id` string, uuid, required
      - `file_id` string, uuid, required
      - `kind` 'photo' | 'video' | 'document', required
      - `caption` string, nullable, required
      - `sort_order` integer, required
    - `invitations` InvitationOut[]
      - `id` string, uuid, required
      - `job_id` string, uuid, required
      - `worker_id` string, uuid, required
      - `status` 'sent' | 'viewed' | 'applied' | 'declined' | 'expired', required
      - `created_at` string, date-time, required
    - `application_count` integer, required
    - `pending_actions` string[], required
    - `published_at` string, date-time, nullable, required
    - `expires_at` string, date-time, nullable, required
    - `cancelled_reason` string, nullable, required
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
  - ApprovalPending: 202 body returned to an agent when the principal must approve first.
    - `status` string
    - `approval_request` ApprovalOut, required
      - `id` string, uuid, required
      - `principal_user_id` string, uuid, required
      - `agent_id` string, uuid, required
      - `kind` 'publish_job' | 'hire' | 'fund_escrow' | 'release_payment' | 'increase_budget' | 'cancel_job', required
      - `subject_type` string, required
      - `subject_id` string, uuid, required
      - `payload` object, required
      - `status` 'pending' | 'approved' | 'rejected' | 'expired', required
      - `expires_at` string, date-time, required
      - `decided_at` string, date-time, nullable, required
      - `decided_via` 'web' | 'magic_link' | 'push' | 'mcp_elicitation', required
      - `decision_note` string, nullable, required
      - `created_at` string, date-time, required
    - `approval_url` string, required
    - `reasons` string[], required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/actuato/apis/actuator-api.md) · [All operations](https://skmtc.dev/actuato/apis/actuator-api/llms.txt) · [OpenAPI document](https://skmtc.dev/actuato/apis/actuator-api/revisions/67a742c2308b?raw)
