{
    "openapi": "3.1.0",
    "info": {
        "title": "personnel.com API",
        "version": "1.0.0",
        "description": "Public, read-only catalog API for personnel.com \u2014 a US online job board.\n\n- **Unauthenticated.** No API key required.\n- **Rate limited.** 30 requests per minute per IP.\n- **Cacheable.** Every response carries `ETag` and `Cache-Control: public, max-age=60`. Send `If-None-Match` for 304 responses.\n- **CORS-enabled.** All origins; GET\/HEAD\/OPTIONS only; no credentials.\n\nSee also: [llms.txt](\/llms.txt), [api-catalog](\/.well-known\/api-catalog), [sitemap](\/sitemap.xml)."
    },
    "servers": [
        {
            "url": "https:\/\/personnel.com\/api\/v1"
        }
    ],
    "paths": {
        "\/categories": {
            "get": {
                "operationId": "v1.categories.index",
                "description": "All categories with a count of publicly visible jobs in each. Cached\nSWR (5 min fresh, 1 hour stale) inside the service \u2014 the list is small\nand changes rarely.",
                "summary": "GET \/api\/v1\/categories",
                "tags": [
                    "Category"
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {}
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/categories\/{category}": {
            "get": {
                "operationId": "v1.categories.show",
                "description": "Default route key binding (id, since Category has no slug column).",
                "summary": "GET \/api\/v1\/categories\/{category}",
                "tags": [
                    "Category"
                ],
                "parameters": [
                    {
                        "name": "category",
                        "in": "path",
                        "required": true,
                        "description": "The category ID",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {}
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#\/components\/responses\/ModelNotFoundException"
                    }
                }
            }
        },
        "\/companies": {
            "get": {
                "operationId": "v1.companies.index",
                "description": "Paginated, sortable listing. Cached SWR (60s fresh, 6 min stale).\n\nQuery parameters:\n  ?q=                 search on company name + headline\n  ?sort=              `-created_at` (default), `name`, `updated_at`; prefix `-` for desc\n  ?per_page=1..50     page size, default 20",
                "summary": "GET \/api\/v1\/companies",
                "tags": [
                    "Company"
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {}
                                }
                            }
                        }
                    }
                }
            }
        },
        "\/companies\/{slug}": {
            "get": {
                "operationId": "v1.companies.show",
                "description": "Cached per-slug SWR (5 min fresh, 1 hour stale).",
                "summary": "GET \/api\/v1\/companies\/{slug}",
                "tags": [
                    "Company"
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": [
                                        "object",
                                        "null"
                                    ],
                                    "additionalProperties": {}
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#\/components\/responses\/NotFoundHttpException"
                    }
                }
            }
        },
        "\/jobs": {
            "get": {
                "operationId": "v1.jobs.index",
                "description": "Paginated, searchable, sortable listing of published, non-expired,\nnon-flagged jobs. Cached with stale-while-revalidate (60s fresh,\n6 min stale) inside the service \u2014 every cache key includes the full\nquery fingerprint so different filter\/sort combinations stay distinct.\n\nInput is validated and normalized by IndexJobsRequest.",
                "summary": "GET \/api\/v1\/jobs",
                "tags": [
                    "Job"
                ],
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 200
                        }
                    },
                    {
                        "name": "category",
                        "in": "query",
                        "schema": {
                            "type": [
                                "integer",
                                "null"
                            ],
                            "minimum": 1
                        }
                    },
                    {
                        "name": "company",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 120
                        }
                    },
                    {
                        "name": "sort",
                        "in": "query",
                        "schema": {
                            "type": [
                                "string",
                                "null"
                            ],
                            "maxLength": 40
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {}
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#\/components\/responses\/ValidationException"
                    }
                }
            }
        },
        "\/jobs\/{slug}": {
            "get": {
                "operationId": "v1.jobs.show",
                "description": "Individual job lookup. Cached per-slug with stale-while-revalidate\n(5 min fresh, 1 hour stale). Returns 404 if the slug doesn't resolve\nto a published, non-expired, non-flagged job.",
                "summary": "GET \/api\/v1\/jobs\/{slug}",
                "tags": [
                    "Job"
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "",
                        "content": {
                            "application\/json": {
                                "schema": {
                                    "type": [
                                        "object",
                                        "null"
                                    ],
                                    "additionalProperties": {}
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#\/components\/responses\/NotFoundHttpException"
                    }
                }
            }
        }
    },
    "components": {
        "responses": {
            "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"
                            ]
                        }
                    }
                }
            },
            "NotFoundHttpException": {
                "description": "Not found",
                "content": {
                    "application\/json": {
                        "schema": {
                            "type": "object",
                            "properties": {
                                "message": {
                                    "type": "string",
                                    "description": "Error overview."
                                }
                            },
                            "required": [
                                "message"
                            ]
                        }
                    }
                }
            },
            "ModelNotFoundException": {
                "description": "Not found",
                "content": {
                    "application\/json": {
                        "schema": {
                            "type": "object",
                            "properties": {
                                "message": {
                                    "type": "string",
                                    "description": "Error overview."
                                }
                            },
                            "required": [
                                "message"
                            ]
                        }
                    }
                }
            }
        }
    }
}