{
    "openapi": "3.1.0",
    "info": {
        "title": "NeverApply API",
        "version": "1.0.0",
        "description": "The NeverApply API provides programmatic access to AI-curated job listings from companies worldwide.\n\n## Authentication\n\nAll endpoints require a Bearer token. Create one from your [Developer Dashboard](https:\/\/neverapply.co\/developers).\n\n```\nAuthorization: Bearer sj_live_your_token_here\n```\n\n## Rate Limiting\n\nEvery response includes quota headers:\n- `X-Plan-Limit` \u2014 monthly call limit for your plan\n- `X-Plan-Remaining` \u2014 calls remaining this month\n- `X-Plan-Reset` \u2014 Unix timestamp when the counter resets\n\n## Error Handling\n\nErrors return a consistent JSON envelope:\n\n```json\n{\n  \"error\": {\n    \"code\": \"error_code\",\n    \"message\": \"Human-readable description\",\n    \"details\": {}\n  }\n}\n```\n\n| Code | Status | Description |\n|------|--------|-------------|\n| `authentication_required` | 401 | Missing or invalid Bearer token |\n| `validation_failed` | 422 | Invalid query parameters |\n| `plan_limit_exceeded` | 429 | Monthly quota exhausted |\n| `rate_limit_exceeded` | 429 | Too many requests per minute |\n| `not_found` | 404 | Resource not found |\n\n## Plans\n\n| Plan | Price | Monthly Calls |\n|------|-------|---------------|\n| Free | $0 | 1,000 |\n| Starter | $19 | 10,000 |\n| Pro | $49 | 50,000 |\n| Business | $149 | 250,000 |"
    },
    "servers": [
        {
            "url": "https:\/\/neverapply.co\/api",
            "description": "Production"
        }
    ],
    "security": [
        {
            "http": []
        }
    ],
    "paths": {
        "\/v1\/jobs\/search": {
            "get": {
                "operationId": "searchJobs",
                "description": "Full-text search across job listings with filtering, sorting, and pagination.\nReturns only published, non-expired listings. Use the `fields` parameter for sparse fieldsets\n(comma-separated top-level property names, e.g. `fields=id,title,company_name`; unknown names are rejected with 422).",
                "summary": "Search jobs",
                "tags": [
                    "Jobs",
                    "Search"
                ],
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 200
                        }
                    },
                    {
                        "name": "countries[]",
                        "in": "query",
                        "schema": {
                            "type": "array",
                            "pattern": "^[A-Za-z]{2}$",
                            "items": {
                                "type": "string",
                                "pattern": "^[A-Za-z]{2}$"
                            }
                        }
                    },
                    {
                        "name": "is_global",
                        "in": "query",
                        "description": "Accept the query-string forms consumers will actually send.\nLaravel's `boolean` rule rejects \"true\"\/\"false\" strings, so list them explicitly.",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "true",
                                "false",
                                "1",
                                "0",
                                null
                            ]
                        }
                    },
                    {
                        "name": "languages[]",
                        "in": "query",
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string",
                                "maxLength": 10
                            }
                        }
                    },
                    {
                        "name": "cities[]",
                        "in": "query",
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string",
                                "maxLength": 100
                            }
                        }
                    },
                    {
                        "name": "salary_min",
                        "in": "query",
                        "schema": {
                            "type": [
                                "integer",
                                "null"
                            ],
                            "minimum": 0
                        }
                    },
                    {
                        "name": "salary_max",
                        "in": "query",
                        "schema": {
                            "type": [
                                "integer",
                                "null"
                            ],
                            "minimum": 0
                        }
                    },
                    {
                        "name": "salary_period",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "hour",
                                "day",
                                "week",
                                "month",
                                "year",
                                null
                            ]
                        }
                    },
                    {
                        "name": "salary_currency",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "minLength": 3,
                            "maxLength": 3
                        }
                    },
                    {
                        "name": "salary_is_predicted",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "true",
                                "false",
                                "1",
                                "0",
                                null
                            ]
                        }
                    },
                    {
                        "name": "is_recruitment_agency",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "true",
                                "false",
                                "1",
                                "0",
                                null
                            ]
                        }
                    },
                    {
                        "name": "experience_level",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "entry",
                                "mid",
                                "senior",
                                "lead",
                                "executive",
                                null
                            ]
                        }
                    },
                    {
                        "name": "experience_years",
                        "in": "query",
                        "schema": {
                            "type": [
                                "integer",
                                "null"
                            ],
                            "minimum": 0,
                            "maximum": 80
                        }
                    },
                    {
                        "name": "commitment",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 50
                        }
                    },
                    {
                        "name": "category",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 50
                        }
                    },
                    {
                        "name": "company_name",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 200
                        }
                    },
                    {
                        "name": "company_domain",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 200
                        }
                    },
                    {
                        "name": "ats_source",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 100
                        }
                    },
                    {
                        "name": "remote_status",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 50
                        }
                    },
                    {
                        "name": "tags[]",
                        "in": "query",
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string",
                                "maxLength": 50
                            }
                        }
                    },
                    {
                        "name": "visa_sponsorship_offered",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "yes",
                                "no",
                                "case_by_case",
                                "unknown",
                                null
                            ]
                        }
                    },
                    {
                        "name": "visa_types_supported[]",
                        "in": "query",
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string",
                                "maxLength": 50
                            }
                        }
                    },
                    {
                        "name": "work_authorization_required",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "must_be_authorized",
                                "will_sponsor",
                                "open",
                                null
                            ]
                        }
                    },
                    {
                        "name": "citizenship_required[]",
                        "in": "query",
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string",
                                "maxLength": 10
                            }
                        }
                    },
                    {
                        "name": "security_clearance_required",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "none",
                                "public_trust",
                                "confidential",
                                "secret",
                                "top_secret",
                                "ts_sci",
                                "q",
                                null
                            ]
                        }
                    },
                    {
                        "name": "relocation_offered",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "true",
                                "false",
                                "1",
                                "0",
                                null
                            ]
                        }
                    },
                    {
                        "name": "education_level_required",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "none",
                                "high_school",
                                "associate",
                                "bachelor",
                                "master",
                                "phd",
                                "professional",
                                null
                            ]
                        }
                    },
                    {
                        "name": "travel_requirement",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "none",
                                "occasional",
                                "25",
                                "50",
                                "75",
                                "continuous",
                                null
                            ]
                        }
                    },
                    {
                        "name": "posted_after",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "posted_before",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "sort",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "relevance",
                                "published_at",
                                "-published_at",
                                "salary_min_annual_usd",
                                "-salary_min_annual_usd",
                                null
                            ]
                        }
                    },
                    {
                        "name": "fields",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 500
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": [
                                "integer",
                                "null"
                            ],
                            "minimum": 1,
                            "maximum": 100
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "schema": {
                            "type": [
                                "integer",
                                "null"
                            ],
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "integer",
                                    "const": 422
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#\/components\/responses\/AuthenticationException"
                    },
                    "422": {
                        "$ref": "#\/components\/responses\/ValidationException"
                    }
                }
            }
        },
        "\/v1\/jobs\/feed": {
            "get": {
                "operationId": "feedJobs",
                "description": "Bulk feed of active job listings with stable cursor pagination, ordered\noldest-published first (`sort=oldest`, the default) or newest first (`sort=newest`).\nDesigned for high-volume consumers: pages of up to 500 listings with full\ndescriptions. For incremental sync, keep the default order, poll with `posted_after`\nset to your last sync time, and pair with the expired-jobs endpoint to remove dead\nlistings. Use `sort=newest` for one-off pulls of the latest jobs.\nUse the `fields` parameter for sparse fieldsets (comma-separated top-level property names; unknown names are rejected with 422).\nUnknown `category` \/ `remote_status` slugs and `is_global=true` with `countries` are\nrejected with 422.",
                "summary": "Jobs feed",
                "tags": [
                    "Jobs",
                    "Feed"
                ],
                "parameters": [
                    {
                        "name": "cursor",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ]
                        }
                    },
                    {
                        "name": "posted_after",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "posted_before",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "countries[]",
                        "in": "query",
                        "schema": {
                            "type": "array",
                            "pattern": "^[A-Za-z]{2}$",
                            "items": {
                                "type": "string",
                                "pattern": "^[A-Za-z]{2}$"
                            }
                        }
                    },
                    {
                        "name": "category",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 50
                        }
                    },
                    {
                        "name": "remote_status",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 50
                        }
                    },
                    {
                        "name": "is_global",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "true",
                                "false",
                                "1",
                                "0",
                                null
                            ]
                        }
                    },
                    {
                        "name": "visa_sponsorship_offered",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "yes",
                                "no",
                                "case_by_case",
                                "unknown",
                                null
                            ]
                        }
                    },
                    {
                        "name": "fields",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 500
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": [
                                "integer",
                                "null"
                            ],
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "sort",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "enum": [
                                "oldest",
                                "newest",
                                null
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "integer",
                                    "const": 401
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#\/components\/responses\/AuthenticationException"
                    },
                    "422": {
                        "$ref": "#\/components\/responses\/ValidationException"
                    }
                }
            }
        },
        "\/v1\/jobs\/expired": {
            "get": {
                "operationId": "expiredJobs",
                "description": "Listings that left the active pool since `expired_after` (max 90 days back),\nfor purging dead jobs from a synced copy. Returns skinny rows only.\n`expired_at` is `deactivated_at` for status-flipped rows and `expires_at`\nfor listings that lapsed while still published. Deletions are idempotent.",
                "summary": "Expired jobs",
                "tags": [
                    "Jobs",
                    "ExpiredJobs"
                ],
                "parameters": [
                    {
                        "name": "expired_after",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "cursor",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ]
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": [
                                "integer",
                                "null"
                            ],
                            "minimum": 1,
                            "maximum": 1000
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "integer",
                                    "const": 401
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#\/components\/responses\/AuthenticationException"
                    },
                    "422": {
                        "$ref": "#\/components\/responses\/ValidationException"
                    }
                }
            }
        },
        "\/v1\/jobs\/{job}": {
            "get": {
                "operationId": "getJob",
                "description": "Retrieve a job listing by its ID. Returns 404 for unpublished or expired listings.",
                "summary": "Get a single job",
                "tags": [
                    "Jobs"
                ],
                "parameters": [
                    {
                        "name": "job",
                        "in": "path",
                        "required": true,
                        "description": "The job slug",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "integer",
                                    "const": 404
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#\/components\/responses\/ModelNotFoundException"
                    },
                    "401": {
                        "$ref": "#\/components\/responses\/AuthenticationException"
                    }
                }
            }
        },
        "\/v1\/meta\/countries": {
            "get": {
                "operationId": "listCountries",
                "description": "Returns all enabled countries. Use the `code` values in the `countries[]` search filter.",
                "summary": "List countries",
                "tags": [
                    "Meta"
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "integer",
                                    "const": 200
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#\/components\/responses\/AuthenticationException"
                    }
                }
            }
        },
        "\/v1\/meta\/categories": {
            "get": {
                "operationId": "listCategories",
                "description": "Returns all job categories. Use the `slug` values in the `category` search filter.",
                "summary": "List categories",
                "tags": [
                    "Meta"
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "integer",
                                    "const": 200
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#\/components\/responses\/AuthenticationException"
                    }
                }
            }
        },
        "\/v1\/meta\/ats-sources": {
            "get": {
                "operationId": "listAtsSources",
                "description": "Returns all active ATS (Applicant Tracking System) platforms. Use the `name` values in the `ats_source` search filter.",
                "summary": "List ATS sources",
                "tags": [
                    "Meta"
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "integer",
                                    "const": 200
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#\/components\/responses\/AuthenticationException"
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "http": {
                "type": "http",
                "scheme": "bearer"
            }
        },
        "responses": {
            "AuthenticationException": {
                "description": "Unauthenticated",
                "content": {
                    "application\/json": {
                        "schema": {
                            "type": "object",
                            "properties": {
                                "message": {
                                    "type": "string",
                                    "description": "Error overview."
                                }
                            },
                            "required": [
                                "message"
                            ]
                        }
                    }
                }
            },
            "ValidationException": {
                "description": "Validation error",
                "content": {
                    "application\/json": {
                        "schema": {
                            "type": "object",
                            "properties": {
                                "message": {
                                    "type": "string",
                                    "description": "Errors overview."
                                },
                                "errors": {
                                    "type": "object",
                                    "description": "A detailed description of each field that failed validation.",
                                    "additionalProperties": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "required": [
                                "message",
                                "errors"
                            ]
                        }
                    }
                }
            },
            "ModelNotFoundException": {
                "description": "Not found",
                "content": {
                    "application\/json": {
                        "schema": {
                            "type": "object",
                            "properties": {
                                "message": {
                                    "type": "string",
                                    "description": "Error overview."
                                }
                            },
                            "required": [
                                "message"
                            ]
                        }
                    }
                }
            }
        }
    }
}