{
  "openapi": "3.0.1",
  "info": {
    "title": "PracticeMatch Physician & Healthcare Jobs Scraper",
    "description": "Scrape all 40,900+ physician, advanced-practitioner and healthcare jobs on PracticeMatch. Real salary ranges on about half the board, O*NET specialty codes and mappable coordinates. HTTP-only, no browser, no proxy.",
    "version": "1.0",
    "x-build-id": "AlL7IhcHCERx4Z0tO"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/piquno~practicematch-physician-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-piquno-practicematch-physician-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/piquno~practicematch-physician-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-piquno-practicematch-physician-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/piquno~practicematch-physician-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-piquno-practicematch-physician-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": {
          "professions": {
            "title": "Boards to crawl",
            "type": "array",
            "description": "Which of the three job boards to read. Physicians is the largest at 32,528 postings, advanced practitioners adds 8,376, and the newer healthcare board adds 546.",
            "items": {
              "type": "string",
              "enum": [
                "physician",
                "advanced-practitioner",
                "healthcare"
              ],
              "enumTitles": [
                "Physicians (32,528)",
                "Advanced practitioners (8,376)",
                "Healthcare (546)"
              ]
            },
            "default": [
              "physician",
              "advanced-practitioner",
              "healthcare"
            ]
          },
          "maxJobs": {
            "title": "Max jobs",
            "minimum": 1,
            "type": "integer",
            "description": "Hard limit. Each job is one request, and the site asks for 5 seconds between requests, so this is roughly maxJobs x 6 seconds of runtime. The default of 12 is a quick sample; raise it for a real extract and give the run enough time.",
            "default": 12
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Optional. Specific PracticeMatch job-details URLs to scrape. Overrides the board selection.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "requestDelaySecs": {
            "title": "Delay between requests (seconds)",
            "minimum": 0,
            "type": "integer",
            "description": "PracticeMatch publishes Crawl-Delay: 5 in its robots.txt and this actor honours it by default. Lowering it departs from what the site asks for and raises your risk of being blocked. At 5s you collect roughly 720 jobs per hour.",
            "default": 5
          },
          "newestFirst": {
            "title": "Newest postings first",
            "type": "boolean",
            "description": "Walk the board from the most recently created postings backwards. Leave this on: the sitemap is written oldest-first, so turning it off starts you on listings dated as far back as 2007.",
            "default": true
          },
          "titleContains": {
            "title": "Title contains",
            "type": "string",
            "description": "Keep only jobs whose title contains this text, e.g. \"cardiology\" or \"locum\"."
          },
          "specialtyContains": {
            "title": "Specialty contains",
            "type": "string",
            "description": "Keep only jobs whose specialty contains this text, e.g. \"Family Medicine\", \"Nurse Practitioners\", \"Surgeons\"."
          },
          "locationState": {
            "title": "State",
            "type": "string",
            "description": "Keep only jobs in this US state. Accepts either the two-letter code (\"TX\") or the full name (\"Texas\")."
          },
          "employmentType": {
            "title": "Employment type",
            "type": "string",
            "description": "Keep only jobs of this type, e.g. FULL_TIME, PART_TIME, CONTRACTOR. Postings often carry more than one, and this matches any of them."
          },
          "withSalaryOnly": {
            "title": "Only jobs with a disclosed salary",
            "type": "boolean",
            "description": "Roughly half of postings publish a real pay range. Turn this on to keep only those.",
            "default": false
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 1,
            "type": "integer",
            "description": "Keep only postings published in the last N days. Worth using: the sitemap still lists jobs dated as far back as 2007."
          },
          "incremental": {
            "title": "Incremental mode (only new jobs)",
            "type": "boolean",
            "description": "Remember job ids between runs and emit only postings not seen before. Turns a scheduled watch into a cheap delta instead of re-billing the whole board.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Namespace for incremental state. Use a different key per saved search so separate schedules do not share history.",
            "default": "default"
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional and off by default. Every probe returned full content with no challenge, so the actor runs unproxied. Only enable this if the log shows repeated blocks.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}