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

# POST /validate

> Resolve a company string to a canonical entity.

## Use case

Resolve a company name from a customer email, chat message, or CRM record into a canonical BETA entity before calling other endpoints. `/validate` is a fast cache lookup — call it first to avoid wasted lookups on unknown or low-confidence inputs.

## Request

<ParamField body="company" type="string" required>
  Company name to validate. Must be 2–200 characters.
</ParamField>

## Response

<ResponseField name="verified" type="boolean">
  `true` if BETA resolved the input. Always check `resolution.confidence` alongside this — `verified: true` with low confidence means a fuzzy/fallback match, not a confident one.
</ResponseField>

<ResponseField name="confidence" type="number">
  Confidence score (0–1) for the entity match.
</ResponseField>

<ResponseField name="entity" type="object">
  Canonical entity record. `null` when `verified: false`.

  <Expandable title="entity fields">
    <ResponseField name="entity.key" type="string">Canonical entity key, e.g., `anthropic`.</ResponseField>
    <ResponseField name="entity.name" type="string">Display name.</ResponseField>
    <ResponseField name="entity.type" type="string">`public_company` · `private_company` · `subsidiary` · `industry` · `sec_ticker_fallback` · `discovered_entity`</ResponseField>
    <ResponseField name="entity.ticker" type="string | null">Stock ticker (public companies only).</ResponseField>
    <ResponseField name="entity.sector" type="string | null">Industry sector.</ResponseField>
    <ResponseField name="entity.industry" type="string | null">Specific industry.</ResponseField>
    <ResponseField name="entity.publicUrl" type="string | null">SEO-indexed public page at `getbeta.io/company/{slug}`.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="resolution" type="object">
  Provenance metadata — see [Citation Contract](/citation-contract#the-grammar).

  <Expandable title="resolution fields">
    <ResponseField name="resolution.source" type="string">
      `curated` (registry hit) · `discovered` (LLM-discovered cache) · `sec_fallback` (ticker-only match) · `symbol_fallback` (symbol + industry) · `disambiguation` (resolved ambiguous name)
    </ResponseField>

    <ResponseField name="resolution.confidence" type="number">Confidence in the resolution (0–1).</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="message" type="string | null">
  Present when `verified: false` — explanation, e.g., `"Company not found in database"`.
</ResponseField>

## Code samples

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.getbeta.io/api/v1/validate \
    -H "Authorization: Bearer $BETA_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{"company": "Anthropic"}'
  ```

  ```javascript JavaScript theme={null}
  const res = await fetch('https://api.getbeta.io/api/v1/validate', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.BETA_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ company: 'Anthropic' })
  });
  const data = await res.json();
  ```

  ```python Python theme={null}
  import os, requests
  res = requests.post(
      'https://api.getbeta.io/api/v1/validate',
      headers={'Authorization': f'Bearer {os.environ["BETA_API_KEY"]}'},
      json={'company': 'Anthropic'}
  )
  data = res.json()
  ```
</CodeGroup>

## Live response

```json theme={null}
{
  "verified": true,
  "confidence": 1,
  "entity": {
    "key": "anthropic",
    "name": "Anthropic",
    "type": "private_company",
    "ticker": null,
    "sector": null,
    "industry": "technology",
    "publicUrl": "https://getbeta.io/company/anthropic"
  },
  "resolution": {
    "source": "curated",
    "confidence": 1
  }
}
```

## Errors

| Status | Body                                                 | When                                         |
| ------ | ---------------------------------------------------- | -------------------------------------------- |
| `400`  | `{"error": "Company name required"}`                 | Missing `company` field                      |
| `400`  | `{"error": "Company name must be 2-200 characters"}` | Length out of range                          |
| `401`  | `{"error": "API key required"}`                      | Missing `Authorization` header               |
| `401`  | `{"error": "Invalid API key"}`                       | Key not found or revoked                     |
| `429`  | `{"error": "Daily rate limit exceeded"}`             | Per-tier limit hit (see [Pricing](/pricing)) |

## Citation pointer

See [Citation Contract](/citation-contract) for how `resolution.source` and `resolution.confidence` are populated — and why `verified: true` with `resolution.source: "sec_fallback"` is not the same trust signal as `resolution.source: "curated"`.
