{
  "openapi": "3.1.0",
  "info": {
    "title": "NoCodeJobs Public Agent Test API",
    "summary": "Static documentation for public NoCodeJobs feeds and the experimental application submission endpoint.",
    "description": "This static OpenAPI document describes the public JSON feeds and the experimental /api/apply endpoint used by the visible NoCodeJobs application form. Browser agents should usually use the visible form unless intentionally testing direct API submission with human permission. This is documentation only and does not introduce API keys, auth, MCP, new endpoints, or a developer portal.",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://nocodejobs.org",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Feeds",
      "description": "Public read-only JSON feeds."
    },
    {
      "name": "Applications",
      "description": "Experimental application submission endpoint for the current visible application form."
    }
  ],
  "paths": {
    "/jobs.json": {
      "get": {
        "tags": ["Feeds"],
        "summary": "Get all public jobs",
        "description": "Returns a public feed containing normal open-position listings and agentic job listings.",
        "operationId": "getJobsJson",
        "responses": {
          "200": {
            "description": "Public jobs feed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobsFeed"
                }
              }
            }
          }
        }
      }
    },
    "/agentic-jobs.json": {
      "get": {
        "tags": ["Feeds"],
        "summary": "Get agentic job test listings",
        "description": "Returns a focused feed of public NoCodeJobs agentic developer listings for AI agent builders, no-code automation specialists, MCP integration builders, workflow operators, and browser-agent application tests.",
        "operationId": "getAgenticJobsJson",
        "responses": {
          "200": {
            "description": "Public agentic jobs feed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AgenticJobsFeed"
                }
              }
            }
          }
        }
      }
    },
    "/api/apply": {
      "post": {
        "tags": ["Applications"],
        "summary": "Submit an experimental job application",
        "description": "Experimental endpoint used by the visible agentic job application form. Browser agents should usually use the visible same-origin form unless intentionally testing direct API submission with human permission. Recipient emails are controlled server-side. Direct API tests may need a same-origin Origin header. Do not submit fake real-person applications.",
        "operationId": "submitApplication",
        "x-experimental": true,
        "parameters": [
          {
            "name": "X-Submission-Source",
            "in": "header",
            "required": false,
            "description": "Optional informational source label for agent or API tests, for example agent-api. This is not authentication and is not trusted for security.",
            "schema": {
              "type": "string",
              "maxLength": 240,
              "examples": ["agent-api"]
            }
          },
          {
            "name": "X-Agent-Name",
            "in": "header",
            "required": false,
            "description": "Optional informational name of the browser agent or assistant. This is logged as declared metadata only.",
            "schema": {
              "type": "string",
              "maxLength": 240
            }
          },
          {
            "name": "X-Agent-Intent",
            "in": "header",
            "required": false,
            "description": "Optional short description of the agent's intended action. This is logged as declared metadata only.",
            "schema": {
              "type": "string",
              "maxLength": 240
            }
          },
          {
            "name": "X-Human-Authorized",
            "in": "header",
            "required": false,
            "description": "Optional human-authorization signal supplied by the client, for example yes. This is informational only and does not replace the required humanConsent form field.",
            "schema": {
              "type": "string",
              "maxLength": 240,
              "examples": ["yes"]
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationForm"
              },
              "encoding": {
                "resume": {
                  "contentType": "application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, text/plain"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Application accepted by the endpoint. Abuse-filtered submissions may also receive quiet success without email delivery.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ApplicationSuccess"
                    },
                    {
                      "$ref": "#/components/schemas/ApplicationReceived"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Validation error, such as missing resume or unsupported resume file type.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationError"
                }
              }
            }
          },
          "403": {
            "description": "Cross-site POST protection may reject requests before the route handler when the request is missing a same-origin Origin header or comes from a disallowed origin.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string",
                  "examples": ["Cross-site POST form submissions are forbidden"]
                }
              }
            }
          },
          "413": {
            "description": "Resume file is too large. Maximum accepted file size is 5MB.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationError"
                }
              }
            }
          },
          "429": {
            "description": "Rate limited by Cloudflare or future server-side rate limiting. Response body may be JSON or an edge-generated challenge/block response.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationError"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "description": "Server error, such as an email delivery failure or missing server-side recipient configuration.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationError"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "JobsFeed": {
        "type": "object",
        "required": ["site", "feedType", "updatedAt", "browseJobsUrl", "postJobUrl", "agenticJobsUrl", "jobs"],
        "properties": {
          "site": {
            "type": "string",
            "examples": ["NoCodeJobs.org"]
          },
          "feedType": {
            "type": "string",
            "const": "jobs"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "browseJobsUrl": {
            "type": "string",
            "format": "uri"
          },
          "postJobUrl": {
            "type": "string",
            "format": "uri"
          },
          "agenticJobsUrl": {
            "type": "string",
            "format": "uri"
          },
          "jobs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JobListing"
            }
          }
        }
      },
      "AgenticJobsFeed": {
        "type": "object",
        "required": ["site", "feedType", "description", "updatedAt", "agentPolicyUrl", "agentInstructionsUrl", "browseUrl", "jobsJsonUrl", "applicationFormAction", "humanConsentRequired", "browserAgentsAllowed", "listings"],
        "properties": {
          "site": {
            "type": "string",
            "examples": ["NoCodeJobs.org"]
          },
          "feedType": {
            "type": "string",
            "const": "agentic_jobs"
          },
          "description": {
            "type": "string"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "agentPolicyUrl": {
            "type": "string",
            "format": "uri"
          },
          "agentInstructionsUrl": {
            "type": "string",
            "format": "uri"
          },
          "browseUrl": {
            "type": "string",
            "format": "uri"
          },
          "jobsJsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "applicationFormAction": {
            "type": "string",
            "format": "uri"
          },
          "humanConsentRequired": {
            "type": "boolean",
            "const": true
          },
          "browserAgentsAllowed": {
            "type": "boolean",
            "const": true
          },
          "listings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AgenticJobListing"
            }
          }
        }
      },
      "JobListing": {
        "type": "object",
        "required": ["id", "slug", "listingGroup", "title", "company", "location", "workplaceType", "employmentType", "categories", "compensation", "description", "url", "applyUrl", "datePosted", "validThrough"],
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "listingGroup": {
            "type": "string",
            "enum": ["open_positions", "agentic_jobs"]
          },
          "listingType": {
            "type": ["string", "null"]
          },
          "title": {
            "type": "string"
          },
          "company": {
            "type": "string"
          },
          "companyUrl": {
            "type": ["string", "null"],
            "format": "uri"
          },
          "location": {
            "type": "string"
          },
          "workplaceType": {
            "type": "string"
          },
          "employmentType": {
            "type": "string"
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "salaryCurrency": {
            "type": ["string", "null"]
          },
          "salaryMin": {
            "type": ["number", "null"]
          },
          "salaryMax": {
            "type": ["number", "null"]
          },
          "salaryUnit": {
            "type": ["string", "null"]
          },
          "compensation": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "applyUrl": {
            "type": "string",
            "format": "uri"
          },
          "datePosted": {
            "type": ["string", "null"],
            "format": "date-time"
          },
          "validThrough": {
            "type": ["string", "null"],
            "format": "date-time"
          },
          "featured": {
            "type": ["boolean", "null"]
          }
        },
        "additionalProperties": true
      },
      "AgenticJobListing": {
        "allOf": [
          {
            "$ref": "#/components/schemas/JobListing"
          },
          {
            "type": "object",
            "required": ["status", "testRun", "realHiringOpportunity", "responsibilities", "requirements", "applicationFormAction", "humanConsentRequired", "browserAgentsAllowed", "agentGuidance"],
            "properties": {
              "status": {
                "type": "string",
                "examples": ["open"]
              },
              "testRun": {
                "type": "boolean",
                "const": true
              },
              "realHiringOpportunity": {
                "type": "boolean",
                "const": true
              },
              "responsibilities": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "requirements": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "applicationFormAction": {
                "type": "string",
                "format": "uri"
              },
              "humanConsentRequired": {
                "type": "boolean",
                "const": true
              },
              "browserAgentsAllowed": {
                "type": "boolean",
                "const": true
              },
              "agentGuidance": {
                "type": "string"
              }
            }
          }
        ]
      },
      "ApplicationForm": {
        "type": "object",
        "required": [
          "jobId",
          "jobTitle",
          "company",
          "location",
          "name",
          "email",
          "phone",
          "resume",
          "coverLetter",
          "humanConsent"
        ],
        "properties": {
          "jobId": {
            "type": "string",
            "description": "Stable job ID from the job detail page or JSON feed."
          },
          "jobTitle": {
            "type": "string"
          },
          "company": {
            "type": "string"
          },
          "location": {
            "type": "string"
          },
          "name": {
            "type": "string",
            "description": "Applicant full name."
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "phone": {
            "type": "string"
          },
          "linkedin": {
            "type": "string",
            "format": "uri"
          },
          "portfolioUrl": {
            "type": "string",
            "format": "uri"
          },
          "workSampleUrl": {
            "type": "string",
            "format": "uri",
            "description": "Optional link to a relevant project, demo, GitHub repo, automation, or portfolio item."
          },
          "tools": {
            "type": "string",
            "description": "Optional list of relevant tools, platforms, APIs, or frameworks."
          },
          "resume": {
            "type": "string",
            "format": "binary",
            "description": "Required resume or short capability document. Allowed types: PDF, DOC, DOCX, TXT. Maximum file size: 5MB."
          },
          "coverLetter": {
            "type": "string",
            "description": "Applicant approach, relevant experience, and assumptions they would test first."
          },
          "humanConsent": {
            "type": "string",
            "enum": ["yes"],
            "description": "Required confirmation that the application is submitted by the applicant or by an assistant acting with permission."
          },
          "submissionSource": {
            "type": "string",
            "description": "Optional source tracking value. The visible form sends website-form. Direct agent/API tests may use agent-api. This is informational only.",
            "examples": ["website-form", "agent-api"]
          },
          "website_confirm": {
            "type": "string",
            "description": "Anti-abuse field from the visible form. Leave blank."
          }
        },
        "additionalProperties": true
      },
      "ApplicationSuccess": {
        "type": "object",
        "required": ["success", "id"],
        "properties": {
          "success": {
            "type": "boolean",
            "const": true
          },
          "id": {
            "type": "string",
            "description": "Email provider message ID."
          }
        }
      },
      "ApplicationReceived": {
        "type": "object",
        "required": ["success", "status"],
        "properties": {
          "success": {
            "type": "boolean",
            "const": true
          },
          "status": {
            "type": "string",
            "examples": ["received"]
          }
        }
      },
      "ApplicationError": {
        "type": "object",
        "required": ["success", "error"],
        "properties": {
          "success": {
            "type": "boolean",
            "const": false
          },
          "error": {
            "type": "string"
          },
          "code": {
            "type": "string",
            "examples": ["resume_required", "resume_too_large", "resume_invalid_type"]
          }
        }
      }
    }
  }
}
