> ## Documentation Index
> Fetch the complete documentation index at: https://docs.quantoraresearch.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Company fundamentals

> Statements, multiples, filings and insider activity for US companies.

Roughly 1,900 US companies, built from SEC filings. Where the macro data describes
economies, this describes the companies inside them, and it is wired the same way: a
company is an entity, and everything about it is an observation against that entity.

That means the request you already learned works here. `company_AAPL` behaves exactly
like `country_TUR`, and a fundamentals row carries the same provenance and trust fields
as an inflation print.

## Finding a company

Tickers are convenient and ambiguous. Search resolves names, tickers and CIKs to the
canonical entity.

<CodeGroup>
  ```bash cURL theme={"dark"}
  curl -H "x-api-key: $QUANTORA_API_KEY" \
    "https://api.financialdatapi.com/companies?search=apple"
  ```

  ```python Python theme={"dark"}
  import requests

  r = requests.get(
      "https://api.financialdatapi.com/companies",
      params={"search": "apple"},
      headers={"x-api-key": KEY},
  )
  company = r.json()["data"][0]
  ```

  ```javascript Node theme={"dark"}
  const r = await fetch(
    "https://api.financialdatapi.com/companies?search=apple",
    { headers: { "x-api-key": process.env.QUANTORA_API_KEY } }
  );
  const [company] = (await r.json()).data;
  ```
</CodeGroup>

```json Response theme={"dark"}
{
  "data": [
    {
      "entityId": "company_AAPL",
      "ticker": "AAPL",
      "name": "Apple Inc.",
      "cik": "0000320193",
      "exchange": "NASDAQ",
      "sector": "Information Technology"
    }
  ]
}
```

## Fetching fundamentals

<CodeGroup>
  ```bash cURL theme={"dark"}
  curl -H "x-api-key: $QUANTORA_API_KEY" \
    "https://api.financialdatapi.com/companies/AAPL/fundamentals"
  ```

  ```python Python theme={"dark"}
  rows = requests.get(
      "https://api.financialdatapi.com/companies/AAPL/fundamentals",
      headers={"x-api-key": KEY},
  ).json()["data"]
  ```

  ```javascript Node theme={"dark"}
  const rows = await fetch(
    "https://api.financialdatapi.com/companies/AAPL/fundamentals",
    { headers: { "x-api-key": process.env.QUANTORA_API_KEY } }
  ).then((r) => r.json()).then((j) => j.data);
  ```
</CodeGroup>

Statements, derived multiples, filing metadata and insider transactions all arrive
through this one call.

## The annual row trap

This is the single most important thing on this page, and the mistake is silent.

Fundamentals carry a **full-year FY row and a Q4 row on the same date**. They are not
duplicates and they are not additive. Both are correct; they answer different
questions.

<Warning>
  Never sum four quarters to get an annual figure. The FY row is already in the response,
  so summing double counts the year.

  For quarterly data, filter the FY rows **out**. For annual data, take the FY row.
</Warning>

<CodeGroup>
  ```python Python theme={"dark"}
  quarterly = [r for r in rows if r["fiscalPeriod"] != "FY"]
  annual    = [r for r in rows if r["fiscalPeriod"] == "FY"]
  ```

  ```javascript Node theme={"dark"}
  const quarterly = rows.filter((r) => r.fiscalPeriod !== "FY");
  const annual    = rows.filter((r) => r.fiscalPeriod === "FY");
  ```
</CodeGroup>

A chart that plots the unfiltered series shows a spike every fourth quarter. If you
have ever seen that shape in a fundamentals chart, this was why.

## Screening

Screeners run the filter server side and return matching companies, which is far
cheaper than pulling the universe and filtering locally.

<CodeGroup>
  ```bash cURL theme={"dark"}
  curl -H "x-api-key: $QUANTORA_API_KEY" \
    "https://api.financialdatapi.com/screeners/value?limit=50"
  ```

  ```python Python theme={"dark"}
  hits = requests.get(
      "https://api.financialdatapi.com/screeners/value",
      params={"limit": 50},
      headers={"x-api-key": KEY},
  ).json()["data"]
  ```
</CodeGroup>

## Coverage caveats

**US only.** Companies filing with the SEC. No international filers.

**Filing lag is real.** A figure appears when the filing is made, not when the quarter
ends, and that gap runs to weeks. `releaseDate` is the field that matters for anything
point in time.

**Restatements happen.** A company can revise a prior period, so today's history is not
necessarily the history you fetched last month. Store `releaseDate` and reconstruct.

**Prices are a separate dataset.** Market capitalisation and price based multiples
depend on market feeds with their own freshness and their own licensing. See
[Markets](/data/markets).

<CardGroup cols={2}>
  <Card title="Companies endpoints" icon="code" href="/api-reference/companies">
    Every company route, with a playground.
  </Card>

  <Card title="Trust metadata" icon="shield-check" href="/concepts/trust-metadata">
    The flags that decide whether a row belongs in a model.
  </Card>
</CardGroup>
