openapi: 3.1.0
info:
  title: CareJobs.Now open data
  version: "1.0.0"
  description: >-
    Free, read-only JSON and CSV endpoints with the open US healthcare jobs CareJobs.Now reads every day from the
    career sites of about 2,000 hospitals, health systems, clinic groups and care companies, and the hourly pay those jobs post.
    No authentication, CORS enabled, refreshed daily. Data under CC BY 4.0: cite CareJobs.Now with a link.
  contact:
    name: CareJobs.Now
    email: hello@carejobs.now
    url: https://carejobs.now/data
  license:
    name: CC BY 4.0
    url: https://creativecommons.org/licenses/by/4.0/
  x-logo:
    url: https://carejobs.now/icon.svg
externalDocs:
  description: Documentation, MCP server and dataset downloads
  url: https://carejobs.now/data
servers:
  - url: https://carejobs.now
paths:
  /roles.json:
    get:
      operationId: getOpenJobs
      summary: Open healthcare jobs by kind of job and by employer
      responses:
        "200":
          description: Current counts of open jobs, split by kind of job (with posted pay where at least three employers post a rate) and by employer.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Roles"
  /pay.json:
    get:
      operationId: getPostedPay
      summary: Posted hourly pay by kind of healthcare job
      responses:
        "200":
          description: Median and typical posted hourly rates for every kind of job that at least three employers post a rate for.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Pay"
  /pay.csv:
    get:
      operationId: getPostedPayCsv
      summary: Posted hourly pay by kind of healthcare job, as a dated CSV
      responses:
        "200":
          description: The /pay.json rows as CSV (kind_of_job, median_usd_per_hour, typical_low_usd_per_hour, typical_high_usd_per_hour, distinct_rates_measured, employers_with_rates, open_jobs, open_jobs_without_hourly_rate, measured_on).
          content:
            text/csv:
              schema:
                type: string
components:
  schemas:
    Meta:
      type: object
      properties:
        name: { type: string }
        description: { type: string }
        source: { type: string, format: uri }
        license: { type: string, format: uri }
        measurement_technique: { type: string }
        limitations: { type: array, items: { type: string } }
        updated: { type: string, format: date-time }
        temporal_coverage: { type: string, description: "The day the figures describe (YYYY-MM-DD)." }
    PayBand:
      type: object
      properties:
        slug: { type: string, example: nurses }
        label: { type: string, example: "Registered Nurses & LPNs" }
        currency: { type: string, example: USD }
        unit: { type: string, example: per hour }
        median: { type: integer }
        typical_low: { type: integer }
        typical_high: { type: integer }
        rate_samples: { type: integer, description: Distinct posted hourly rates measured. }
        platforms: { type: integer, description: Employers whose jobs post a rate. }
    Pay:
      allOf:
        - $ref: "#/components/schemas/Meta"
        - type: object
          properties:
            pay_by_work_type:
              type: array
              items:
                allOf:
                  - $ref: "#/components/schemas/PayBand"
                  - type: object
                    properties:
                      open_total: { type: integer, description: Open jobs of this kind. }
                      unpriced: { type: integer, description: Open jobs of this kind that post no hourly rate. }
    Roles:
      allOf:
        - $ref: "#/components/schemas/Meta"
        - type: object
          properties:
            totals:
              type: object
              properties:
                open_roles: { type: integer }
                platforms_live: { type: integer }
                new_last_7d: { type: integer }
                new_last_7d_measurement: { type: string }
            open_by_work_type:
              type: array
              items:
                allOf:
                  - $ref: "#/components/schemas/PayBand"
                  - type: object
                    properties:
                      open_count: { type: integer }
            open_by_platform:
              type: array
              items:
                type: object
                properties:
                  slug: { type: string }
                  name: { type: string }
                  kind: { type: string, description: "employer, program or job-board" }
                  open_count: { type: integer }
