{
  "openapi": "3.1.0",
  "info": {
    "title": "Glassdoor API",
    "version": "1.0.0",
    "description": "Company ratings, employee reviews, reported pay and candidate interview reports from Glassdoor, exposed through FetchLayer as structured JSON."
  },
  "servers": [
    {
      "url": "https://api.fetchlayer.dev/glassdoor"
    }
  ],
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "API Key",
        "description": "Send your FetchLayer key as Authorization: Bearer ss-your-key."
      }
    }
  },
  "paths": {
    "/search-companies": {
      "post": {
        "operationId": "search-companies",
        "tags": [
          "Companies"
        ],
        "summary": "Find companies by name",
        "description": "Look up companies on Glassdoor by company or brand name. Each match comes back with the employer id that every other endpoint takes, plus its overall rating, review and salary counts, industry, headquarters, employee-count band, logo and website. This is the entry point: run it once for a company, keep the employerId, and fan out to the ratings profile, the reviews, the salaries and the interview reports.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "description": "Company or brand name to look up."
                  },
                  "limit": {
                    "type": "number",
                    "description": "Maximum companies returned (max 100), or -1 for everything available.",
                    "example": "30"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "query"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "query": "Stripe",
                    "limit": 5
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "query": {
                      "type": "string",
                      "description": "The name this search actually ran with."
                    },
                    "companies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "employerId": {
                            "type": "string",
                            "description": "Pass this as company to every other endpoint."
                          },
                          "name": {
                            "type": "string",
                            "description": "Company name as Glassdoor publishes it."
                          },
                          "glassdoorUrl": {
                            "type": "string",
                            "description": "Public Glassdoor overview page for the company."
                          },
                          "reviewsUrl": {
                            "type": "string",
                            "description": "Public Glassdoor reviews page for the company."
                          },
                          "industry": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Industry Glassdoor files the company under."
                          },
                          "headquarters": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Headquarters location as published."
                          },
                          "companySize": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Employee-count band, for example \"10000+ Employees\"."
                          },
                          "overallRating": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Overall rating on the published 1-5 scale."
                          },
                          "reviewCount": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Reviews published for the company."
                          },
                          "salaryCount": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Salaries reported for the company."
                          }
                        }
                      },
                      "description": "The matching companies."
                    },
                    "companyCount": {
                      "type": "number",
                      "description": "Number of companies in this response."
                    },
                    "requestedUrl": {
                      "type": "string",
                      "description": "The Glassdoor page this result corresponds to."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the page was collected, as an ISO 8601 timestamp."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Plain-language caveats about this particular result — a walk that stopped short, a listing with more pages, an upstream limit that was hit. Read it: a well-formed response can still be incomplete, and this is where that is said."
                    },
                    "blocked": {
                      "type": "boolean",
                      "description": "Always false on a successful response."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "query": "Stripe",
                      "companyCount": 2,
                      "companies": [
                        {
                          "employerId": "671954",
                          "name": "Stripe",
                          "glassdoorUrl": "https://www.glassdoor.com/Overview/Working-at-Stripe-EI_IE671954.11,17.htm",
                          "industry": "Financial Transaction Processing",
                          "headquarters": "South San Francisco, CA",
                          "companySize": "1001 to 5000 Employees",
                          "overallRating": 4.1,
                          "reviewCount": 1284,
                          "salaryCount": 3907
                        }
                      ],
                      "notes": []
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing Bearer token"
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/company-profile": {
      "post": {
        "operationId": "company-profile",
        "tags": [
          "Companies"
        ],
        "summary": "Get a company's ratings profile",
        "description": "Return one company's overall and per-category ratings on the published 1-5 scale — career opportunities, compensation and benefits, culture and values, diversity and inclusion, senior management, work-life balance — with the full star distribution behind each average, the review counts they rest on, the shares of reviewers who approve of the CEO, would recommend the company and expect a positive six-month outlook, and the rated CEO. This is the one call that gives you a company's employer brand as numbers, without paging through a single review.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company": {
                    "type": "string",
                    "description": "Glassdoor company id, or any Glassdoor URL containing one. Use /search-companies to turn a name into an id."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "company"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "company": "671954"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "profile": {
                      "type": "object",
                      "properties": {
                        "employerId": {
                          "type": "string",
                          "description": "The company these ratings belong to."
                        },
                        "name": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Company name as published."
                        },
                        "ratings": {
                          "type": "object",
                          "additionalProperties": true,
                          "description": "Per-category averages on the 1-5 scale: overall, careerOpportunities, compensationAndBenefits, cultureAndValues, diversityAndInclusion, seniorManagement, workLifeBalance."
                        },
                        "ratingDistribution": {
                          "type": "object",
                          "additionalProperties": true,
                          "description": "For each of those categories, how many reviewers gave one, two, three, four and five stars."
                        },
                        "reviewCount": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Reviews behind the published averages."
                        },
                        "ratedReviewCount": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Written reviews the reviews listing pages through. Smaller than reviewCount — a rating without written text still moves the average."
                        },
                        "ceoApprovalRate": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Share of reviewers approving of the CEO, from 0 to 1."
                        },
                        "recommendToFriendRate": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Share of reviewers who would recommend the company to a friend, from 0 to 1."
                        },
                        "businessOutlookRate": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Share of reviewers with a positive six-month business outlook, from 0 to 1."
                        },
                        "recommendCounts": {
                          "type": "object",
                          "additionalProperties": true,
                          "description": "Raw recommend and wontRecommend counts behind the rate."
                        },
                        "ceo": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "additionalProperties": true,
                          "description": "The rated CEO: name, title and photo URL."
                        }
                      },
                      "additionalProperties": false
                    },
                    "requestedUrl": {
                      "type": "string",
                      "description": "The Glassdoor page this result corresponds to."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the page was collected, as an ISO 8601 timestamp."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Plain-language caveats about this particular result — a walk that stopped short, a listing with more pages, an upstream limit that was hit. Read it: a well-formed response can still be incomplete, and this is where that is said."
                    },
                    "blocked": {
                      "type": "boolean",
                      "description": "Always false on a successful response."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "profile": {
                        "employerId": "671954",
                        "name": "Stripe",
                        "ratings": {
                          "overall": 4.1,
                          "cultureAndValues": 4.2,
                          "workLifeBalance": 3.6,
                          "compensationAndBenefits": 4.4,
                          "seniorManagement": 3.7
                        },
                        "reviewCount": 1284,
                        "ratedReviewCount": 912,
                        "ceoApprovalRate": 0.87,
                        "recommendToFriendRate": 0.79,
                        "businessOutlookRate": 0.68,
                        "ceo": {
                          "name": "Patrick Collison",
                          "title": "CEO"
                        }
                      },
                      "notes": []
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing Bearer token"
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/company-reviews": {
      "post": {
        "operationId": "company-reviews",
        "tags": [
          "Reviews"
        ],
        "summary": "Get a company's employee reviews",
        "description": "Return employee reviews for one company: the reviewer's own headline, their pros, cons and advice to management, their overall and per-category stars, whether they approve of the CEO, would recommend the company and expect a positive outlook, their job title, location, employment status and tenure, helpful counts, and any public employer reply. Walk several pages in one request with pages, or pass a response's nextCursor back as cursor to resume later. sortBy orders the reviews inside the response you get back — the sort is applied locally over the window that was collected, not across every review the company has.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company": {
                    "type": "string",
                    "description": "Glassdoor company id, or any Glassdoor URL containing one. Use /search-companies to turn a name into an id."
                  },
                  "limit": {
                    "type": "number",
                    "description": "Maximum reviews returned (max 2000), or -1 for everything available.",
                    "example": "30"
                  },
                  "pages": {
                    "type": "number",
                    "description": "Pages of results to collect in one request (max 100), or -1 for the maximum allowed. Each page counts as one request against your plan.",
                    "example": "1"
                  },
                  "cursor": {
                    "type": "string",
                    "description": "Resume from a previous response's nextCursor."
                  },
                  "delayMs": {
                    "type": "number",
                    "description": "Milliseconds to wait between pages (max 30000)."
                  },
                  "sortBy": {
                    "type": "string",
                    "description": "date, rating, helpful or none. Applied locally over the reviews this response collected, not across the whole listing.",
                    "example": "none"
                  },
                  "sortDirection": {
                    "type": "string",
                    "description": "asc or desc.",
                    "example": "desc"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "company"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "company": "671954",
                    "pages": 3,
                    "limit": 60,
                    "sortBy": "date",
                    "sortDirection": "desc"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "employerId": {
                      "type": "string",
                      "description": "The company these reviews belong to."
                    },
                    "companyName": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Company name as published."
                    },
                    "reviews": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "reviewId": {
                            "type": "string",
                            "description": "Stable id for the review — the key to dedupe on across runs."
                          },
                          "summary": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The reviewer's own headline."
                          },
                          "pros": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "What the reviewer liked."
                          },
                          "cons": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "What the reviewer did not."
                          },
                          "advice": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Advice the reviewer left for management."
                          },
                          "ratingOverall": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "The reviewer's overall stars, 1-5."
                          },
                          "ratings": {
                            "type": "object",
                            "additionalProperties": true,
                            "description": "The same seven categories as the company profile, but for this one reviewer."
                          },
                          "ceoRating": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "APPROVE, DISAPPROVE or NO_OPINION."
                          },
                          "recommendToFriend": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "POSITIVE, NEGATIVE or NEUTRAL."
                          },
                          "businessOutlook": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The reviewer's six-month outlook: POSITIVE, NEGATIVE or NEUTRAL."
                          },
                          "reviewedAt": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "When the review was published."
                          },
                          "jobTitle": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Role the reviewer held."
                          },
                          "location": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Where they worked, at the granularity in locationType (CITY, METRO, STATE or COUNTRY)."
                          },
                          "employmentStatus": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "How they were employed, for example REGULAR, PART_TIME or INTERN."
                          },
                          "isCurrentJob": {
                            "type": [
                              "boolean",
                              "null"
                            ],
                            "description": "Whether they still worked there when they wrote it."
                          },
                          "lengthOfEmploymentYears": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Tenure in years, as reported."
                          },
                          "helpfulCount": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "How many readers marked the review helpful."
                          },
                          "employerResponses": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "additionalProperties": true
                            },
                            "description": "Public employer replies, each with text, respondedAt and the replier's job title. Replies are sparse, so an empty list means none is published — not that the employer never replies."
                          }
                        }
                      },
                      "description": "The collected reviews."
                    },
                    "reviewCount": {
                      "type": "number",
                      "description": "Reviews in this response."
                    },
                    "totalReviewCount": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "Reviews available for this company across every page — compare it against reviewCount to see how much of the listing you have."
                    },
                    "totalPages": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "Pages the listing spans."
                    },
                    "pagesScraped": {
                      "type": "number",
                      "description": "Pages actually collected. Each one counts as a request against your plan."
                    },
                    "pagesRequested": {
                      "type": "number",
                      "description": "Pages the request asked for. Lower than pagesScraped means the listing ran out."
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Pass back as cursor to continue, or null when the listing is exhausted."
                    },
                    "hasNextPage": {
                      "type": "boolean",
                      "description": "Whether more results exist beyond this response."
                    },
                    "requestedUrl": {
                      "type": "string",
                      "description": "The Glassdoor page this result corresponds to."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the page was collected, as an ISO 8601 timestamp."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Plain-language caveats about this particular result — a walk that stopped short, a listing with more pages, an upstream limit that was hit. Read it: a well-formed response can still be incomplete, and this is where that is said."
                    },
                    "blocked": {
                      "type": "boolean",
                      "description": "Always false on a successful response."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "employerId": "671954",
                      "companyName": "Stripe",
                      "reviewCount": 30,
                      "totalReviewCount": 1284,
                      "totalPages": 129,
                      "pagesScraped": 3,
                      "pagesRequested": 3,
                      "hasNextPage": true,
                      "nextCursor": "eyJwYWdlIjo0fQ==",
                      "reviews": [
                        {
                          "reviewId": "78451203",
                          "summary": "Great engineers, heavy pace",
                          "pros": "Exceptional colleagues and genuinely interesting infrastructure problems.",
                          "cons": "Scope changes often and the on-call rotation is demanding.",
                          "ratingOverall": 4,
                          "jobTitle": "Software Engineer",
                          "location": "Dublin, Ireland",
                          "employmentStatus": "REGULAR",
                          "isCurrentJob": true,
                          "reviewedAt": "2026-08-30",
                          "helpfulCount": 12,
                          "employerResponses": []
                        }
                      ],
                      "notes": [
                        "Sorting was applied to the 30 reviews collected in this response, not across all 1284 reviews."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing Bearer token"
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/company-salaries": {
      "post": {
        "operationId": "company-salaries",
        "tags": [
          "Salaries"
        ],
        "summary": "Get reported pay by role",
        "description": "Return the roles with the most reported salaries at one company, each with base pay and total pay — base plus bonus, stock and other additional pay — at the 10th, 25th, 50th, 75th and 90th percentiles, the number of salaries behind those figures, the ISO currency code they are in, and when the newest was reported. This endpoint reads the first page of the company's salaries listing and nothing beyond it: there is no pages parameter and no cursor, because the upstream listing is not routed past page one. limit trims what comes back from that page rather than walking further, so treat the result as the most-reported roles at the company, not every role.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company": {
                    "type": "string",
                    "description": "Glassdoor company id, or any Glassdoor URL containing one. Use /search-companies to turn a name into an id."
                  },
                  "limit": {
                    "type": "number",
                    "description": "Maximum roles returned from the first page (max 200), or -1 for everything on it.",
                    "example": "30"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "company"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "company": "671954",
                    "limit": 25
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "employerId": {
                      "type": "string",
                      "description": "The company this pay belongs to."
                    },
                    "companyName": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Company name as published."
                    },
                    "roles": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "jobTitle": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Role as Glassdoor normalises it."
                          },
                          "salaryCount": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Salaries reported for this role — the sample size behind the percentiles."
                          },
                          "currency": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "ISO currency code the figures are in. Not every role at a company reports in the same currency."
                          },
                          "basePay": {
                            "type": "object",
                            "additionalProperties": true,
                            "description": "Base salary only, at p10, p25, p50, p75 and p90."
                          },
                          "totalPay": {
                            "type": "object",
                            "additionalProperties": true,
                            "description": "Base plus bonus, stock and other additional pay, at the same five percentiles."
                          },
                          "mostRecentAt": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "When the newest of these salaries was reported — how stale the benchmark is."
                          }
                        }
                      },
                      "description": "The most-reported roles on the first page of the salaries listing."
                    },
                    "roleCount": {
                      "type": "number",
                      "description": "Number of roles in this response."
                    },
                    "requestedUrl": {
                      "type": "string",
                      "description": "The Glassdoor page this result corresponds to."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the page was collected, as an ISO 8601 timestamp."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Plain-language caveats about this particular result — a walk that stopped short, a listing with more pages, an upstream limit that was hit. Read it: a well-formed response can still be incomplete, and this is where that is said."
                    },
                    "blocked": {
                      "type": "boolean",
                      "description": "Always false on a successful response."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "employerId": "671954",
                      "companyName": "Stripe",
                      "roleCount": 25,
                      "roles": [
                        {
                          "jobTitle": "Software Engineer",
                          "salaryCount": 412,
                          "currency": "USD",
                          "basePay": {
                            "p10": 148000,
                            "p25": 168000,
                            "p50": 192000,
                            "p75": 221000,
                            "p90": 254000
                          },
                          "totalPay": {
                            "p10": 182000,
                            "p25": 214000,
                            "p50": 253000,
                            "p75": 301000,
                            "p90": 358000
                          },
                          "mostRecentAt": "2026-08-28"
                        }
                      ],
                      "notes": [
                        "Salaries are read from the first page of the listing only; roles beyond it are not reachable."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing Bearer token"
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/interview-reports": {
      "post": {
        "operationId": "interview-reports",
        "tags": [
          "Interviews"
        ],
        "summary": "Get candidate interview reports",
        "description": "Return candidate-reported interview experiences at one company: the role interviewed for, the location, how difficult the candidate found it, whether they rated the experience positive, the outcome (offer accepted, offer declined, no offer), their written account of the process, how they got the interview, how many days it took end to end, and the questions they were asked. Walk several pages in one request with pages, or resume with cursor. This is the surface that tells you what a competitor's hiring loop actually looks like from the candidate's side.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "company": {
                    "type": "string",
                    "description": "Glassdoor company id, or any Glassdoor URL containing one. Use /search-companies to turn a name into an id."
                  },
                  "limit": {
                    "type": "number",
                    "description": "Maximum interview reports returned (max 1000), or -1 for everything available.",
                    "example": "30"
                  },
                  "pages": {
                    "type": "number",
                    "description": "Pages of results to collect in one request (max 100), or -1 for the maximum allowed. Each page counts as one request against your plan.",
                    "example": "1"
                  },
                  "cursor": {
                    "type": "string",
                    "description": "Resume from a previous response's nextCursor."
                  },
                  "delayMs": {
                    "type": "number",
                    "description": "Milliseconds to wait between pages (max 30000)."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "company"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "company": "671954",
                    "pages": 2,
                    "limit": 40
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "employerId": {
                      "type": "string",
                      "description": "The company these interviews were at."
                    },
                    "companyName": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Company name as published."
                    },
                    "interviews": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "interviewId": {
                            "type": "string",
                            "description": "Stable id for the report — the key to dedupe on across runs."
                          },
                          "jobTitle": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Role the candidate interviewed for."
                          },
                          "location": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Where the interview happened, at the granularity in locationType."
                          },
                          "difficulty": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "How hard the candidate found it, for example AVERAGE or VERY_DIFFICULT."
                          },
                          "experience": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "How they rated the experience: POSITIVE, NEUTRAL or NEGATIVE."
                          },
                          "outcome": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The result: ACCEPT_OFFER, DECLINE_OFFER or NO_OFFER."
                          },
                          "processDescription": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The candidate's own account of the interview process."
                          },
                          "source": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "How they got the interview, for example APPLIED_ONLINE or RECRUITER."
                          },
                          "durationDays": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Days the process took, as reported — the number to benchmark your own loop against."
                          },
                          "interviewedAt": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "When the interview took place."
                          },
                          "questions": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "additionalProperties": true
                            },
                            "description": "Questions the candidate was asked, each with its text and how many public answers it has."
                          }
                        }
                      },
                      "description": "The collected interview reports."
                    },
                    "interviewCount": {
                      "type": "number",
                      "description": "Interview reports in this response."
                    },
                    "pagesScraped": {
                      "type": "number",
                      "description": "Pages actually collected. Each one counts as a request against your plan."
                    },
                    "pagesRequested": {
                      "type": "number",
                      "description": "Pages the request asked for. Lower than pagesScraped means the listing ran out."
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Pass back as cursor to continue, or null when the listing is exhausted."
                    },
                    "hasNextPage": {
                      "type": "boolean",
                      "description": "Whether more results exist beyond this response."
                    },
                    "requestedUrl": {
                      "type": "string",
                      "description": "The Glassdoor page this result corresponds to."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the page was collected, as an ISO 8601 timestamp."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Plain-language caveats about this particular result — a walk that stopped short, a listing with more pages, an upstream limit that was hit. Read it: a well-formed response can still be incomplete, and this is where that is said."
                    },
                    "blocked": {
                      "type": "boolean",
                      "description": "Always false on a successful response."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "employerId": "671954",
                      "companyName": "Stripe",
                      "interviewCount": 20,
                      "pagesScraped": 2,
                      "pagesRequested": 2,
                      "hasNextPage": true,
                      "nextCursor": "eyJwYWdlIjozfQ==",
                      "interviews": [
                        {
                          "interviewId": "5512094",
                          "jobTitle": "Backend Engineer",
                          "location": "Remote",
                          "difficulty": "DIFFICULT",
                          "experience": "POSITIVE",
                          "outcome": "ACCEPT_OFFER",
                          "source": "APPLIED_ONLINE",
                          "durationDays": 28,
                          "interviewedAt": "2026-06-11",
                          "questions": [
                            {
                              "question": "Design a rate limiter for an idempotent payments API.",
                              "answerCount": 4
                            }
                          ]
                        }
                      ],
                      "notes": []
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing Bearer token"
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/resolve-url": {
      "post": {
        "operationId": "resolve-url",
        "tags": [
          "Utility"
        ],
        "summary": "Parse a Glassdoor URL",
        "description": "Turn any Glassdoor URL into structured input: which kind of page it names (company overview, reviews, salaries, interviews or search), the company id and name it carries, the page number it points at, and the search term if it is a search URL. The cheap way to find out what a URL someone pasted actually points at before spending a request on it. This endpoint does not consume a credit.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "Any Glassdoor URL, to be parsed into structured input."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "url"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "url": "https://www.glassdoor.com/Reviews/Stripe-Reviews-E671954_P3.htm"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "description": "The URL that was parsed."
                    },
                    "surface": {
                      "type": "string",
                      "description": "Which kind of page the URL names: company-overview, company-reviews, company-salaries, company-interviews, company-search or unknown."
                    },
                    "employerId": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The company the URL names, ready to pass as company."
                    },
                    "companySlug": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Company name as the URL spells it."
                    },
                    "page": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "The page number the URL points at, if it carries one."
                    },
                    "keyword": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The search term, for a search URL."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "url": "https://www.glassdoor.com/Reviews/Stripe-Reviews-E671954_P3.htm",
                      "surface": "company-reviews",
                      "employerId": "671954",
                      "companySlug": "Stripe",
                      "page": 3,
                      "keyword": null
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing Bearer token"
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    }
  }
}