{
  "openapi": "3.1.1",
  "info": {
    "title": "Joonow API",
    "description": "Read-only access to open jobs (mostly in Brazil), hiring companies and the Joonow Job Market Index. Without a key: 10 calls per minute per IP. With a free key (account area, \"Developers\"): 60 per minute and 10,000 per day. Credit Joonow with attribution.text linked to attribution.url, and link each job's url.",
    "termsOfService": "https://www.joonow.com/en/api-terms",
    "contact": {
      "name": "Joonow",
      "url": "https://www.joonow.com/en/developers"
    },
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://www.joonow.com"
    }
  ],
  "paths": {
    "/api/v1/jobs": {
      "get": {
        "tags": [
          "Joonow API v1"
        ],
        "summary": "Search open jobs",
        "description": "Same filters as the website search. Multi-value filters accept the key repeated (work=Remote&work=Hybrid) or comma-separated values. Credit \"Vagas via Joonow\" with the link of each job (attribution).",
        "operationId": "searchJobs",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "Keywords or a short phrase (job title, company, skill). Up to 200 characters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "l",
            "in": "query",
            "description": "City or Brazilian state (UF); repeat or comma-separate for several (any of them matches).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "work",
            "in": "query",
            "description": "Work model: Remote, Hybrid, OnSite, or Anywhere (remote jobs open to applicants from anywhere; with country, also remote jobs from abroad open to that country).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "type",
            "in": "query",
            "description": "Contract: FullTime, PartTime, Contractor, Temporary, Intern, Volunteer, PerDiem, Other.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "level",
            "in": "query",
            "description": "Seniority: Apprentice, Intern, Entry, Operational, Professional, Management, Executive.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "days",
            "in": "query",
            "description": "Posted in the last N days (1 to 365).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "salary",
            "in": "query",
            "description": "Minimum monthly salary in the search currency (only jobs with a published salary in that currency, no exchange rates).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "relevance (default), date or salary.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of the jobs: pt, en or es (default: all).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Jobs per page, 1 to 50 (default 20).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "The nextCursor value of the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "description": "Country (ISO 3166-1 alpha-2, Americas only: BR, US, MX, CA, AR...): the jobs of that country, like its section on the website. Remote jobs open to anyone come only with work=Anywhere. Default: every country in the Americas.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "description": "Currency of salary and of sort=salary (ISO 4217: BRL, USD, MXN, CAD...). Default: the currency of country; without country, BRL.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiJobList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/jobs/{id}": {
      "get": {
        "tags": [
          "Joonow API v1"
        ],
        "summary": "Get one open job by id",
        "operationId": "getJob",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiJob"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/companies/{id}": {
      "get": {
        "tags": [
          "Joonow API v1"
        ],
        "summary": "Get a hiring company: its numbers and the first page of its open jobs",
        "operationId": "getCompany",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Jobs on the first page, 1 to 50 (default 20).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiCompany"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/companies/{id}/jobs": {
      "get": {
        "tags": [
          "Joonow API v1"
        ],
        "summary": "Open jobs of a company, with cursor pagination",
        "operationId": "getCompanyJobs",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Jobs per page, 1 to 50 (default 20).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "The nextCursor value of the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiJobList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/market-index": {
      "get": {
        "tags": [
          "Joonow API v1"
        ],
        "summary": "Joonow Job Market Index: latest edition (or the preliminary numbers of the month)",
        "operationId": "getMarketIndex",
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of the links: pt, en or es (default pt).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiMarketEdition"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/market-index/editions": {
      "get": {
        "tags": [
          "Joonow API v1"
        ],
        "summary": "Published monthly editions of the Joonow Job Market Index",
        "operationId": "listMarketIndexEditions",
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "Language of the links: pt, en or es (default pt).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiMarketEditionList"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/market-index/{edition}": {
      "get": {
        "tags": [
          "Joonow API v1"
        ],
        "summary": "One monthly edition of the Joonow Job Market Index (yyyy-MM)",
        "operationId": "getMarketIndexEdition",
        "parameters": [
          {
            "name": "edition",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language of the links: pt, en or es (default pt).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiMarketEdition"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/trends/stories": {
      "get": {
        "tags": [
          "Joonow API v1"
        ],
        "summary": "Joonow Trends: the latest data stories, daily briefs and surveys",
        "operationId": "listAgoraStories",
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "description": "pt-br, en or es (default pt-br).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "description": "Country, ISO 3166-1 alpha-2 (default: the country of the language).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "role",
            "in": "query",
            "description": "Role slug (e.g. 'vendedor') to keep only stories about it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "city",
            "in": "query",
            "description": "City slug (e.g. 'campinas-sp') to keep only stories about it.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "1 to 50 (default 20).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiAgoraPieceList"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/trends/insights": {
      "get": {
        "tags": [
          "Joonow API v1"
        ],
        "summary": "Joonow Trends: what changed for a role and/or a city (role x-ray, who is hiring, latest stories)",
        "operationId": "getAgoraInsights",
        "parameters": [
          {
            "name": "role",
            "in": "query",
            "description": "Job title in plain words (e.g. 'vendedor', 'auxiliar administrativo').",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "city",
            "in": "query",
            "description": "City, as 'Campinas, SP' or 'Campinas - SP'.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "description": "Country, ISO 3166-1 alpha-2 (default BR).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiMarketInsights"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ApiAgoraFact": {
        "required": [
          "name",
          "value",
          "display"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "value": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "display": {
            "type": "string"
          }
        },
        "description": "A number used in a Joonow Trends piece, already formatted in the piece's language."
      },
      "ApiAgoraPiece": {
        "required": [
          "id",
          "kind",
          "title",
          "summary",
          "url",
          "markdownUrl",
          "country",
          "language",
          "publishedAt",
          "updatedAt",
          "dataDay",
          "facts"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "description": "Story, Brief, Hiring, Demand, Xray, Survey, Season, Explainer or Guide."
          },
          "title": {
            "type": "string"
          },
          "summary": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Three self-contained sentences with date, place, number and source: quote these."
          },
          "url": {
            "type": "string",
            "description": "The piece on joonow.com (link it when you use the data)."
          },
          "markdownUrl": {
            "type": "string",
            "description": "The piece in Markdown."
          },
          "country": {
            "type": "string",
            "description": "Country (ISO 3166-1 alpha-2)."
          },
          "language": {
            "type": "string",
            "description": "pt-br, en or es."
          },
          "publishedAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "dataDay": {
            "type": "string",
            "description": "Day of the data (the daily snapshot used).",
            "format": "date"
          },
          "facts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAgoraFact"
            }
          }
        },
        "description": "A Joonow Trends piece: a data story, the daily brief, a live page (who is hiring, demand and supply, role x-ray) or the Candidate Voice Survey."
      },
      "ApiAgoraPieceList": {
        "required": [
          "items",
          "attribution"
        ],
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAgoraPiece"
            }
          },
          "attribution": {
            "$ref": "#/components/schemas/ApiAttribution"
          }
        }
      },
      "ApiAttribution": {
        "required": [
          "text",
          "url"
        ],
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "Text to show next to the data, linked to the url."
          },
          "url": {
            "type": "string",
            "description": "Link to Joonow (the job, the company or the search)."
          }
        },
        "description": "How to credit Joonow when showing this data (required by the API terms)."
      },
      "ApiCity": {
        "required": [
          "name",
          "region",
          "count"
        ],
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "region": {
            "type": [
              "null",
              "string"
            ]
          },
          "count": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          }
        }
      },
      "ApiCompany": {
        "required": [
          "id",
          "name",
          "url",
          "jobs",
          "attribution"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Canonical company page on Joonow."
          },
          "logo": {
            "type": [
              "null",
              "string"
            ]
          },
          "claimed": {
            "type": "boolean",
            "description": "Page claimed by the company itself."
          },
          "verifiedDomain": {
            "type": [
              "null",
              "string"
            ],
            "description": "Domain confirmed by a corporate email."
          },
          "about": {
            "type": [
              "null",
              "string"
            ],
            "description": "About the company (plain text): written by the company when it claimed the page, or gathered from public sources (see profileSource)."
          },
          "industry": {
            "type": [
              "null",
              "string"
            ]
          },
          "sector": {
            "type": [
              "null",
              "string"
            ],
            "description": "Sector code from a fixed list (agribusiness, finance, health, technology...), from the automatic profile."
          },
          "size": {
            "type": [
              "null",
              "string"
            ],
            "description": "Employee range: Micro (1-9), Small (10-49), Medium (50-249), Large (250-999) or Enterprise (1,000+)."
          },
          "foundedYear": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "headquarters": {
            "type": [
              "null",
              "string"
            ]
          },
          "profileSource": {
            "type": [
              "null",
              "string"
            ],
            "description": "Where the profile (about, website, links, logo) came from: \"company\" (the claimed page) or \"public-sources\" (gathered automatically from the company's website, its job boards and open data)."
          },
          "links": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiCompanyLinks"
              }
            ]
          },
          "jobCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "cityCount": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "jobsWithSalary": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "newestPostedAt": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "cities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCity"
            }
          },
          "workModels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCount"
            }
          },
          "employmentTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCount"
            }
          },
          "topTitles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCount"
            }
          },
          "salaries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCompanySalary"
            },
            "description": "Published salary ranges (BRL per month), by job title."
          },
          "jobs": {
            "description": "First page of open jobs; more at /api/v1/companies/{id}/jobs.",
            "$ref": "#/components/schemas/ApiJobList"
          },
          "attribution": {
            "$ref": "#/components/schemas/ApiAttribution"
          }
        }
      },
      "ApiCompanyLinks": {
        "type": "object",
        "properties": {
          "website": {
            "type": [
              "null",
              "string"
            ]
          },
          "linkedIn": {
            "type": [
              "null",
              "string"
            ]
          },
          "instagram": {
            "type": [
              "null",
              "string"
            ]
          },
          "facebook": {
            "type": [
              "null",
              "string"
            ]
          },
          "x": {
            "type": [
              "null",
              "string"
            ]
          },
          "youTube": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "ApiCompanyRef": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "null",
              "string"
            ],
            "description": "Public company id (10 characters); null when the job has no identified company."
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": [
              "null",
              "string"
            ],
            "description": "Company page on Joonow."
          },
          "logo": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      },
      "ApiCompanySalary": {
        "required": [
          "title",
          "min",
          "max",
          "count"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "min": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "max": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "count": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          }
        }
      },
      "ApiCount": {
        "required": [
          "value",
          "count"
        ],
        "type": "object",
        "properties": {
          "value": {
            "type": "string"
          },
          "count": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          }
        }
      },
      "ApiJob": {
        "required": [
          "markdownUrl",
          "attribution",
          "id",
          "title",
          "url",
          "applyUrl",
          "company",
          "location",
          "workModel",
          "employmentType",
          "seniority",
          "language"
        ],
        "type": "object",
        "properties": {
          "description": {
            "type": [
              "null",
              "string"
            ],
            "description": "Description as plain text."
          },
          "descriptionHtml": {
            "type": [
              "null",
              "string"
            ],
            "description": "Description as HTML, cleaned by a tag allowlist. Sanitize it again before showing it on your site."
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "markdownUrl": {
            "type": "string",
            "description": "Markdown version of the job page."
          },
          "attribution": {
            "$ref": "#/components/schemas/ApiAttribution"
          },
          "id": {
            "type": "string",
            "description": "Public job id (10 characters)."
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Canonical URL of the job on Joonow. Use this link when showing the job."
          },
          "applyUrl": {
            "type": "string",
            "description": "Apply link through Joonow (external jobs redirect to the employer site)."
          },
          "company": {
            "$ref": "#/components/schemas/ApiCompanyRef"
          },
          "location": {
            "$ref": "#/components/schemas/ApiLocation"
          },
          "workModel": {
            "type": "string",
            "description": "OnSite, Hybrid, Remote or Unknown."
          },
          "remote": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "Where a remote job can be done from (only for remote jobs; null otherwise).",
                "$ref": "#/components/schemas/ApiRemote"
              }
            ]
          },
          "employmentType": {
            "type": "string",
            "description": "FullTime, PartTime, Contractor, Temporary, Intern, Volunteer, PerDiem, Other or Unknown."
          },
          "seniority": {
            "type": "string",
            "description": "Apprentice, Intern, Entry, Operational, Professional, Management, Executive or Unknown."
          },
          "salary": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "Salary published by the employer; null when not published.",
                "$ref": "#/components/schemas/ApiSalary"
              }
            ]
          },
          "language": {
            "type": "string",
            "description": "Language of the job posting: pt, en or es."
          },
          "postedAt": {
            "type": "string",
            "format": "date-time"
          },
          "validThrough": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "native": {
            "type": "boolean",
            "description": "Job posted directly on Joonow (apply on Joonow itself)."
          }
        }
      },
      "ApiJobList": {
        "required": [
          "data",
          "attribution"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiJobSummary"
            }
          },
          "total": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Total matching jobs (up to 10,000).",
            "format": "int64"
          },
          "totalIsLowerBound": {
            "type": "boolean",
            "description": "True when there are more jobs than the total."
          },
          "nextCursor": {
            "type": [
              "null",
              "string"
            ],
            "description": "Cursor of the next page (cursor parameter); null on the last one. Search goes up to 50 pages."
          },
          "attribution": {
            "$ref": "#/components/schemas/ApiAttribution"
          }
        }
      },
      "ApiJobSummary": {
        "required": [
          "id",
          "title",
          "url",
          "applyUrl",
          "company",
          "location",
          "workModel",
          "employmentType",
          "seniority",
          "language"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public job id (10 characters)."
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Canonical URL of the job on Joonow. Use this link when showing the job."
          },
          "applyUrl": {
            "type": "string",
            "description": "Apply link through Joonow (external jobs redirect to the employer site)."
          },
          "company": {
            "$ref": "#/components/schemas/ApiCompanyRef"
          },
          "location": {
            "$ref": "#/components/schemas/ApiLocation"
          },
          "workModel": {
            "type": "string",
            "description": "OnSite, Hybrid, Remote or Unknown."
          },
          "remote": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "Where a remote job can be done from (only for remote jobs; null otherwise).",
                "$ref": "#/components/schemas/ApiRemote"
              }
            ]
          },
          "employmentType": {
            "type": "string",
            "description": "FullTime, PartTime, Contractor, Temporary, Intern, Volunteer, PerDiem, Other or Unknown."
          },
          "seniority": {
            "type": "string",
            "description": "Apprentice, Intern, Entry, Operational, Professional, Management, Executive or Unknown."
          },
          "salary": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "Salary published by the employer; null when not published.",
                "$ref": "#/components/schemas/ApiSalary"
              }
            ]
          },
          "language": {
            "type": "string",
            "description": "Language of the job posting: pt, en or es."
          },
          "postedAt": {
            "type": "string",
            "format": "date-time"
          },
          "validThrough": {
            "type": [
              "null",
              "string"
            ],
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "native": {
            "type": "boolean",
            "description": "Job posted directly on Joonow (apply on Joonow itself)."
          }
        }
      },
      "ApiLocation": {
        "required": [
          "country"
        ],
        "type": "object",
        "properties": {
          "city": {
            "type": [
              "null",
              "string"
            ]
          },
          "region": {
            "type": [
              "null",
              "string"
            ],
            "description": "Brazilian state (UF) or region."
          },
          "country": {
            "type": "string",
            "description": "Country (ISO 3166-1 alpha-2)."
          }
        }
      },
      "ApiMarketComparison": {
        "required": [
          "edition",
          "activeJobs",
          "newJobs",
          "remoteShare",
          "hybridShare",
          "salaryShare",
          "medianSalary"
        ],
        "type": "object",
        "properties": {
          "edition": {
            "type": "string"
          },
          "activeJobs": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "newJobs": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "remoteShare": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "hybridShare": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "salaryShare": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "medianSalary": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          }
        }
      },
      "ApiMarketEdition": {
        "required": [
          "edition",
          "url",
          "methodologyUrl",
          "license",
          "attribution"
        ],
        "type": "object",
        "properties": {
          "edition": {
            "type": "string",
            "description": "Edition (yyyy-MM)."
          },
          "preliminary": {
            "type": "boolean",
            "description": "Preliminary: current month, before the month-end snapshot."
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "periodStart": {
            "type": "string",
            "format": "date-time"
          },
          "periodEnd": {
            "type": "string",
            "format": "date-time"
          },
          "methodology": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "activeJobs": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "description": "Active jobs without duplicates.",
            "format": "int64"
          },
          "listings": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "companies": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "newJobs": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "remoteShare": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "hybridShare": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "salaryShare": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "jobsWithSalary": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "salary": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "Quartiles of the monthly salary in BRL; null when the sample is small.",
                "$ref": "#/components/schemas/ApiSalaryStats"
              }
            ]
          },
          "regions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCount"
            }
          },
          "cities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCity"
            }
          },
          "titles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCount"
            }
          },
          "workModels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCount"
            }
          },
          "employmentTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCount"
            }
          },
          "seniorities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiCount"
            }
          },
          "salaryByTitle": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiTitleSalary"
            }
          },
          "previous": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiMarketComparison"
              }
            ]
          },
          "url": {
            "type": "string",
            "description": "Page of the edition."
          },
          "csvUrl": {
            "type": [
              "null",
              "string"
            ]
          },
          "methodologyUrl": {
            "type": "string"
          },
          "license": {
            "type": "string",
            "description": "License of the data."
          },
          "attribution": {
            "$ref": "#/components/schemas/ApiAttribution"
          }
        }
      },
      "ApiMarketEditionList": {
        "required": [
          "data",
          "attribution"
        ],
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiMarketEditionRef"
            }
          },
          "attribution": {
            "$ref": "#/components/schemas/ApiAttribution"
          }
        }
      },
      "ApiMarketEditionRef": {
        "required": [
          "edition",
          "computedAt",
          "activeJobs",
          "newJobs",
          "url"
        ],
        "type": "object",
        "properties": {
          "edition": {
            "type": "string"
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "activeJobs": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "newJobs": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "url": {
            "type": "string"
          }
        }
      },
      "ApiMarketInsights": {
        "required": [
          "country",
          "stories",
          "attribution"
        ],
        "type": "object",
        "properties": {
          "role": {
            "type": [
              "null",
              "string"
            ],
            "description": "Role slug matched from the query (e.g. 'vendedor'); null when the text did not match a role."
          },
          "city": {
            "type": [
              "null",
              "string"
            ],
            "description": "City slug matched from the query (e.g. 'campinas-sp'); null without a city."
          },
          "country": {
            "type": "string"
          },
          "roleXray": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "The role x-ray (open jobs, new jobs, top cities and employers, salary, demand): null when the role has fewer than 30 jobs.",
                "$ref": "#/components/schemas/ApiAgoraPiece"
              }
            ]
          },
          "whoIsHiring": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "description": "Employers with the most new jobs in the city (or the country) in the last 7 days.",
                "$ref": "#/components/schemas/ApiAgoraPiece"
              }
            ]
          },
          "stories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAgoraPiece"
            },
            "description": "The latest data stories about the role or the city."
          },
          "attribution": {
            "$ref": "#/components/schemas/ApiAttribution"
          }
        },
        "description": "What changed for a role and/or a city in the job market, from Joonow's daily count of open jobs."
      },
      "ApiRemote": {
        "required": [
          "scope"
        ],
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "description": "Country (remote only in the job's country), Region (remote in the regions or countries listed) or Anywhere (remote from anywhere)."
          },
          "regions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Regions of a Region scope: LATAM, NORAM (North America), SOUTHAM, CENTAM, CARIB, AMER (the Americas), EUROPE, EMEA, APAC."
          },
          "countries": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Countries (ISO 3166-1 alpha-2) whose residents can apply: the job's country, the countries of the regions, or empty for Anywhere."
          }
        }
      },
      "ApiSalary": {
        "required": [
          "currency",
          "period"
        ],
        "type": "object",
        "properties": {
          "min": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "max": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "null",
              "number",
              "string"
            ],
            "format": "double"
          },
          "currency": {
            "type": "string",
            "description": "Currency (ISO 4217)."
          },
          "period": {
            "type": "string",
            "description": "Hour, Day, Week, Month, Year or Unknown."
          }
        }
      },
      "ApiSalaryStats": {
        "required": [
          "sample",
          "p25",
          "p50",
          "p75"
        ],
        "type": "object",
        "properties": {
          "sample": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "integer",
              "string"
            ],
            "format": "int64"
          },
          "p25": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "p50": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          },
          "p75": {
            "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$",
            "type": [
              "number",
              "string"
            ],
            "format": "double"
          }
        }
      },
      "ApiTitleSalary": {
        "required": [
          "title",
          "stats"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "stats": {
            "$ref": "#/components/schemas/ApiSalaryStats"
          }
        }
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": [
              "null",
              "string"
            ]
          },
          "title": {
            "type": [
              "null",
              "string"
            ]
          },
          "status": {
            "pattern": "^-?(?:0|[1-9]\\d*)$",
            "type": [
              "null",
              "integer",
              "string"
            ],
            "format": "int32"
          },
          "detail": {
            "type": [
              "null",
              "string"
            ]
          },
          "instance": {
            "type": [
              "null",
              "string"
            ]
          }
        }
      }
    },
    "securitySchemes": {
      "apiKey": {
        "type": "apiKey",
        "description": "Optional key (jnk_...). Authorization: Bearer jnk_... also works.",
        "name": "X-Api-Key",
        "in": "header"
      }
    }
  },
  "security": [
    {
      "apiKey": [ ]
    },
    { }
  ],
  "tags": [
    {
      "name": "Joonow API v1"
    }
  ]
}