{
  "openapi": "3.0.1",
  "info": {
    "title": "Handshake Jobs Scraper",
    "description": "Scrape public Handshake jobs and internships: employer, salary range, location, dates, role taxonomy and the full description. Search by city and role, or paste any listing or job URL. Every row carries the employer's own careers domain. No login and no student account needed.",
    "version": "0.0",
    "x-build-id": "y8SEeXakqSaV1tvzu"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~handshake-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-handshake-jobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/memo23~handshake-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-handshake-jobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/memo23~handshake-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-handshake-jobs-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "locations": {
            "title": "Cities",
            "type": "array",
            "description": "Cities to search. Accepts Handshake slugs (`austin-tx`) or plain text (`Austin, TX`). Bare city names work when they are unambiguous, so use `portland-or` or `portland-me` rather than `Portland`. Combined with Roles as a cross-product: 3 cities x 2 roles = 6 listing pages.",
            "items": {
              "type": "string"
            }
          },
          "roles": {
            "title": "Roles",
            "type": "array",
            "description": "Handshake role categories to search. Accepts slugs (`software-engineering`) or plain text (`Software Engineering`). Handshake publishes 62 of them, including nursing, registered-nurse, software-engineering, sales, marketing, finance, teaching, social-work, data-analytics and mechanical-engineering. Leave empty to get every role in the chosen cities.",
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Include remote jobs",
            "type": "boolean",
            "description": "Adds Handshake's remote listing to whatever the Cities field already covers. Turn this on with no cities set to scrape remote postings only.",
            "default": false
          },
          "startUrls": {
            "title": "Handshake URLs",
            "type": "array",
            "description": "Listing URLs (`https://joinhandshake.com/find-jobs/austin-tx/nursing/`) and direct job URLs (`https://app.joinhandshake.com/public/jobs/11325998`) are both supported and auto-classified. Mix them freely in one run.",
            "items": {
              "type": "string"
            }
          },
          "enrichEmails": {
            "title": "Enrich with employer contact emails (billed per email found)",
            "type": "boolean",
            "description": "Every Handshake posting carries the employer's own careers URL, so enrichment reads that site directly for a contact email instead of guessing the domain. Adds contactEmail and contactWebsite columns plus a detailed emailEnrichment object. Best-effort, billed only when an email is returned, never for misses.",
            "default": false
          },
          "qualifyByPayment": {
            "title": "Qualify by payment (flag employers that take money online)",
            "type": "boolean",
            "description": "Requires \"Enrich with employer contact emails\". Scans each employer's website, reusing the pages already fetched for email discovery so there is no extra cost or time, for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments, paymentProcessors, stripeLiveKey and paymentConfidence.",
            "default": false
          },
          "monitoringMode": {
            "title": "Monitoring mode (only return jobs not seen on previous runs)",
            "type": "boolean",
            "description": "When enabled, jobs whose Handshake id has already been delivered to you are silently skipped: no detail page is fetched and no charge applies for them. The first run after enabling monitoring returns every match, which builds your baseline. Every run after that returns only new postings. Combine with Apify's scheduler for a 'posted since last run' feed.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Reset monitoring state (one-shot)",
            "type": "boolean",
            "description": "One-shot toggle: clear the saved 'jobs already seen' record at the start of this run. Use it when you change cities or roles, want to rebuild the baseline, or need to recover from a missed delivery. Has no effect when monitoring mode is off.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum items to scrape",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on the number of jobs collected. Each Handshake listing page yields up to 200 job ids and does not paginate, so raise this and add more city or role combinations to go wider.",
            "default": 1000
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of job pages fetched in parallel.",
            "default": 10
          },
          "minConcurrency": {
            "title": "Min concurrency",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of job pages fetched in parallel.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "type": "integer",
            "description": "Number of retries before a failed request is given up.",
            "default": 5
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Handshake's public pages serve fine without a proxy, so this is optional. Enable it if you are running at high volume or from a blocked network.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}