{
  "openapi": "3.0.1",
  "info": {
    "title": "FINRA BrokerCheck Scraper",
    "description": "Supercharge your financial industry research! Automate collection of detailed broker and investment advisor information including employment history, regulatory actions, licensing details, and firm affiliations. Get complete professional backgrounds, disclosures, and compliance data from FINRA.",
    "version": "1.2",
    "x-build-id": "omca4G4RowITJnHQA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/parseforge~finra-brokercheck-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-parseforge-finra-brokercheck-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/parseforge~finra-brokercheck-scraper/runs": {
      "post": {
        "operationId": "runs-sync-parseforge-finra-brokercheck-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/parseforge~finra-brokercheck-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-parseforge-finra-brokercheck-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": {
          "searchType": {
            "title": "Search Type",
            "enum": [
              "individual",
              "firm"
            ],
            "type": "string",
            "description": "Type of search to perform - Individual brokers/advisors or Firms",
            "default": "individual"
          },
          "query": {
            "title": "Search Query",
            "type": "string",
            "description": "Search term for broker/advisor name or firm name. For individuals, you can search by name or CRD number. For firms, you can search by firm name or CRD/SEC number."
          },
          "includePrevious": {
            "title": "Include Previous Registrations",
            "type": "boolean",
            "description": "Include brokers/advisors who are no longer registered",
            "default": true
          },
          "firmName": {
            "title": "Firm Name (Individual Search)",
            "type": "string",
            "description": "Filter individuals by firm name (e.g. 'Morgan Stanley', 'Goldman Sachs'). The actor automatically looks up the firm's FINRA CRD number and applies the filter, because the public BrokerCheck API only accepts firm CRDs, not firm-name strings."
          },
          "firmCrd": {
            "title": "Firm CRD (Individual Search, Advanced)",
            "type": "string",
            "description": "Advanced: filter individuals by the firm's exact FINRA CRD number (e.g. '149777' for Morgan Stanley). Skips the firm-name lookup. Leave blank to use Firm Name instead."
          },
          "preferLargestFirm": {
            "title": "Prefer Largest Firm",
            "type": "boolean",
            "description": "When the firm name matches multiple FINRA registrations, pick the broker-dealer with the most registered branch offices (usually the main operational firm) instead of FINRA's default text-relevance top result. Ignored when firmCrd is provided.",
            "default": true
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "Filter individuals by city of their registered office (e.g. 'New York', 'Chicago'). Automatically uppercased before querying. Works best when combined with state."
          },
          "state": {
            "title": "State",
            "type": "string",
            "description": "Filter individuals by US state code (2-letter, e.g. 'NY', 'CA'). Automatically uppercased."
          },
          "zipCode": {
            "title": "ZIP Code (ignored)",
            "type": "string",
            "description": "The public FINRA BrokerCheck API does not support ZIP-code filtering. This field is accepted for backwards compatibility but is ignored. Use city+state instead."
          },
          "includeBrokerDetails": {
            "title": "Include full broker details (extra charge per record)",
            "type": "boolean",
            "description": "When enabled, fetches the full FINRA detail endpoint per match and adds employment history, branch office addresses (with lat/lng), disclosure flags, and exam history to each output item. Each detail fetch is billed at the `broker-detail` event rate (see Pricing). Off by default.",
            "default": false
          },
          "examName": {
            "title": "Exam Filter (single)",
            "type": "string",
            "description": "Return ONLY individuals who have passed this exam. Enter the full exam name (e.g. 'Investment Banking Registered Representative Examination') OR the FINRA series code (e.g. 'Series 79' or just '79'). Matching is case-insensitive and ignores spacing/punctuation, and it matches both the exam name and its series code. FINRA's API has no server-side exam filter, so the actor fetches candidates from your search (query/firm/state) and keeps only the matching ones — always combine this with a search scope so the run stays fast. Leave blank to disable."
          },
          "examNames": {
            "title": "Exam Filter (multiple, any-of)",
            "type": "array",
            "description": "Return individuals who have passed ANY of these exams (OR logic). Each entry can be a full exam name or a series code (e.g. ['Series 79', 'Series 7']). Same matching rules as the single Exam Filter. Combined with the single Exam Filter (union) when both are set. Leave empty to disable.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max Items",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Maximum number of unique broker/firm results to scrape. Required for non-paying users (max 100). Paying users have no limit. The actor will intelligently optimize API requests based on available data and deliver exactly this number of unique results. Also caps the total output of an Enumerate Entire Database run."
          },
          "enumerateAll": {
            "title": "Enumerate Entire Database",
            "type": "boolean",
            "description": "When enabled, the actor scans the ENTIRE FINRA BrokerCheck individual database instead of running a single search — no Search Query needed. It sweeps a list of query prefixes (a–z by default), automatically expanding any prefix that hits FINRA's ~9,000-record result-window cap into deeper prefixes (e.g. 'a' → 'aa'..'az' → 'aaa'..) to guarantee full coverage, collects every unique CRD, and applies your Exam Filter to each. Combine with an Exam Filter (e.g. 'Series 79') to pull every individual in the country who passed that exam. Leave off for normal single-search behavior.",
            "default": false
          },
          "seeds": {
            "title": "Enumerate Seeds (advanced)",
            "type": "array",
            "description": "Advanced: custom starting prefixes for Enumerate Entire Database. When provided, these replace the default a–z sweep (e.g. ['aa'] for a fast narrow test, or ['sm'] to focus a slice). Each capped prefix is still auto-expanded one or two levels deeper. Leave empty to sweep the whole alphabet.",
            "items": {
              "type": "string"
            }
          },
          "excludePriorRuns": {
            "title": "Exclude Results From Prior Runs",
            "type": "boolean",
            "description": "When enabled, the actor remembers every CRD it has already returned (in a persistent named key-value store) and SKIPS those on future runs, so repeated runs only ever return NEW matching individuals — perfect for incremental enumeration. Keep this on and reuse the same Seen Store Name across runs. Defaults to off.",
            "default": false
          },
          "seenStoreName": {
            "title": "Seen Store Name",
            "type": "string",
            "description": "Name of the persistent named key-value store used by 'Exclude Results From Prior Runs' to remember seen CRDs across runs. Use the same name every time you want incremental de-duplication; use a fresh name to start over. Defaults to 'finra-seen-crd'.",
            "default": "finra-seen-crd"
          },
          "maxApiCalls": {
            "title": "Max API Calls per Run (Enumerate)",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Hard ceiling on FINRA API calls per Enumerate Entire Database run (search + detail combined). When hit, the actor persists seen-CRDs + cursor and exits SUCCEEDED so the next run resumes. Search and detail fetches are interleaved so this budget covers both. Default 4000."
          },
          "maxRunMinutes": {
            "title": "Max Run Minutes (Enumerate)",
            "minimum": 1,
            "maximum": 360,
            "type": "integer",
            "description": "Hard ceiling on wall-clock minutes per Enumerate Entire Database run. Same graceful-stop and resume behavior as Max API Calls. Default 15."
          },
          "concurrency": {
            "title": "Concurrency (Enumerate)",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Number of per-individual detail fetches issued in parallel during Enumerate. Higher = faster until FINRA rate-limits. Default 20 — tested clean to 40 with no 429s."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}