# SEC EDGAR Company Lookup — Filings & Company Profile API (`accountable_eel/sec-edgar-company-lookup`) Actor

Look up any US public company by stock ticker or SEC CIK — legal name, industry (SIC) code, entity type, state of incorporation, and 10 most recent filings, read straight from SEC's own official EDGAR data API. No scraping, no API key. Charged once per company found; a miss costs nothing.

- **URL**: https://apify.com/accountable\_eel/sec-edgar-company-lookup.md
- **Developed by:** [Adrian Voss](https://apify.com/accountable_eel) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 successful lookups

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SEC EDGAR Company Lookup

Look up a US public company by stock ticker or SEC CIK and get its SEC EDGAR
filer record back as one flat row: legal name, CIK number, industry (SIC)
code, entity type, state of incorporation, fiscal year end, business address,
former names, and its 10 most recent SEC filings. No API key, no scraping —
this calls SEC's own official `data.sec.gov` submissions API directly and
resolves plain tickers to CIKs using SEC's own published ticker mapping.

### Who it's for

The accountable\_eel catalogue sells company intelligence columns for outbound. Each actor takes a
list of domains or company identifiers and returns one flat, stably-named row per input —
firmographics, registry IDs, tech stack, email route, hiring activity — the shape a Clay table, an
n8n workflow, or an AI agent can consume without post-processing. Pricing is pay-per-event and
per-domain: a few tenths of a cent for a row that was actually found, and nothing for a
miss, so a list that doesn't enrich costs you next to nothing. Where an official source exists —
VIES, GLEIF, SEC EDGAR, Brønnøysund, PRH, RDAP — it is queried directly instead of scraped. No
seat licence, no monthly minimum, no credit system to decode.

For this actor the identifier is a stock ticker or an SEC CIK, and the source is SEC EDGAR's
company submissions API — the same record SEC itself serves to `sec.gov`.

### Why this one

- **Reads SEC's own API, not a scrape.** `data.sec.gov/submissions/CIK<n>.json` is SEC's
  intended machine-readable access path — the same data backing EDGAR's web pages, with SEC's
  fair-access User-Agent requirement handled for you. There's no HTML to parse and nothing that
  breaks when EDGAR redesigns its site.
- **Ticker resolution is built in.** Submit a plain ticker like `AAPL` and it resolves to SEC's
  internal CIK automatically, using SEC's own published `company_tickers.json` mapping (fetched
  once when the actor starts) — you don't need to look up the CIK yourself first, and a numeric
  CIK still works directly if you already have it.
- **Batch-shaped.** Paste a list of tickers or CIKs, get one row per item back, with
  `maxConcurrency` controlling how many requests run in parallel — no per-item clicking through
  the EDGAR web UI, and no writing your own retry logic around SEC's rate limits.
- **Filing history included for free.** Every found row carries the 10 most recent filings —
  form type, filing date, accession number, primary document — at no extra charge over the
  company profile itself. You don't pay a second time to see what a company has filed recently.
- **You only pay for a resolved company.** A ticker or CIK that doesn't resolve to a real SEC
  filer still returns a row (`found: false`), so your dataset always has one row per input line,
  but that row is never billed.

### What you get

One row per input item. Every field below is a stable, always-present key — `null` or an empty
array when SEC doesn't have that value for a given filer, never a missing key.

| Field | Type / format | Description |
|---|---|---|
| `query` | text | The ticker or CIK you submitted, echoed back. |
| `found` | boolean | `true` if the ticker/CIK resolved to a registered SEC filer, `false` for a miss. |
| `status` | text | `OK` for a resolved company, or a short reason for a miss. |
| `cik` | text | The SEC Central Index Key, 10 digits, zero-padded (e.g. `0000320193`). |
| `name` | text | The filer's legal name as registered with SEC. |
| `tickers` | array | All stock ticker symbols currently registered to this filer. |
| `exchanges` | array | The exchange(s) each ticker trades on (e.g. `Nasdaq`, `NYSE`). |
| `sicCode` | text | The 4-digit Standard Industrial Classification code SEC has on file. |
| `sicDescription` | text | The industry description for that SIC code. |
| `entityType` | text | SEC's entity classification (e.g. `operating`). |
| `category` | text | Filer category (e.g. `Large accelerated filer`, `Smaller reporting company`). |
| `stateOfIncorporation` | text | Two-letter state or jurisdiction code where the entity is incorporated. |
| `fiscalYearEnd` | text | Fiscal year end as `MMDD` (e.g. `0928` for September 28). |
| `address` | object | Registered business address — street, city, state/country, zip, as SEC has it on file. |
| `formerNames` | array | Prior legal names SEC has recorded for this filer, if any. |
| `recentFilings` | array | The 10 most recent SEC filings of any type, newest first. Each entry expands to: |
|   `form` | text | Filing form type (e.g. `10-K`, `10-Q`, `8-K`). |
|   `filingDate` | date | The date the filing was submitted to SEC. |
|   `accessionNumber` | text | SEC's unique accession number for the filing. |
|   `primaryDocument` | text | Filename of the filing's primary document on EDGAR. |
| `scrapedAt` | timestamp (ISO 8601) | When this actor fetched the record. |

### Price

$4 per 1,000 companies, plus a $0.00005 start fee. Misses (`found:false`) are never charged.

That $4 per 1,000 is the FREE-tier per-row price ($0.004 per company found); it drops to
$0.002 per company found on the GOLD tier. Either way, the actor-start fee ($0.00005) is charged
once per run, not per item, and a ticker or CIK that doesn't resolve to a real SEC filer costs
nothing at all.

Run 1,000 tickers or CIKs through this actor: **~$4** if every one resolves, less if some
don't — that's 1,000 × $0.004 plus the one-time $0.00005 actor start. The same 1,000 rows through a
credit-based enrichment platform: **$80–$400**. The gap is the point of going straight to the
official source instead of routing through a general-purpose enrichment credit.

Realistically, expect a mixed list to cost less than the worst case: most outbound lists include
private companies, small businesses, and non-US entities that were never going to be SEC filers
in the first place, and none of those cost you anything here.

### How to use

1. **In the Apify Console.** Open the actor page and click **Start** — the `tickersOrCiks` field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
2. **Via the API.** Call it directly with a POST request — no Console needed once you have an API token:
   ```bash
   curl "https://api.apify.com/v2/acts/accountable_eel~sec-edgar-company-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
     -X POST \
     -H "Content-Type: application/json" \
     -d '{"tickersOrCiks":["AAPL"]}'
   ```
3. **On a schedule.** Save this actor as an Apify **Task** with the input you want, then add a **Schedule** (hourly, daily, weekly) so it runs on its own — no server of your own required.

1) Open the actor and paste your list of tickers or CIKs into `tickersOrCiks` — one per line.
   Mix formats freely: `AAPL`, `320193`, and `0000320193` are all accepted.
2) Optionally raise or lower `maxConcurrency` to control how many SEC requests run in parallel.
3) Press Start. Each item becomes one dataset row: a resolved company with its full profile and
   recent filings, or `found: false` for anything SEC doesn't recognize.
4) Export the dataset as CSV/JSON, or pull it via the API into Clay, n8n, Make, or a script —
   the field names are stable across runs.

### Input

```json
{
  "tickersOrCiks": [
    "AAPL"
  ]
}
```

One item per line — a stock ticker symbol or a numeric SEC CIK (with or without leading zeros). Accepted formats: AAPL, 320193.

`maxConcurrency` (optional) controls how many SEC requests run in parallel; it isn't shown in the
input schema above but is accepted alongside `tickersOrCiks`.

### Sample output

| query | found | status | cik | name | tickers | exchanges | sicCode | sicDescription | entityType | category | stateOfIncorporation | fiscalYearEnd | address | formerNames | recentFilings | form | filingDate | accessionNumber | primaryDocument | scrapedAt |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| AAPL | true | OK | 0000320193 | Apple Inc. | \["AAPL"] | \["Nasdaq"] | 3571 | Electronic Computers | operating | Large accelerated filer | CA | 0926 | {"street1":"ONE APPLE PARK WAY","street2":null,"city":"CUPERTINO","stateOrCountry":"CA","zipCode":"95014","stateOrCountryDescription":"CA","isForeignLocation":null,"foreignStateTerritory":null,"country":null,"countryCode":null} | \["APPLE INC","APPLE COMPUTER INC","APPLE COMPUTER INC/ FA"] | \[{"form":"4","filingDate":"2026-08-27","accessionNumber":"0001140361-26-034741","primaryDocument":"xslF345X06/form4.xml"},{"form":"4","filingDate":"2026-08-20","accessionNumber":"0001140361-26-033928","primaryDocument":"xslF345X06/form4.xml"},{"form":"4","filingDate":"2026-08-13","accessionNumber":"0001140361-26-032884","primaryDocument":"xslF345X06/form4.xml"},{"form":"144","filingDate":"2026-08-11","accessionNumber":"0001950047-26-007959","primaryDocument":"xsl144X01/primary\_doc.xml"},{"form":"10-Q","filingDate":"2026-07-31","accessionNumber":"0000320193-26-000020","primaryDocument":"aapl-20260627.htm"},{"form":"8-K","filingDate":"2026-07-30","accessionNumber":"0000320193-26-000018","primaryDocument":"aapl-20260730.htm"},{"form":"4","filingDate":"2026-06-17","accessionNumber":"0001140361-26-025622","primaryDocument":"xslF345X06/form4.xml"},{"form":"4","filingDate":"2026-06-17","accessionNumber":"0001140361-26-025620","primaryDocument":"xslF345X06/form4.xml"},{"form":"4","filingDate":"2026-05-29","accessionNumber":"0001140361-26-023363","primaryDocument":"xslF345X06/form4.xml"},{"form":"SD","filingDate":"2026-05-28","accessionNumber":"0001140361-26-023149","primaryDocument":"ef20073373\_sd.htm"}] | <filing form> | <filing date> | <accession number> | <primary document> | 2026-08-31T06:10:17.719Z |

A real row looks like this:

```json
{
  "query": "AAPL",
  "found": true,
  "data": {
    "cik": "0000320193",
    "name": "Apple Inc.",
    "tickers": ["AAPL"],
    "exchanges": ["Nasdaq"],
    "sicCode": "3571",
    "sicDescription": "Electronic Computers",
    "entityType": "operating",
    "category": "Large accelerated filer",
    "stateOfIncorporation": "CA",
    "fiscalYearEnd": "0928",
    "address": {
      "street1": "One Apple Park Way",
      "city": "Cupertino",
      "stateOrCountry": "CA",
      "zipCode": "95014"
    },
    "formerNames": [],
    "recentFilings": [
      {
        "form": "10-Q",
        "filingDate": "2026-08-01",
        "accessionNumber": "0000320193-26-000075",
        "primaryDocument": "aapl-20260628.htm"
      }
    ]
  },
  "scrapedAt": "2026-08-19T10:00:00.000Z"
}
```

A ticker or CIK that doesn't resolve to a registered company still gets a row
(`found: false`), so you always get one row per input — you're just never charged for it.

### Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

```bash
curl "https://api.apify.com/v2/acts/accountable_eel~sec-edgar-company-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"tickersOrCiks":["AAPL"]}'
```

**n8n.** Add an HTTP Request node: Method `POST`, URL `https://api.apify.com/v2/acts/accountable_eel~sec-edgar-company-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>`, Body Content Type `JSON`, JSON Body `{"tickersOrCiks":["AAPL"]}` (swap in an expression from an earlier node for a real value).

**Clay.** Add an "HTTP API" column: Method `POST`, URL `https://api.apify.com/v2/acts/accountable_eel~sec-edgar-company-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>`, Body `{"tickersOrCiks":["{{company}}"]}`, mapping the row's company into the `tickersOrCiks` array.

**MCP.** In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "SEC EDGAR Company Lookup | Apify" — the agent will find and run this actor.

### Tips

- **Prefer the CIK when you already have it.** It skips ticker resolution entirely and avoids
  ambiguity for companies whose ticker has changed or been reused.
- **A found row doesn't mean "currently trading."** `tickers` and `exchanges` reflect what SEC
  has registered; a delisted company can still resolve and return a full filer record.
- **`formerNames` and `stateOfIncorporation` are good due-diligence fields** — cross-check a
  counterparty's legal name against what they operate under before onboarding them.
- **Set `maxConcurrency` conservatively for large lists.** SEC's fair-access policy expects
  well-behaved, identified traffic; the default is tuned to stay within it.
- **`recentFilings` is capped at 10.** For a company with a longer filing history you'll get the
  10 most recent, not the full archive — use the `accessionNumber` and EDGAR's own site for
  anything older.
- **Mixed lists are normal and cheap.** If your source list blends public companies with private
  ones, don't pre-filter — the misses cost nothing, so it's simpler to run the whole list and let
  `found` tell you which rows are SEC filers.

### vs. alternatives

| | What it costs | What you get | Trade-off |
|---|---|---|---|
| **This actor** (`sec-edgar-company-lookup`) | $0.004 per company found (less on paid tiers), $0.00005 actor start, nothing for a miss | Legal name, industry classification, entity type, state of incorporation, and the 10 most recent SEC filings for a US public company, read from SEC's own EDGAR API | Covers SEC-registered filers only — private and non-US companies won't match, and ticker resolution only covers entities in SEC's published ticker mapping. |
| **SEC EDGAR directly** | Free | The same data, from the same source | It's the same source — this actor exists for the batch: paste N tickers or CIKs, get N rows back, ticker-to-CIK resolution and rate limits handled, in the format your table already reads. Looking up one company once? Use EDGAR's site directly. |
| **Clay** | $0.08–$0.40 per enriched row in credits, on top of a seat | A whole enrichment workspace — waterfalls across dozens of providers, plus the table and the sequencing around it | If you want one place that does everything and you're not counting rows, that's Clay. This is one column, priced per column, callable *from* Clay via its HTTP step. |
| **Doing it yourself** | Your time, plus: fetching and maintaining SEC's ~795KB ticker-to-CIK mapping, handling SEC's fair-access User-Agent requirement and rate limits, and parsing the JSON error body SEC returns for an unknown CIK | The same data | The maintenance this actor absorbs — the ticker mapping refresh, the User-Agent policy, and the retry/rate-limit handling around a single free API. |

Prices for third-party tools are their published list prices as of August 2026 and are not
tracked here — check the vendor before relying on the comparison.

### FAQ

**What happens if a ticker or CIK doesn't resolve?**
You get a dataset row with `found: false` and never pay for it. Most privately held companies,
small businesses, and non-US companies aren't SEC filers at all, so a miss usually means "not a
US public company" rather than an error. SEC returns a non-JSON error body for an unknown CIK,
and an unrecognized ticker simply fails to resolve — both are treated as a clean, unbilled miss.

**Does this cover companies outside the US?**
Only if they're SEC-registered filers — foreign private issuers with an SEC CIK can be looked up
by CIK. Most non-US companies simply aren't in SEC's system and won't resolve; this actor is
built for the US public-company and SEC-filer population, not a general company registry.

**Is this personal data? Any GDPR concerns?**
No. This is a filer record for a legal entity — company name, industry code, incorporation
state, filing history — not personal data about an individual, so GDPR's personal-data rules
don't apply to it.

**Are there rate limits I should worry about?**
SEC's fair-access policy expects identified, well-behaved traffic rather than a hard published
cap; this actor sends the required descriptive User-Agent and defaults `maxConcurrency` to a
level that stays within it. For very large lists, keep `maxConcurrency` at the default or lower.

**How fresh is the data?**
Every run queries `data.sec.gov` live — there's no cache or stored snapshot. `scrapedAt` on each
row is the actual fetch time, so a company's most recent filing shows up as soon as SEC has
indexed it.

**Can I schedule this to run regularly?**
Yes — set up an Apify schedule to re-run the actor against a watchlist of tickers or CIKs on a
cadence, and diff `recentFilings` or `formerNames` between runs to catch new filings or name
changes.

**Can an AI agent use this directly?**
Yes — the actor is discoverable through the Apify MCP server, so an MCP client (Claude, Cursor,
or another agent runtime) can find and run it by name without you writing integration code.

**Do I need proxies or an SEC account?**
No. SEC EDGAR's submissions API is free and unauthenticated; the actor's only obligation to SEC
is sending a descriptive User-Agent, which it does automatically.

**What filing types show up in `recentFilings`?**
Whatever SEC has most recently accepted from that filer — 10-Ks, 10-Qs, 8-Ks, proxy statements,
Form 4 insider transactions, and everything else in EDGAR's form taxonomy all appear, sorted
newest first and capped at 10. There's no filter by form type on the input side; if you only want
annual reports, filter the `form` field in your own workflow after the row comes back.

### Related actors

- [Company Registry Unified Lookup](https://apify.com/accountable_eel/company-registry-unified-lookup)
- [GLEIF LEI Lookup](https://apify.com/accountable_eel/gleif-lei-lookup)
- [EU VAT Validator](https://apify.com/accountable_eel/eu-vat-validator)

# Actor input Schema

## `tickersOrCiks` (type: `array`):

One item per line — a stock ticker symbol or a numeric SEC CIK (with or without leading zeros). Accepted formats: AAPL, 320193. You're only charged for the ones we actually find — a miss costs nothing.

## `testRun` (type: `boolean`):

Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.

## `onlyFound` (type: `boolean`):

Only keep rows where something was actually found. Misses are always free, whether or not you show them here.

## `includeKeywords` (type: `array`):

Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.

## `excludeKeywords` (type: `array`):

Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.

## `maxResults` (type: `integer`):

Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit.

## `columns` (type: `array`):

Choose which pieces of information to include in each result row. All are included by default.

## `expandRows` (type: `boolean`):

When on, each filing found gets its own row instead of being grouped under its company. You're still only charged once per company, no matter how many rows it produces.

## `maxConcurrency` (type: `integer`):

Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.

## `proxyConfiguration` (type: `object`):

Apify Proxy config. Residential recommended for anti-bot-sensitive targets.

## Actor input object example

```json
{
  "tickersOrCiks": [
    "AAPL"
  ],
  "testRun": false,
  "onlyFound": false,
  "includeKeywords": [],
  "excludeKeywords": [],
  "columns": [
    "cik",
    "name",
    "tickers",
    "exchanges",
    "sicCode",
    "sicDescription",
    "entityType",
    "category",
    "stateOfIncorporation",
    "fiscalYearEnd",
    "address",
    "formerNames",
    "recentFilings",
    "form",
    "filingDate",
    "accessionNumber",
    "primaryDocument"
  ],
  "expandRows": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "tickersOrCiks": [
        "AAPL"
    ],
    "includeKeywords": [],
    "excludeKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("accountable_eel/sec-edgar-company-lookup").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "tickersOrCiks": ["AAPL"],
    "includeKeywords": [],
    "excludeKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("accountable_eel/sec-edgar-company-lookup").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tickersOrCiks": [
    "AAPL"
  ],
  "includeKeywords": [],
  "excludeKeywords": []
}' |
apify call accountable_eel/sec-edgar-company-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,accountable_eel/sec-edgar-company-lookup"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qrhNT3xyeDIBeTQo9/builds/HUzmuYl7FZD6Y6IEj/openapi.json
