{
  "openapi": "3.0.1",
  "info": {
    "title": "Company Dossier API — Domain to Full Company Answer",
    "description": "Ask about one company and get one answer: firmographics from its own site, tech stack, company-level contacts, DNS and registrar, the ATS it hires through and its open roles, recent news, SEC filings, US federal awards, product recalls, Y Combinator batch and the apps it publishes. No API key.",
    "version": "0.1",
    "x-build-id": "flNj97p6BKyc0BNUt"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~company-dossier-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-company-dossier-api",
        "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/insight.solutions~company-dossier-api/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-company-dossier-api",
        "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/insight.solutions~company-dossier-api/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-company-dossier-api",
        "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": {
          "companies": {
            "title": "Companies",
            "type": "array",
            "description": "One company per line: a domain (`stripe.com`), a URL, an email address (`press@stripe.com`), a company name (`Nike, Inc.`), a stock ticker (`NKE`) or a CIK. A name is resolved without a search engine — SEC's ticker index, the Y Combinator directory, then candidate domains verified against the page's own JSON-LD or footer. A name that resolves nowhere, or to two companies, gets a free diagnostic row listing what was tried.",
            "items": {
              "type": "string"
            }
          },
          "sections": {
            "title": "Sections",
            "type": "array",
            "description": "Which of the twelve sections to fill. Each one is read from a first-party source and stamped with the exact request that produced it. Turning sections off does **not** change the price — a dossier is a dossier — it makes the run faster. `financials` is the one section off by default, because SEC's companyfacts payload is measured in megabytes for a large filer.",
            "items": {
              "type": "string",
              "enum": [
                "profile",
                "tech",
                "contacts",
                "domain",
                "jobs",
                "news",
                "filings",
                "financials",
                "awards",
                "recalls",
                "yc",
                "apps"
              ],
              "enumTitles": [
                "profile — who they are, from their own site",
                "tech — what they run on",
                "contacts — how to write to the company",
                "domain — DNS, registrar, mail provider, TLS",
                "jobs — the ATS they hire through, and open roles",
                "news — Google News, this window",
                "filings — SEC EDGAR submissions",
                "financials — SEC XBRL figures (opt-in, large payload)",
                "awards — US federal contracts and grants",
                "recalls — CPSC and FDA, by firm name",
                "yc — Y Combinator batch and status",
                "apps — what they publish in the app stores"
              ]
            },
            "default": [
              "profile",
              "tech",
              "contacts",
              "domain",
              "jobs",
              "news",
              "filings",
              "awards",
              "recalls",
              "yc",
              "apps"
            ]
          },
          "maxItemsPerSection": {
            "title": "Max items per section",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many jobs, news articles, filings, financial figures, awards, recalls and apps to keep per company. 10 is a readable dossier; raise it when you want the detail and you are exporting the flat child rows. The counts and totals on each section are computed before this cut, so `recallCount` is the real number even when `items` is shorter.",
            "default": 10
          },
          "includeSummary": {
            "title": "Include the one-paragraph summary",
            "type": "boolean",
            "description": "Adds a free, deterministic paragraph assembled from the row's own fields — no model of any kind, no charge. Every sentence uses a fixed template over a column that is on the row beside it, so you can rebuild it yourself and check it. Turn it off if you only want the structured fields.",
            "default": true
          },
          "flattenSections": {
            "title": "Also emit one flat row per item",
            "type": "boolean",
            "description": "Adds one free child row per job, news article, filing, financial figure, award, recall and app, on top of the dossier row — never instead of it. Child rows carry `companyDomain` so you can join them back, and the dataset views split them by type. They cost nothing: they are projections of fields already inside the dossier row you paid for.",
            "default": false
          },
          "company": {
            "title": "Company (single)",
            "type": "string",
            "description": "One company, for integrations that cannot send an array — a domain, a URL, an email address, a company name, a ticker or a CIK. Merged with anything in `companies`, and deduplicated, so a company named both ways is fetched and charged once.",
            "default": ""
          },
          "includeFinancials": {
            "title": "Include SEC financials",
            "type": "boolean",
            "description": "Adds the `financials` section: normalised XBRL figures — revenue, income, cash, assets and the rest — from SEC's companyfacts endpoint, for companies that file. Off by default because companyfacts is the only payload in the run measured in megabytes; a large filer's document is several. It fills nothing for a private company.",
            "default": false
          },
          "financialsMaxPeriods": {
            "title": "Financial periods",
            "minimum": 1,
            "maximum": 40,
            "type": "integer",
            "description": "How many reporting periods to keep when `financials` is on. Eight annual periods is a decade of history in one row; raise it for a long trend, lower it to keep the row small. Only read when the company is an SEC filer.",
            "default": 8
          },
          "financialsPeriodKind": {
            "title": "Financial period kind",
            "enum": [
              "annual",
              "quarterly",
              "both"
            ],
            "type": "string",
            "description": "Annual periods, quarterly periods, or both, when `financials` is on. Annual is the comparable series most analysts want; quarterly is four times the rows and is where a seasonal business shows itself.",
            "default": "annual"
          },
          "filingForms": {
            "title": "Filing forms",
            "type": "array",
            "description": "Which SEC forms the `filings` section keeps, e.g. `10-K` for the annual report or `8-K` for material events. Leave it empty to keep every form the company filed in the window. Amendments are matched on their base form, so `10-K` also returns `10-K/A`.",
            "default": [
              "10-K",
              "10-Q",
              "8-K",
              "20-F",
              "S-1"
            ],
            "items": {
              "type": "string"
            }
          },
          "newsWindowDays": {
            "title": "News window (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "How far back the Google News query reaches. 90 days is a quarter of coverage, which is what an account review wants; 30 is what a pre-call check wants. Articles older than the window are dropped before the cut.",
            "default": 90
          },
          "newsSiteScope": {
            "title": "Narrow news to the company's own domain",
            "type": "boolean",
            "description": "Adds the company's own domain to the news query, which helps when the company name is a common word (Apple, Ramp, Stripe) and hurts when the press writes about it without linking to it. Off by default: a quoted company name is the better query for most companies.",
            "default": false
          },
          "awardsWindowDays": {
            "title": "Federal awards window (days)",
            "minimum": 30,
            "maximum": 7300,
            "type": "integer",
            "description": "How far back the USAspending query reaches. 1825 days is five years, which covers a typical contract's full period of performance. USAspending itself carries awards from 2007-10-01 onward, so a window longer than that simply starts there.",
            "default": 1825
          },
          "recallsWindowDays": {
            "title": "Recalls window (days)",
            "minimum": 30,
            "maximum": 7300,
            "type": "integer",
            "description": "How far back the CPSC and FDA recall queries reach. 3650 days is ten years, which is the right window for a vendor-risk check — a recall does not stop mattering after a year. Narrow it when you only care about what is current.",
            "default": 3650
          },
          "maxPagesPerSite": {
            "title": "Max pages per company site",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "HTML pages to read on the company's own site, including the home page. Four buys the home page plus the best three of about/contact/imprint/careers, which is where the firmographics and the company contact live. `robots.txt` is outside this budget and `/.well-known/security.txt` gets one extra allowance.",
            "default": 4
          },
          "includeAppDetails": {
            "title": "Confirm Google Play publishers",
            "type": "boolean",
            "description": "A Google Play search card carries the developer's name and nothing else, so an app is attributed on the name alone. Turning this on fetches each kept app's details page to confirm the publisher's own website against the company's domain. Off by default: a Play details page is about 2 MB, and this costs one per app.",
            "default": false
          },
          "includePersonalEmails": {
            "title": "Include person-shaped email addresses",
            "type": "boolean",
            "description": "Read the Privacy section of the README before turning this on. By default only role addresses reach the row — info@, sales@, support@, press@, security@ and the rest of the allowlist — and anything shaped like a person's mailbox is dropped at the classifier. With this on, personal data protection is yours to handle: you become the controller of what you do next with it.",
            "default": false
          },
          "secUserAgentContact": {
            "title": "SEC contact string",
            "type": "string",
            "description": "SEC asks every automated client for a User-Agent naming the requester and an address it can reach — `Acme Research data@acme.com` — and answers HTTP 403 without one. It is a contact string, not an API key: nothing is registered and nothing is issued. **If you leave it empty the Actor identifies itself** as `Insight Solutions austinhughhillis@gmail.com`, so `filings` and `financials` work on an API or MCP run that sends no inputs. Set it to put your own name on the request.",
            "default": "Insight Solutions austinhughhillis@gmail.com"
          },
          "openFdaApiKey": {
            "title": "openFDA API key (optional)",
            "type": "string",
            "description": "Optional. openFDA answers without a key at 1,000 requests a day per IP address, which a shared datacenter exit can reach on a large run. A free key from open.fda.gov raises that quota. The `recalls` section works without one and nothing else in the Actor uses it."
          },
          "maxSecsPerCompany": {
            "title": "Time budget per company (seconds)",
            "minimum": 10,
            "maximum": 600,
            "type": "integer",
            "description": "Advanced. The hard ceiling on one company. When it runs out, the sections that finished stay on the row, the rest are marked `timed-out` with a free diagnostic each, and the dossier is pushed and charged as any other partial row is. It is what stops one unresponsive website holding a slot for the whole run. Each section also has its own 45-second deadline inside this budget. Raise it for a slow site; lower it to keep a large list moving.",
            "default": 60
          },
          "maxConcurrency": {
            "title": "Companies in flight",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many companies to research at once. Each gets its own proxy session, so one refused site does not burn the exit IP the others are using. Three is the setting the RDAP rate limit and the SEC's per-requester ceiling are both comfortable with; raise it for a long list and watch for rate-limited diagnostics.",
            "default": 3
          },
          "sectionConcurrency": {
            "title": "Sections in flight per company",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many of one company's sections may be on the wire at once. Four keeps the off-site sources running alongside the company's own website, which is the critical path. Lower it if a run at high `maxConcurrency` is pushing memory; the product of the two is how many response bodies can be in flight.",
            "default": 4
          },
          "maxRunSecs": {
            "title": "Run time budget (seconds)",
            "minimum": 60,
            "maximum": 3600,
            "type": "integer",
            "description": "Wall-clock budget for the whole run, checked before every request. **No new company is started past 85% of it**, so the ones already running finish and reach the dataset; each company's row is pushed the moment that company is done, not at the end of the run. Companies never started get a free row and are never charged for. 300 seconds covers about forty companies at the default concurrency. Keep it at or below the run's platform timeout.",
            "default": 300
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy settings. The datacenter default answers every source this Actor reads and is far cheaper than residential; switch groups only if a particular company website refuses it. CPSC and SEC are fetched from the machine's own address first whatever this says, because both measurably prefer it.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}