JobsPipe Labour Market Insights API

The Labour Market Insights API from JobsPipe — 10 operation(s) for labour market insights.

Operations 10

GET /v1/insights/occupations Occupations ranked by live posting volume #
GET /v1/insights/occupations/{code} Occupation snapshot #
GET /v1/insights/occupations/{code}/compensation Advertised compensation percentiles by occupation #
GET /v1/insights/occupations/{code}/skills/top Top skills by occupation #
GET /v1/insights/occupations/{code}/skills/trending Trending skills by occupation #
GET /v1/insights/industries Industries ranked by live posting volume #
GET /v1/insights/industries/{division}/skills/trending Trending skills by industry #
GET /v1/insights/skills/{slug}/trend Skill demand trend #
GET /v1/insights/technology/ai-exposure AI exposure by occupation or industry #
POST /v1/insights/salary/benchmark Salary benchmark #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/jobspipe-labour-market-insights-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

jobspipe-labour-market-insights-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: JobsPipe Labour Market Insights API
  version: 1.0.0
  description: JobsPipe is a unified data API over public job and technographic sources.
  contact:
    name: JobsPipe
    url: https://jobspipe.dev
    email: support@jobspipe.dev
servers:
- url: https://api.jobspipe.dev
security:
- apiKey: []
tags:
- name: Labour Market Insights
paths:
  /v1/insights/occupations:
    get:
      operationId: insightsOccupations
      summary: Occupations ranked by live posting volume
      tags:
      - Labour Market Insights
      x-consequence: read-only
      x-side-effects: none - consumes 1 credit from the caller's monthly quota per job returned that the account has not already paid for this calendar month
      security:
      - apiKey: []
      description: ISCO-08 occupations present in the corpus, ranked by deduplicated active posting count within the window.
      parameters:
      - name: window_days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
        description: Look-back window over posting dates, in days.
      responses:
        '200':
          description: Computed insight, measured live from deduplicated job postings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightOccupationsResponse'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Monthly request quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Per-second rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
  /v1/insights/occupations/{code}:
    get:
      operationId: insightsOccupationSnapshot
      summary: Occupation snapshot
      tags:
      - Labour Market Insights
      x-consequence: read-only
      x-side-effects: none - consumes 1 credit from the caller's monthly quota per job returned that the account has not already paid for this calendar month
      security:
      - apiKey: []
      description: Posting count, remote share, top hiring companies, common raw titles and country mix for one occupation.
      parameters:
      - name: window_days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
        description: Look-back window over posting dates, in days.
      - name: code
        in: path
        required: true
        schema:
          type: string
          pattern: ^\d{1,4}$
        description: 'ISCO-08 occupation code: 4 digits exact, or 1-3 digits to roll up a group.'
      responses:
        '200':
          description: Computed insight, measured live from deduplicated job postings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightSnapshotResponse'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Monthly request quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Unknown code, or no postings in the window.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Per-second rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
  /v1/insights/occupations/{code}/compensation:
    get:
      operationId: insightsCompensation
      summary: Advertised compensation percentiles by occupation
      tags:
      - Labour Market Insights
      x-consequence: read-only
      x-side-effects: none - consumes 1 credit from the caller's monthly quota per job returned that the account has not already paid for this calendar month
      security:
      - apiKey: []
      description: Percentiles (p10-p90) of advertised USD salaries for an occupation, from postings that state pay. Groups under 30 postings return suppressed:true with null percentiles.
      parameters:
      - name: window_days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
        description: Look-back window over posting dates, in days.
      - name: code
        in: path
        required: true
        schema:
          type: string
          pattern: ^\d{1,4}$
        description: 'ISCO-08 occupation code: 4 digits exact, or 1-3 digits to roll up a group.'
      - name: country
        in: query
        required: false
        schema:
          type: string
          pattern: ^[A-Z]{2}$
        description: ISO 3166-1 alpha-2 country filter.
      responses:
        '200':
          description: Computed insight, measured live from deduplicated job postings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightCompensationResponse'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Monthly request quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Unknown code, or no postings in the window.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Per-second rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
  /v1/insights/occupations/{code}/skills/top:
    get:
      operationId: insightsTopSkills
      summary: Top skills by occupation
      tags:
      - Labour Market Insights
      x-consequence: read-only
      x-side-effects: none - consumes 1 credit from the caller's monthly quota per job returned that the account has not already paid for this calendar month
      security:
      - apiKey: []
      description: Skill slugs ranked by the share of the occupation's postings mentioning them.
      parameters:
      - name: window_days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
        description: Look-back window over posting dates, in days.
      - name: code
        in: path
        required: true
        schema:
          type: string
          pattern: ^\d{1,4}$
        description: 'ISCO-08 occupation code: 4 digits exact, or 1-3 digits to roll up a group.'
      responses:
        '200':
          description: Computed insight, measured live from deduplicated job postings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightTopSkillsResponse'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Monthly request quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Unknown code, or no postings in the window.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Per-second rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
  /v1/insights/occupations/{code}/skills/trending:
    get:
      operationId: insightsTrendingSkillsByOccupation
      summary: Trending skills by occupation
      tags:
      - Labour Market Insights
      x-consequence: read-only
      x-side-effects: none - consumes 1 credit from the caller's monthly quota per job returned that the account has not already paid for this calendar month
      security:
      - apiKey: []
      description: Skills whose mention share grew or shrank versus the preceding window of equal length; the scan covers twice window_days.
      parameters:
      - name: window_days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
        description: Look-back window over posting dates, in days.
      - name: code
        in: path
        required: true
        schema:
          type: string
          pattern: ^\d{1,4}$
        description: 'ISCO-08 occupation code: 4 digits exact, or 1-3 digits to roll up a group.'
      - name: direction
        in: query
        required: false
        schema:
          type: string
          enum:
          - up
          - down
          default: up
        description: up returns growing skills, down returns declining skills.
      responses:
        '200':
          description: Computed insight, measured live from deduplicated job postings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightTrendingResponse'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Monthly request quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Unknown code, or no postings in the window.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Per-second rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
  /v1/insights/industries:
    get:
      operationId: insightsIndustries
      summary: Industries ranked by live posting volume
      tags:
      - Labour Market Insights
      x-consequence: read-only
      x-side-effects: none - consumes 1 credit from the caller's monthly quota per job returned that the account has not already paid for this calendar month
      security:
      - apiKey: []
      description: ISIC Rev.4 divisions present in the corpus with deduplicated posting counts.
      parameters:
      - name: window_days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
        description: Look-back window over posting dates, in days.
      responses:
        '200':
          description: Computed insight, measured live from deduplicated job postings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightIndustriesResponse'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Monthly request quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Per-second rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
  /v1/insights/industries/{division}/skills/trending:
    get:
      operationId: insightsTrendingSkillsByIndustry
      summary: Trending skills by industry
      tags:
      - Labour Market Insights
      x-consequence: read-only
      x-side-effects: none - consumes 1 credit from the caller's monthly quota per job returned that the account has not already paid for this calendar month
      security:
      - apiKey: []
      description: Skills growing or declining inside one ISIC division versus the preceding window.
      parameters:
      - name: window_days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
        description: Look-back window over posting dates, in days.
      - name: division
        in: path
        required: true
        schema:
          type: string
          pattern: ^\d{2}$
        description: ISIC Rev.4 division (2 digits).
      - name: direction
        in: query
        required: false
        schema:
          type: string
          enum:
          - up
          - down
          default: up
        description: up returns growing skills, down returns declining skills.
      responses:
        '200':
          description: Computed insight, measured live from deduplicated job postings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightTrendingResponse'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Monthly request quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Unknown code, or no postings in the window.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Per-second rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
  /v1/insights/skills/{slug}/trend:
    get:
      operationId: insightsSkillTrend
      summary: Skill demand trend
      tags:
      - Labour Market Insights
      x-consequence: read-only
      x-side-effects: none - consumes 1 credit from the caller's monthly quota per job returned that the account has not already paid for this calendar month
      security:
      - apiKey: []
      description: Monthly mention-share series for one skill slug, plus the occupations and industries where its demand concentrates.
      parameters:
      - name: window_days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
        description: Look-back window over posting dates, in days.
      - name: slug
        in: path
        required: true
        schema:
          type: string
        description: Canonical skill slug, e.g. python or machine-learning.
      responses:
        '200':
          description: Computed insight, measured live from deduplicated job postings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightSkillTrendResponse'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Monthly request quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Per-second rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
  /v1/insights/technology/ai-exposure:
    get:
      operationId: insightsAiExposure
      summary: AI exposure by occupation or industry
      tags:
      - Labour Market Insights
      x-consequence: read-only
      x-side-effects: none - consumes 1 credit from the caller's monthly quota per job returned that the account has not already paid for this calendar month
      security:
      - apiKey: []
      description: Share of postings requiring AI skills per group, with the median advertised salary premium of AI-skilled postings. Measured from live ads, not modeled.
      parameters:
      - name: window_days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
        description: Look-back window over posting dates, in days.
      - name: by
        in: query
        required: true
        schema:
          type: string
          enum:
          - occupation
          - industry
        description: Group rows by ISCO occupation or ISIC division.
      responses:
        '200':
          description: Computed insight, measured live from deduplicated job postings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightAiExposureResponse'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Monthly request quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Per-second rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
  /v1/insights/salary/benchmark:
    post:
      operationId: insightsSalaryBenchmark
      summary: Salary benchmark
      tags:
      - Labour Market Insights
      x-consequence: read-only
      x-side-effects: none - consumes 1 credit from the caller's monthly quota per job returned that the account has not already paid for this calendar month
      security:
      - apiKey: []
      description: Advertised-salary percentiles for an occupation code or a title match, optionally filtered by country and seniority. Requires occupation_code or title.
      parameters:
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InsightBenchmarkRequest'
      responses:
        '200':
          description: Salary percentile table with sample count and confidence tier.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightCompensationResponse'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '402':
          description: Monthly request quota exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Per-second rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
components:
  schemas:
    InsightSkillTrendResponse:
      type: object
      properties:
        skill:
          type: string
        window_days:
          type: integer
        series:
          type: array
          items:
            type: object
            properties:
              month:
                type: string
              mentions:
                type: integer
              total:
                type: integer
              share:
                type: number
        top_occupations:
          type: array
          items:
            $ref: '#/components/schemas/InsightRankingItem'
        top_industries:
          type: array
          items:
            $ref: '#/components/schemas/InsightRankingItem'
    InsightBenchmarkRequest:
      type: object
      description: Requires occupation_code or title.
      properties:
        occupation_code:
          type: string
          pattern: ^\d{1,4}$
        title:
          type: string
          description: Title substring match, e.g. data engineer.
        country:
          type: string
          pattern: ^[A-Z]{2}$
        seniority:
          type: string
          enum:
          - entry
          - mid
          - senior
          - lead
          - exec
        window_days:
          type: integer
          minimum: 1
          maximum: 365
          default: 90
    ErrorResponse:
      type: object
      required:
      - error
      properties:
        error:
          type: string
          description: 'Human-readable error message, e.g. "Invalid search filters: unknown filter: ''query''. Did you mean query -> job_title_or?". Not a stable machine-readable code; match on the HTTP status instead. A few stack-scan errors carry a short identifier such as missing_domain or invalid_domain.'
        message:
          type: string
          description: Additional detail. Present on 402 quota responses; other errors carry only error.
    InsightCompensationResponse:
      type: object
      properties:
        occupation_code:
          type: string
          nullable: true
        occupation_label:
          type: string
          nullable: true
        window_days:
          type: integer
        country:
          type: string
          nullable: true
        count:
          type: integer
          description: Postings with stated pay in scope.
        currency:
          type: string
          enum:
          - USD
        percentiles:
          type: object
          nullable: true
          properties:
            p10:
              type: number
            p25:
              type: number
            p50:
              type: number
            p75:
              type: number
            p90:
              type: number
        confidence:
          type: string
          enum:
          - low
          - medium
          - high
          nullable: true
        suppressed:
          type: boolean
          description: True when the sample is under 30 postings.
    InsightTrendingResponse:
      type: object
      properties:
        scope:
          type: object
        window_days:
          type: integer
        direction:
          type: string
          enum:
          - up
          - down
        skills:
          type: array
          items:
            type: object
            properties:
              skill:
                type: string
              recent_count:
                type: integer
              prior_count:
                type: integer
              recent_share:
                type: number
              prior_share:
                type: number
              growth_pct:
                type: number
    InsightTopSkillsResponse:
      type: object
      properties:
        scope:
          type: object
        window_days:
          type: integer
        skills:
          type: array
          items:
            type: object
            properties:
              skill:
                type: string
              count:
                type: integer
              share:
                type: number
    RateLimitErrorResponse:
      type: object
      required:
      - error
      description: 'Sent with HTTP 429 when the per-second rate limit is exceeded. The response also carries Retry-After: 1 and the RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset and RateLimit-Policy headers. A 429 costs no credit.'
      properties:
        error:
          type: string
          description: 'Human-readable message: "Rate limit exceeded".'
    InsightAiExposureResponse:
      type: object
      properties:
        window_days:
          type: integer
        by:
          type: string
          enum:
          - occupation
          - industry
        rows:
          type: array
          items:
            type: object
            properties:
              value:
                type: string
              label:
                type: string
                nullable: true
              count:
                type: integer
              ai_share:
                type: number
              ai_median_usd:
                type: number
                nullable: true
              non_ai_median_usd:
                type: number
                nullable: true
              premium_pct:
                type: number
                nullable: true
    InsightOccupationsResponse:
      type: object
      properties:
        window_days:
          type: integer
        occupations:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: ISCO-08 occupation code.
              label:
                type: string
                nullable: true
              count:
                type: integer
              share:
                type: number
    InsightIndustriesResponse:
      type: object
      properties:
        window_days:
          type: integer
        industries:
          type: array
          items:
            type: object
            properties:
              division:
                type: string
                description: ISIC Rev.4 division.
              label:
                type: string
                nullable: true
              count:
                type: integer
              share:
                type: number
    InsightSnapshotResponse:
      type: object
      properties:
        occupation_code:
          type: string
        occupation_label:
          type: string
          nullable: true
        window_days:
          type: integer
        count:
          type: integer
        remote_share:
          type: number
        top_companies:
          type: array
          items:
            $ref: '#/components/schemas/InsightRankingItem'
        top_titles:
          type: array
          items:
            $ref: '#/components/schemas/InsightRankingItem'
        countries:
          type: array
          items:
            $ref: '#/components/schemas/InsightRankingItem'
    InsightRankingItem:
      type: object
      properties:
        value:
          type: string
        label:
          type: string
          nullable: true
        count:
          type: integer
        share:
          type: number
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: false
      schema:
        type: string
        maxLength: 255
      description: 'Optional client-generated key (e.g. a UUID) that makes this POST safe to retry. A repeat with the same key returns the original response plus an Idempotent-Replayed: true header. Keys are retained for 24 hours.'
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: 'API key issued from the JobsPipe dashboard, prefixed jp_live_, sent as a bearer token in the Authorization header. Keys are read-only and scoped: jobs:read grants POST /v1/jobs/search, stack:read grants POST /v1/stack/scan. No scope grants write access to JobsPipe data.'
    oidc:
      type: openIdConnect
      openIdConnectUrl: https://jobspipe.dev/.well-known/openid-configuration
      description: 'OpenID Connect / OAuth 2.0 access via the JobsPipe authorization server. Supported scopes (also advertised in the protected-resource metadata at https://api.jobspipe.dev/.well-known/oauth-protected-resource): jobs:read - search normalized job postings; stack:read - run technology-stack scans.'
x-service-info:
  categories:
  - data
  - jobs
  - technographics
  docs:
    homepage: https://jobspipe.dev
    apiReference: https://docs.jobspipe.dev
    llms: https://jobspipe.dev/llms.txt