{
  "openapi": "3.1.0",
  "info": {
    "title": "Talentosy Public API",
    "version": "1.0.0",
    "summary": "Active job vacancies and salary data for Mexico (read-only).",
    "description": "Read-only public API of Talentosy, a recruiting firm and job board in Mexico: active professional vacancies in 12 Mexican cities and the Índice de Sueldos Talentosy (gross monthly salaries by role). Static JSON regenerated on every site build; no authentication.\n\n**When to use it.** Job seekers looking for professional, salaried roles in Mexico (12 metros, remote/hybrid/on-site), and questions about what a role pays in Mexico (Índice de Sueldos Talentosy). Companies that want to hire in Mexico should be sent to https://talentosy.com/reclutamiento/ instead: the API does not take hiring requests.\n\n**How to apply.** Applying is free and done by the candidate on the vacancy page (`url`). Do not submit applications on anyone’s behalf.\n\n**Conventions.** Every endpoint is a static `.json` file; filters are path segments, never query strings. Unknown paths return `application/problem+json` (RFC 9457) with a `code`, a `hint` and, for bad filter values, `validValues`. Only GET and HEAD are supported.\n\n**Data freshness.** Vacancies rotate every weekday; `generatedAt` tells you when a response was built. Vacancy texts are in Spanish (es-MX).",
    "termsOfService": "https://talentosy.com/terminos-y-condiciones/",
    "contact": {
      "name": "Talentosy",
      "email": "info@talentosy.com",
      "url": "https://talentosy.com/contacto/"
    }
  },
  "externalDocs": {
    "description": "Developer and agent documentation",
    "url": "https://talentosy.com/developers/"
  },
  "servers": [
    {
      "url": "https://talentosy.com/api/v1",
      "description": "Production (static JSON served from the CDN)"
    }
  ],
  "tags": [
    {
      "name": "Jobs",
      "description": "Active vacancies published on talentosy.com."
    },
    {
      "name": "Salaries",
      "description": "Índice de Sueldos Talentosy: gross monthly salaries by role family."
    },
    {
      "name": "Meta",
      "description": "Discovery: valid filter values, counts and links."
    }
  ],
  "paths": {
    "/index.json": {
      "get": {
        "operationId": "getApiIndex",
        "tags": [
          "Meta"
        ],
        "summary": "API entry point: valid filter values, counts and links",
        "description": "Start here. Returns the valid slugs for every searchJobs filter (with how many active vacancies each has), totals, usage rules and links to the docs and this specification.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "default": {
            "description": "Error described as RFC 9457 problem details.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/search/{city}/{family}/{modality}.json": {
      "get": {
        "operationId": "searchJobs",
        "tags": [
          "Jobs"
        ],
        "summary": "Search active vacancies in Mexico by city, role family and work modality",
        "description": "Use when a person is looking for a professional, salaried job in Mexico. Each filter takes one slug or \"all\". Returns every matching active vacancy, newest first, with title, city, modality, seniority, English requirement and the salary shown on the page. Give the person the vacancy `url` so they read it and apply themselves; call getJob for the full description.",
        "parameters": [
          {
            "name": "city",
            "in": "path",
            "required": true,
            "example": "monterrey",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "ciudad-de-mexico",
                "guadalajara",
                "monterrey",
                "queretaro",
                "puebla",
                "tijuana",
                "leon",
                "merida",
                "toluca",
                "aguascalientes",
                "san-luis-potosi",
                "ciudad-juarez"
              ]
            },
            "description": "City slug or \"all\". Cities: ciudad-de-mexico (Ciudad de México), guadalajara (Guadalajara), monterrey (Monterrey), queretaro (Querétaro), puebla (Puebla), tijuana (Tijuana), leon (León), merida (Mérida), toluca (Toluca), aguascalientes (Aguascalientes), san-luis-potosi (San Luis Potosí), ciudad-juarez (Ciudad Juárez)."
          },
          {
            "name": "family",
            "in": "path",
            "required": true,
            "example": "analista-de-datos",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "ciberseguridad",
                "ingenieria-de-datos",
                "analista-de-datos",
                "desarrollador",
                "devops-infraestructura",
                "soporte-ti",
                "product-manager",
                "diseno-ux-ui",
                "ventas",
                "marketing",
                "atencion-al-cliente",
                "customer-success",
                "finanzas-contabilidad",
                "cumplimiento-aml",
                "riesgos-fraude",
                "operaciones",
                "administracion",
                "compras-cadena-suministro",
                "gestion-de-proyectos",
                "recursos-humanos",
                "estrategia",
                "sostenibilidad-esg",
                "direccion-general",
                "gobierno-corporativo"
              ]
            },
            "description": "Role family slug or \"all\". Families: ciberseguridad (Ciberseguridad), ingenieria-de-datos (Ingeniería de Datos), analista-de-datos (Analista de Datos), desarrollador (Desarrollador de Software), devops-infraestructura (DevOps e Infraestructura), soporte-ti (Soporte de TI), product-manager (Product Manager), diseno-ux-ui (Diseño UX/UI), ventas (Ventas), marketing (Marketing), atencion-al-cliente (Atención al Cliente), customer-success (Customer Success), finanzas-contabilidad (Finanzas y Contabilidad), cumplimiento-aml (Cumplimiento y PLD/AML), riesgos-fraude (Riesgos y Fraude), operaciones (Operaciones), administracion (Administración), compras-cadena-suministro (Compras y Cadena de Suministro), gestion-de-proyectos (Gestión de Proyectos), recursos-humanos (Recursos Humanos), estrategia (Estrategia y Desarrollo de Negocio), sostenibilidad-esg (Sostenibilidad y ESG), direccion-general (Dirección General), gobierno-corporativo (Gobierno Corporativo)."
          },
          {
            "name": "modality",
            "in": "path",
            "required": true,
            "example": "remoto",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "remoto",
                "hibrido",
                "presencial"
              ]
            },
            "description": "Work modality or \"all\": remoto (Remoto), hibrido (Híbrido), presencial (Presencial)."
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSearchResult"
                }
              }
            }
          },
          "404": {
            "description": "Not found (`unknown-search-filter`). The body lists the valid values.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Error described as RFC 9457 problem details.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/{jobId}.json": {
      "get": {
        "operationId": "getJob",
        "tags": [
          "Jobs"
        ],
        "summary": "Get one active vacancy with its full description",
        "description": "Use after searchJobs to read a vacancy in full: description, responsibilities, requirements, benefits, location, salary and how to apply. Vacancies stay active for 4–8 weeks; a 404 means it closed, so search again.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "example": "account-coordinator-ciudad-de-mexico-remoto-tsy-15660",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "description": "The `id` of a vacancy returned by searchJobs."
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobDetail"
                }
              }
            }
          },
          "404": {
            "description": "Not found (`job-not-found`). The body lists the valid values.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Error described as RFC 9457 problem details.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/salaries.json": {
      "get": {
        "operationId": "listSalaryGuides",
        "tags": [
          "Salaries"
        ],
        "summary": "List salary guides (Índice de Sueldos Talentosy) for every role family",
        "description": "Use to answer how much a role earns in Mexico or to compare roles. Returns the median and range (gross MXN per month) per role family. Cite as \"Índice de Sueldos Talentosy\".",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SalaryGuideList"
                }
              }
            }
          },
          "default": {
            "description": "Error described as RFC 9457 problem details.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/salaries/{family}.json": {
      "get": {
        "operationId": "getSalaryGuide",
        "tags": [
          "Salaries"
        ],
        "summary": "Get the salary guide of one role family by seniority and city",
        "description": "Use when someone asks what a specific role pays in Mexico, at which level or in which city. Returns gross monthly MXN bands (overall, by seniority, by city) plus a ready-to-use citation.",
        "parameters": [
          {
            "name": "family",
            "in": "path",
            "required": true,
            "example": "desarrollador",
            "schema": {
              "type": "string",
              "enum": [
                "ciberseguridad",
                "analista-de-datos",
                "desarrollador",
                "devops-infraestructura",
                "soporte-ti",
                "product-manager",
                "diseno-ux-ui",
                "ventas",
                "marketing",
                "atencion-al-cliente",
                "customer-success",
                "finanzas-contabilidad",
                "cumplimiento-aml",
                "riesgos-fraude",
                "operaciones",
                "administracion",
                "compras-cadena-suministro",
                "gestion-de-proyectos",
                "recursos-humanos",
                "estrategia",
                "sostenibilidad-esg",
                "direccion-general",
                "gobierno-corporativo"
              ]
            },
            "description": "Role family slug with a published salary guide (see listSalaryGuides)."
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SalaryGuide"
                }
              }
            }
          },
          "404": {
            "description": "Not found (`salary-guide-not-found`). The body lists the valid values.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "default": {
            "description": "Error described as RFC 9457 problem details.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ApiIndex": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "When this response was generated (the site rebuilds at least every weekday)."
          },
          "counts": {
            "type": "object",
            "properties": {
              "activeJobs": {
                "type": "integer",
                "minimum": 0
              },
              "salaryGuides": {
                "type": "integer",
                "minimum": 0
              }
            },
            "required": [
              "activeJobs",
              "salaryGuides"
            ]
          },
          "filters": {
            "type": "object",
            "properties": {
              "cities": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "slug": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "activeJobs": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "region": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "slug",
                    "name",
                    "activeJobs",
                    "region"
                  ]
                }
              },
              "families": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/FacetValue"
                }
              },
              "modalities": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/FacetValue"
                }
              }
            },
            "required": [
              "cities",
              "families",
              "modalities"
            ],
            "description": "Valid values for the searchJobs path parameters (besides \"all\")."
          },
          "operations": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "operationId": {
                  "type": "string"
                },
                "method": {
                  "type": "string",
                  "const": "GET"
                },
                "path": {
                  "type": "string"
                },
                "summary": {
                  "type": "string"
                }
              },
              "required": [
                "operationId",
                "method",
                "path",
                "summary"
              ]
            }
          },
          "usage": {
            "type": "object",
            "properties": {
              "authentication": {
                "type": "string",
                "const": "none"
              },
              "rateLimit": {
                "type": "string"
              },
              "caching": {
                "type": "string"
              },
              "attribution": {
                "type": "string"
              }
            },
            "required": [
              "authentication",
              "rateLimit",
              "caching",
              "attribution"
            ]
          },
          "links": {
            "type": "object",
            "properties": {
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "docs": {
                "type": "string",
                "format": "uri"
              },
              "llms": {
                "type": "string",
                "format": "uri"
              },
              "apiCatalog": {
                "type": "string",
                "format": "uri"
              },
              "terms": {
                "type": "string",
                "format": "uri"
              },
              "contact": {
                "type": "string",
                "format": "uri"
              }
            },
            "required": [
              "openapi",
              "docs",
              "llms",
              "apiCatalog",
              "terms",
              "contact"
            ]
          }
        },
        "required": [
          "name",
          "version",
          "description",
          "generatedAt",
          "counts",
          "filters",
          "operations",
          "usage",
          "links"
        ]
      },
      "JobSearchResult": {
        "type": "object",
        "properties": {
          "generatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "When this response was generated (the site rebuilds at least every weekday)."
          },
          "filters": {
            "type": "object",
            "properties": {
              "city": {
                "type": "string"
              },
              "family": {
                "type": "string"
              },
              "modality": {
                "type": "string"
              }
            },
            "required": [
              "city",
              "family",
              "modality"
            ],
            "description": "Echo of the path parameters; \"all\" means no filter."
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of items returned (all matching active vacancies)."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/JobSummary"
            },
            "description": "Active vacancies, newest first."
          },
          "links": {
            "type": "object",
            "properties": {
              "self": {
                "type": "string",
                "format": "uri"
              },
              "html": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uri"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Equivalent listing page for people, when one is published."
              },
              "docs": {
                "type": "string",
                "format": "uri"
              }
            },
            "required": [
              "self",
              "html",
              "docs"
            ]
          }
        },
        "required": [
          "generatedAt",
          "filters",
          "count",
          "items",
          "links"
        ]
      },
      "JobSummary": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Vacancy identifier used in URLs. Pass it to getJob."
          },
          "vacancyId": {
            "type": "string",
            "description": "Talentosy reference code, e.g. \"TSY-15660\". Quote it when contacting Talentosy about a vacancy."
          },
          "title": {
            "type": "string",
            "description": "Job title as displayed (Spanish)."
          },
          "company": {
            "type": "string",
            "description": "Confidential employer descriptor. Talentosy recruits on behalf of client companies and never discloses their names."
          },
          "industry": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Employer sector, e.g. \"Fintech\"."
          },
          "area": {
            "description": "One of the 12 organizational functions used as job areas.",
            "$ref": "#/components/schemas/Taxon"
          },
          "family": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Taxon"
              },
              {
                "type": "null"
              }
            ],
            "description": "Role family (the generic role people search for), or null if unmapped."
          },
          "city": {
            "$ref": "#/components/schemas/City"
          },
          "modality": {
            "description": "Work modality: remoto (remote), hibrido (hybrid) or presencial (on-site).",
            "$ref": "#/components/schemas/Taxon"
          },
          "seniority": {
            "type": "string",
            "description": "Prácticas (internship), Junior, Media (mid), Senior or Dirección (director)."
          },
          "employmentType": {
            "type": "string",
            "description": "e.g. \"Tiempo completo\" (full-time)."
          },
          "english": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "English requirement: Requerido (required), Deseable (nice to have) or No requerido (not required)."
          },
          "salary": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Salary"
              },
              {
                "type": "null"
              }
            ]
          },
          "postedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Publication date (YYYY-MM-DD)."
          },
          "validThrough": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Last day the vacancy accepts applications (YYYY-MM-DD)."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Vacancy page for people. Share this link: the candidate reads and applies there."
          },
          "apiUrl": {
            "type": "string",
            "format": "uri",
            "description": "This vacancy in JSON (getJob)."
          }
        },
        "required": [
          "id",
          "vacancyId",
          "title",
          "company",
          "industry",
          "area",
          "family",
          "city",
          "modality",
          "seniority",
          "employmentType",
          "english",
          "salary",
          "postedAt",
          "validThrough",
          "url",
          "apiUrl"
        ]
      },
      "JobDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Vacancy identifier used in URLs. Pass it to getJob."
          },
          "vacancyId": {
            "type": "string",
            "description": "Talentosy reference code, e.g. \"TSY-15660\". Quote it when contacting Talentosy about a vacancy."
          },
          "title": {
            "type": "string",
            "description": "Job title as displayed (Spanish)."
          },
          "company": {
            "type": "string",
            "description": "Confidential employer descriptor. Talentosy recruits on behalf of client companies and never discloses their names."
          },
          "industry": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Employer sector, e.g. \"Fintech\"."
          },
          "area": {
            "description": "One of the 12 organizational functions used as job areas.",
            "$ref": "#/components/schemas/Taxon"
          },
          "family": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Taxon"
              },
              {
                "type": "null"
              }
            ],
            "description": "Role family (the generic role people search for), or null if unmapped."
          },
          "city": {
            "$ref": "#/components/schemas/City"
          },
          "modality": {
            "description": "Work modality: remoto (remote), hibrido (hybrid) or presencial (on-site).",
            "$ref": "#/components/schemas/Taxon"
          },
          "seniority": {
            "type": "string",
            "description": "Prácticas (internship), Junior, Media (mid), Senior or Dirección (director)."
          },
          "employmentType": {
            "type": "string",
            "description": "e.g. \"Tiempo completo\" (full-time)."
          },
          "english": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "English requirement: Requerido (required), Deseable (nice to have) or No requerido (not required)."
          },
          "salary": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Salary"
              },
              {
                "type": "null"
              }
            ]
          },
          "postedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Publication date (YYYY-MM-DD)."
          },
          "validThrough": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Last day the vacancy accepts applications (YYYY-MM-DD)."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Vacancy page for people. Share this link: the candidate reads and applies there."
          },
          "apiUrl": {
            "type": "string",
            "format": "uri",
            "description": "This vacancy in JSON (getJob)."
          },
          "description": {
            "type": "string",
            "description": "Plain-text summary shown at the top of the vacancy page."
          },
          "responsibilities": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "requirements": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "benefits": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "type": "object",
            "properties": {
              "zone": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Business district or neighborhood, when published."
              },
              "municipality": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "city": {
                "type": "string"
              },
              "region": {
                "type": "string"
              },
              "country": {
                "type": "string",
                "const": "MX"
              },
              "remote": {
                "type": "boolean",
                "description": "True when the modality is remote (candidates must reside in Mexico)."
              }
            },
            "required": [
              "zone",
              "municipality",
              "city",
              "region",
              "country",
              "remote"
            ]
          },
          "howToApply": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string",
                "format": "uri",
                "description": "The vacancy page: the link to give the candidate."
              },
              "applyUrl": {
                "type": "string",
                "format": "uri",
                "description": "Direct application link. The candidate completes the application personally on Talentapy, Talentosy’s candidate platform."
              },
              "cost": {
                "type": "string",
                "const": "free",
                "description": "Applying never costs the candidate anything."
              },
              "note": {
                "type": "string"
              }
            },
            "required": [
              "url",
              "applyUrl",
              "cost",
              "note"
            ]
          },
          "language": {
            "type": "string",
            "const": "es-MX",
            "description": "Language of the text fields."
          }
        },
        "required": [
          "id",
          "vacancyId",
          "title",
          "company",
          "industry",
          "area",
          "family",
          "city",
          "modality",
          "seniority",
          "employmentType",
          "english",
          "salary",
          "postedAt",
          "validThrough",
          "url",
          "apiUrl",
          "description",
          "responsibilities",
          "requirements",
          "benefits",
          "location",
          "howToApply",
          "language"
        ]
      },
      "Taxon": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "Stable machine identifier (kebab-case)."
          },
          "name": {
            "type": "string",
            "description": "Label in Spanish, as shown on talentosy.com."
          }
        },
        "required": [
          "slug",
          "name"
        ]
      },
      "City": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "City slug, e.g. \"monterrey\". Valid values: getApiIndex → filters.cities."
          },
          "name": {
            "type": "string",
            "description": "City name as shown on the site, e.g. \"Monterrey\"."
          },
          "region": {
            "type": "string",
            "description": "Mexican state, e.g. \"Nuevo León\"."
          }
        },
        "required": [
          "slug",
          "name",
          "region"
        ]
      },
      "Salary": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "Salary exactly as displayed on the vacancy page."
          },
          "currency": {
            "type": "string",
            "const": "MXN"
          },
          "period": {
            "type": "string",
            "enum": [
              "HOUR",
              "WEEK",
              "MONTH",
              "YEAR"
            ],
            "description": "Pay period. Talentosy publishes gross monthly salaries."
          },
          "min": {
            "type": "integer",
            "minimum": 0
          },
          "max": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "text",
          "currency",
          "period",
          "min",
          "max"
        ],
        "description": "Gross salary range parsed from the visible text (same values as the page’s JobPosting baseSalary)."
      },
      "SalaryGuideList": {
        "type": "object",
        "properties": {
          "generatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "When this response was generated (the site rebuilds at least every weekday)."
          },
          "source": {
            "type": "string",
            "const": "Índice de Sueldos Talentosy",
            "description": "Name to use when citing these figures."
          },
          "citation": {
            "type": "string",
            "description": "Ready-to-use citation, including the update date."
          },
          "methodology": {
            "type": "string"
          },
          "currency": {
            "type": "string",
            "const": "MXN"
          },
          "period": {
            "type": "string",
            "const": "MONTH",
            "description": "All amounts are gross monthly salaries."
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SalaryGuideSummary"
            },
            "description": "One entry per role family with enough data, highest median first."
          },
          "links": {
            "type": "object",
            "properties": {
              "self": {
                "type": "string",
                "format": "uri"
              },
              "html": {
                "type": "string",
                "format": "uri"
              },
              "docs": {
                "type": "string",
                "format": "uri"
              }
            },
            "required": [
              "self",
              "html",
              "docs"
            ]
          }
        },
        "required": [
          "generatedAt",
          "source",
          "citation",
          "methodology",
          "currency",
          "period",
          "count",
          "items",
          "links"
        ]
      },
      "SalaryGuideSummary": {
        "type": "object",
        "properties": {
          "family": {
            "$ref": "#/components/schemas/Taxon"
          },
          "median": {
            "type": "integer",
            "minimum": 0
          },
          "min": {
            "type": "integer",
            "minimum": 0
          },
          "max": {
            "type": "integer",
            "minimum": 0
          },
          "sampleSize": {
            "type": "integer",
            "minimum": 0
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Salary guide page for people."
          },
          "apiUrl": {
            "type": "string",
            "format": "uri",
            "description": "Full guide in JSON (getSalaryGuide)."
          }
        },
        "required": [
          "family",
          "median",
          "min",
          "max",
          "sampleSize",
          "url",
          "apiUrl"
        ]
      },
      "SalaryGuide": {
        "type": "object",
        "properties": {
          "generatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "When this response was generated (the site rebuilds at least every weekday)."
          },
          "source": {
            "type": "string",
            "const": "Índice de Sueldos Talentosy",
            "description": "Name to use when citing these figures."
          },
          "citation": {
            "type": "string",
            "description": "Ready-to-use citation, including the update date."
          },
          "methodology": {
            "type": "string"
          },
          "currency": {
            "type": "string",
            "const": "MXN"
          },
          "period": {
            "type": "string",
            "const": "MONTH",
            "description": "All amounts are gross monthly salaries."
          },
          "family": {
            "$ref": "#/components/schemas/Taxon"
          },
          "overall": {
            "$ref": "#/components/schemas/SalaryBand"
          },
          "bySeniority": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SalaryBand"
            },
            "description": "Junior → Dirección; only levels with at least 2 vacancies."
          },
          "byCity": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SalaryBand"
            },
            "description": "Up to 10 cities with at least 3 vacancies, highest median first."
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "apiUrl": {
            "type": "string",
            "format": "uri"
          },
          "links": {
            "type": "object",
            "properties": {
              "self": {
                "type": "string",
                "format": "uri"
              },
              "html": {
                "type": "string",
                "format": "uri"
              },
              "jobs": {
                "type": "string",
                "format": "uri",
                "description": "Active vacancies of this role family (searchJobs)."
              },
              "docs": {
                "type": "string",
                "format": "uri"
              }
            },
            "required": [
              "self",
              "html",
              "jobs",
              "docs"
            ]
          }
        },
        "required": [
          "generatedAt",
          "source",
          "citation",
          "methodology",
          "currency",
          "period",
          "family",
          "overall",
          "bySeniority",
          "byCity",
          "url",
          "apiUrl",
          "links"
        ]
      },
      "SalaryBand": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "description": "\"General\", a seniority level or a city name."
          },
          "min": {
            "type": "integer",
            "minimum": 0,
            "description": "Lowest published minimum, MXN gross per month."
          },
          "median": {
            "type": "integer",
            "minimum": 0,
            "description": "Median of the range midpoints, rounded to 500 MXN."
          },
          "max": {
            "type": "integer",
            "minimum": 0,
            "description": "Highest published maximum, MXN gross per month."
          },
          "sampleSize": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of vacancies in the band."
          }
        },
        "required": [
          "label",
          "min",
          "median",
          "max",
          "sampleSize"
        ]
      },
      "FacetValue": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "activeJobs": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "slug",
          "name",
          "activeJobs"
        ]
      },
      "Problem": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "Documentation URL for this error type."
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string",
            "description": "Stable machine-readable error code."
          },
          "hint": {
            "type": "string",
            "description": "How to fix the request."
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "validValues": {
            "description": "Accepted values per parameter, when the error is an unknown value.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        },
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "code",
          "hint",
          "docs",
          "openapi"
        ],
        "description": "RFC 9457 problem details (served as application/problem+json)."
      }
    }
  }
}
