> ## Documentation Index
> Fetch the complete documentation index at: https://docs.enricho.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Search jobs

> Open jobs to apply for, at one credit per new posting. No free preview.

Open jobs for job seekers to apply to, newest first. `job_title` (the role or skills) is required; `location`, `country_code` (default `US`), `remote`, `job_type` and `posted_within_days` (default 14 days, so only recent openings) narrow the search.

There is no free preview: every call returns full postings at 1 credit each. Start with a small `limit` (default 10).

## Search and continuation

```bash theme={null}
curl -X POST 'https://mcp.enricho.co/api/directory/jobs/search' \
  -H 'Authorization: Bearer enr_YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"job_title":"full stack developer","remote":"remote","posted_within_days":7,"limit":5}'
```

Each new posting costs 1 credit; postings you already bought are free and counted in `already_purchased`. When `has_more` is true, send the same body with `cursor` set to `next_cursor`. A search's results are kept for about a day, so pages and repeats are consistent; if a cursor has expired, start again without it.

Each posting has `apply_url`, the employer's own application page, when one is listed; otherwise apply through `company.website`.


## OpenAPI

````yaml api-reference/openapi.json POST /api/directory/jobs/search
openapi: 3.1.0
info:
  title: Enricho Public REST API
  version: 1.0.0
  description: >-
    Public directory search and billing APIs. Full search costs 1 credit per
    returned record; previews and usage calls use no credits. Request and
    response contracts reflect the current public gateway and service handlers.
servers:
  - url: https://mcp.enricho.co
security:
  - apiKey: []
  - headerKey: []
tags:
  - name: Directory
  - name: Billing
paths:
  /api/directory/jobs/search:
    post:
      tags:
        - Directory
      summary: Search jobs
      description: >-
        Open jobs for job seekers to apply to, newest first. job_title is
        required. There is no free preview: every call returns full postings at
        1 credit per new posting (default limit 10); no matches use 0 credits
        and postings the caller already bought are free, counted in
        already_purchased. A search's results are kept for about a day, so pages
        and repeats are consistent. A page is released only after an atomic
        full-page debit is confirmed. Sending preview returns 422.
      operationId: searchJobs
      requestBody:
        required: true
        description: 'Send JSON with Content-Type: application/json.'
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchJobsRequest'
            examples:
              full:
                summary: First page of 3
                value:
                  job_title: full stack developer
                  remote: remote
                  posted_within_days: 7
                  limit: 3
      responses:
        '200':
          description: Success envelope.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    const: true
                  result:
                    $ref: '#/components/schemas/JobsPage'
                  message:
                    type: string
                required:
                  - success
                  - result
                  - message
        '400':
          description: >-
            bad_request: malformed JSON, invalid full-search limit, or cursor
            invalid / from different filters.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: 'unauthorized: missing, invalid or revoked API key.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: >-
            insufficient_credits: insufficient balance for the entire page. No
            records returned and no credits deducted; reduce limit or buy
            credits.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: >-
            validation_failed: missing job_title, unsupported country_code,
            unknown field (including preview), or invalid remote, job_type,
            posted_within_days or field length.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            rate_limited: key, account or IP request limit exceeded; wait a
            minute before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: 'internal: unexpected server failure.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '502':
          description: 'upstream_unavailable: gateway could not reach the service.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: >-
            upstream_unavailable: job search, preview counter or billing
            dependency unavailable. No postings are returned; an unconfirmed
            charge may already have debited credits, so inspect usage before
            retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    SearchJobsRequest:
      type: object
      additionalProperties: false
      required:
        - job_title
      properties:
        job_title:
          type: string
          minLength: 1
          maxLength: 200
          description: >-
            The role or skills to search, e.g. full stack developer or react.
            Required.
        location:
          type: string
          maxLength: 200
          description: >-
            City, state or region within the country, e.g. Austin, TX. Omit for
            the whole country.
        country_code:
          type: string
          pattern: ^[A-Za-z]{2}$
          default: US
          description: >-
            ISO 3166-1 alpha-2 country to search. Unsupported countries return
            422.
        remote:
          type: string
          enum:
            - remote
            - hybrid
          description: Only remote or hybrid roles.
        job_type:
          type: string
          enum:
            - fulltime
            - parttime
            - contract
            - temporary
            - internship
          description: Employment type.
        posted_within_days:
          type: integer
          enum:
            - 1
            - 3
            - 7
            - 14
          description: >-
            Only postings from the last 1, 3, 7 or 14 days (default 14). Older
            postings are never returned.
          default: 14
        limit:
          type: integer
          minimum: 0
          maximum: 100
          default: 10
          description: Postings to return, 1–100, at 1 credit each. Omitted or 0 uses 10.
        cursor:
          type: string
          description: >-
            Opaque next_cursor from the previous full page of the same search.
            Keep every other field identical.
    JobsPage:
      type: object
      properties:
        results:
          type: array
          items:
            $ref: '#/components/schemas/Job'
          maxItems: 100
        next_cursor:
          type: string
          description: Opaque continuation token; empty when no next page is available.
        has_more:
          type: boolean
          description: Whether a continuation page is available.
        credits_used:
          type: integer
          minimum: 0
          maximum: 100
          description: 1 per new posting; postings already bought and empty pages cost 0.
        already_purchased:
          type: integer
          minimum: 0
          maximum: 100
          description: Postings the caller bought before; returned without charge.
      required:
        - results
        - next_cursor
        - has_more
        - credits_used
      description: No total_estimate or total_capped fields are returned by public search.
    Error:
      type: object
      properties:
        success:
          type: boolean
          const: false
        result:
          type: object
          properties:
            code:
              type: string
              description: Machine-readable error code.
          required:
            - code
        message:
          type: string
          description: Human-readable error; do not parse this as a stable identifier.
      required:
        - success
        - result
        - message
    Job:
      type: object
      description: An open job to apply for. Empty strings, null and [] mean not listed.
      properties:
        job_id:
          type: string
          description: Enricho job ID.
        title:
          type: string
          description: Job title.
        company:
          type: object
          properties:
            name:
              type: string
              description: Hiring company.
            domain:
              type: string
              description: Company domain, when the posting names a website.
            website:
              type: string
              description: Company website.
            industry:
              type: string
              description: Industry.
            sectors:
              type: array
              items:
                type: string
              description: Sectors.
            size:
              type: string
              description: Company size as listed.
        location:
          type: object
          properties:
            city:
              type: string
              description: City.
            region:
              type: string
              description: State or region.
            postal_code:
              type: string
              description: Postal code.
            country:
              type: string
              description: Country.
            address:
              type: string
              description: Address as listed.
        workplace_type:
          type: string
          description: e.g. Remote, Hybrid, In-person.
        employment_type:
          type: array
          items:
            type: string
          description: e.g. Full-time, Contract.
        experience_level:
          type: string
          description: e.g. Senior level.
        education_level:
          type: string
          description: Education asked for.
        salary:
          type: object
          properties:
            min:
              type:
                - number
                - 'null'
            max:
              type:
                - number
                - 'null'
            currency:
              type: string
              description: ISO currency.
            period:
              type: string
              description: e.g. yearly, hourly.
            text:
              type: string
              description: Pay as written in the posting.
        skills:
          type: array
          items:
            type: string
          description: Skills the posting asks for.
        occupation:
          type: string
          description: Occupation group.
        benefits:
          type: array
          items:
            type: string
          description: Benefits listed.
        urgent_hire:
          type: boolean
          description: The employer marked the role as urgent.
        high_volume_hiring:
          type: boolean
          description: The employer is hiring many people for the role.
        direct_employer:
          type:
            - boolean
            - 'null'
          description: 'false: posted by a staffing agency; null: unknown.'
        posted_at:
          type: string
          format: date
          description: Posting date (YYYY-MM-DD).
        apply_url:
          type: string
          description: >-
            The employer's own application page, when listed; otherwise apply
            through company.website.
        description:
          type: string
          description: Posting text, up to about 4,000 characters.
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: Enricho API key (enr_...)
    headerKey:
      type: apiKey
      in: header
      name: X-Api-Key
      description: >-
        An Enricho API key (enr_...). Use this or Authorization: Bearer, not
        both.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.