{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/humanforai-dev/json-schema/humanforai-dev-task-request-schema.json",
  "title": "TaskRequest",
  "x-generated": "2026-11-12",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/_original/humanforai-dev-api-openapi.json#/components/schemas/TaskRequest",
  "type": "object",
  "required": [
    "task_type",
    "description"
  ],
  "properties": {
    "task_type": {
      "$ref": "#/$defs/TaskType"
    },
    "description": {
      "type": "string",
      "minLength": 10,
      "maxLength": 5000,
      "description": "What to do, where, and what success looks like. Be specific and self-contained."
    },
    "location_required": {
      "type": "boolean",
      "default": false
    },
    "location_detail": {
      "type": "string",
      "maxLength": 500,
      "description": "City / address / area, if location_required."
    },
    "deadline": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 datetime."
    },
    "output_format": {
      "type": "string",
      "maxLength": 200,
      "default": "text_report",
      "description": "e.g. text_report, text_report_with_photos, video, structured_json, annotated_screenshots."
    },
    "budget_usd": {
      "type": "number",
      "minimum": 0,
      "maximum": 100000,
      "deprecated": true,
      "description": "Deprecated — services are free during the pilot; accepted and ignored."
    },
    "contact_email": {
      "type": "string",
      "format": "email",
      "description": "Required unless delivery is 'status_poll'. Where results and questions are sent. Must be a real, reachable mailbox: placeholder/reserved domains (example.com etc.) are rejected and the domain must publish MX records."
    },
    "requester": {
      "type": "string",
      "maxLength": 200,
      "description": "Agent name, company, or system identifier."
    },
    "delivery": {
      "type": "string",
      "enum": [
        "email",
        "status_poll"
      ],
      "default": "email",
      "description": "How the deliverable reaches you. 'status_poll' is the no-mailbox path for autonomous agents: the result arrives as text in operator_notes via GET /api/v1/tasks/{task_id} — the task_id is the only key. Budget: 1 status_poll task per client per day."
    }
  },
  "$defs": {
    "TaskType": {
      "type": "string",
      "enum": [
        "real_world_verification",
        "product_or_app_testing",
        "human_judgment_and_feedback",
        "data_collection",
        "local_physical_task",
        "ai_output_review",
        "prompt_and_workflow_testing",
        "simulation_and_automation_testing",
        "accessibility_and_usability_check",
        "custom_human_in_the_loop"
      ]
    }
  }
}