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

# Canonical entity API — public company and feature pages

> Public, no-auth aggregates over the canonical knowledge layer. Powers the SEO surface at manticscore.com/c/{slug}.

The canonical layer indexes every named company and feature that appears across ManticScore research runs. These endpoints expose anonymized aggregate stats for each canonical entity — appearance counts, co-occurring features and companies, and a sitemap of every indexable slug.

All endpoints on this page are public — no `Authorization` header required. Responses are aggressively cacheable and never expose `user_id`, `project_id`, or any user-identifiable data. Derivative idea texts only appear when the underlying project has been [explicitly published](/api-reference/projects#publish-a-project).

## Get a canonical company

Returns aggregate stats for a canonical company by slug.

Rate limit: **60 requests per minute** per IP+slug pair.

<ParamField path="slug" type="string" required>
  Canonical company slug (lowercase, kebab-case).
</ParamField>

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.manticscore.com/public/canonical/company/expensify"
  ```

  ```python Python theme={null}
  import httpx

  resp = httpx.get("https://api.manticscore.com/public/canonical/company/expensify")
  print(resp.json())
  ```
</CodeGroup>

```json 200 response theme={null}
{
  "entity": {
    "name": "Expensify",
    "slug": "expensify",
    "domain": "expensify.com",
    "description": "Expense management for teams.",
    "category": "fintech"
  },
  "appearance_count": 42,
  "appearance_breakdown": {
    "research": 38,
    "build_node": 4
  },
  "top_derivative_ideas": [
    {
      "idea": "AI expense tracker for freelancers",
      "created_at": "2026-04-18T10:00:00Z"
    }
  ],
  "related_features": [
    {
      "slug": "receipt-ocr",
      "name": "Receipt OCR",
      "category": "capture",
      "co_occurrences": 12
    }
  ],
  "related_companies": [
    {
      "slug": "ramp",
      "name": "Ramp",
      "domain": "ramp.com",
      "co_occurrences": 9
    }
  ],
  "last_updated": "2026-04-19T08:00:00Z"
}
```

<ResponseField name="entity" type="object" required>
  Canonical entity descriptor: `name`, `slug`, `domain`, `description`, `category`.
</ResponseField>

<ResponseField name="appearance_count" type="number" required>
  Total number of artifacts (research runs, build nodes, etc.) referencing this company.
</ResponseField>

<ResponseField name="appearance_breakdown" type="object" required>
  Appearance counts grouped by `artifact_type`.
</ResponseField>

<ResponseField name="top_derivative_ideas" type="object[]" required>
  Up to 3 anonymized idea texts from public projects that reference this company. Each entry has `idea` and `created_at`. Empty array when no published projects reference the entity.
</ResponseField>

<ResponseField name="related_features" type="object[]" required>
  Up to 5 features that co-occur with this company in artifact links. Sorted by frequency.
</ResponseField>

<ResponseField name="related_companies" type="object[]" required>
  Up to 5 other companies that co-occur with this one. Sorted by frequency.
</ResponseField>

<ResponseField name="last_updated" type="string">
  ISO 8601 timestamp of the most recent canonical row update, or `null`.
</ResponseField>

Responses include `Cache-Control: public, max-age=300, s-maxage=3600` — browsers cache for 5 minutes, shared caches for 1 hour.

Returns `404` if the slug does not exist.

***

## Get a canonical feature

Returns aggregate stats for a canonical feature by slug. Slugs are not globally unique on features — when collisions exist, the most-referenced row wins.

Rate limit: **60 requests per minute** per IP+slug pair.

<ParamField path="slug" type="string" required>
  Canonical feature slug.
</ParamField>

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.manticscore.com/public/canonical/feature/receipt-ocr"
  ```
</CodeGroup>

```json 200 response theme={null}
{
  "entity": {
    "name": "Receipt OCR",
    "slug": "receipt-ocr",
    "category": "capture",
    "description": "Optical character recognition for paper and digital receipts."
  },
  "appearance_count": 27,
  "appearance_breakdown": {
    "research": 24,
    "build_node": 3
  },
  "top_derivative_ideas": [],
  "offered_by": [
    {
      "slug": "expensify",
      "name": "Expensify",
      "domain": "expensify.com",
      "co_occurrences": 12
    }
  ],
  "last_updated": "2026-04-19T08:00:00Z"
}
```

<ResponseField name="entity" type="object" required>
  Canonical feature descriptor: `name`, `slug`, `category`, `description`.
</ResponseField>

<ResponseField name="appearance_count" type="number" required>
  Total number of artifacts referencing this feature.
</ResponseField>

<ResponseField name="appearance_breakdown" type="object" required>
  Appearance counts grouped by `artifact_type`.
</ResponseField>

<ResponseField name="top_derivative_ideas" type="object[]" required>
  Up to 3 anonymized idea texts from public projects that reference this feature.
</ResponseField>

<ResponseField name="offered_by" type="object[]" required>
  Up to 10 companies that co-occur with this feature in artifact links. Sorted by frequency.
</ResponseField>

<ResponseField name="last_updated" type="string">
  ISO 8601 timestamp of the most recent canonical reference, or `null`.
</ResponseField>

Same edge cache headers as the company endpoint. Returns `404` if the slug does not exist.

***

## Get similar companies

Returns the top-N canonical companies most similar to `{slug}` by embedding cosine distance. Powers "see also" surfaces on company pages.

Rate limit: **60 requests per minute** per IP+slug pair.

<ParamField path="slug" type="string" required>
  Canonical company slug.
</ParamField>

<ParamField query="limit" type="integer" default="10">
  Maximum number of similar companies to return. Clamped to the range `1..50`.
</ParamField>

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.manticscore.com/canonical/companies/expensify/similar?limit=5"
  ```

  ```python Python theme={null}
  import httpx

  resp = httpx.get(
      "https://api.manticscore.com/canonical/companies/expensify/similar",
      params={"limit": 5},
  )
  print(resp.json())
  ```
</CodeGroup>

```json 200 response theme={null}
{
  "slug": "expensify",
  "similar": [
    {
      "slug": "ramp",
      "name": "Ramp",
      "domain": "ramp.com",
      "similarity": 0.87,
      "evidence_count": 14
    }
  ],
  "count": 1
}
```

<ResponseField name="slug" type="string" required>
  The canonical company slug that was queried.
</ResponseField>

<ResponseField name="similar" type="object[]" required>
  Companies ranked by descending embedding cosine similarity to the target. Each entry has `slug`, `name`, `domain`, `similarity` (cosine, `0..1`, may be `null` if undefined), and `evidence_count` — the count of inbound artifact links for the candidate company so callers can rank by both similarity and corpus presence.

  Returns an empty array when the target company exists but has no embedding, or when no other embedded companies are available.
</ResponseField>

<ResponseField name="count" type="number" required>
  Number of entries returned in `similar`.
</ResponseField>

Responses include `Cache-Control: public, max-age=3600, s-maxage=3600` — cacheable for 1 hour at every tier.

Returns `404` if the slug does not exist.

***

## Get feature decompositions

Returns the child features connected to `{slug}` via `decomposes_into` edges in the canonical knowledge graph. Useful for breaking a high-level capability into its constituent sub-features.

When multiple feature rows share the same slug (slugs are not globally unique on features), the most-referenced row is selected — matching the resolution rule used by [Get a canonical feature](#get-a-canonical-feature).

Rate limit: **60 requests per minute** per IP+slug pair.

<ParamField path="slug" type="string" required>
  Canonical feature slug.
</ParamField>

<ParamField query="limit" type="integer" default="20">
  Maximum number of child features to return. Clamped to the range `1..100`.
</ParamField>

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.manticscore.com/canonical/features/expense-management/decompositions?limit=10"
  ```

  ```python Python theme={null}
  import httpx

  resp = httpx.get(
      "https://api.manticscore.com/canonical/features/expense-management/decompositions",
      params={"limit": 10},
  )
  print(resp.json())
  ```
</CodeGroup>

```json 200 response theme={null}
{
  "slug": "expense-management",
  "decompositions": [
    {
      "slug": "receipt-ocr",
      "name": "Receipt OCR",
      "category": "capture",
      "weight": 0.92,
      "evidence_count": 12,
      "updated_at": "2026-04-19T08:00:00Z"
    }
  ],
  "count": 1
}
```

<ResponseField name="slug" type="string" required>
  The canonical feature slug that was queried.
</ResponseField>

<ResponseField name="decompositions" type="object[]" required>
  Child features ranked by `evidence_count` descending, then `weight` descending, then `name` ascending. Each entry has `slug`, `name`, `category`, `weight` (edge weight, may be `null`), `evidence_count` (number of artifacts supporting the edge), and `updated_at` (ISO 8601 timestamp of the most recent edge update, or `null`).

  Returns an empty array when the parent feature exists but has no outgoing `decomposes_into` edges.
</ResponseField>

<ResponseField name="count" type="number" required>
  Number of entries returned in `decompositions`.
</ResponseField>

Responses include `Cache-Control: public, max-age=3600, s-maxage=3600` — cacheable for 1 hour at every tier.

Returns `404` if the slug does not exist.

***

## Get the canonical sitemap

Returns every canonical company and feature slug along with its display name and last-updated timestamp. Used by the public site to generate `sitemap.xml`.

Rate limit: **30 requests per minute** per IP.

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.manticscore.com/public/canonical/sitemap"
  ```
</CodeGroup>

```json 200 response theme={null}
{
  "companies": [
    {"slug": "expensify", "name": "Expensify", "last_updated": "2026-04-19T08:00:00Z"}
  ],
  "features": [
    {"slug": "receipt-ocr", "name": "Receipt OCR", "last_updated": "2026-04-19T08:00:00Z"}
  ]
}
```

<ResponseField name="companies" type="object[]" required>
  All canonical companies with non-null slug. Each entry has `slug`, `name`, and `last_updated`.
</ResponseField>

<ResponseField name="features" type="object[]" required>
  Distinct canonical feature slugs, deduplicated by slug. Each entry has `slug`, `name`, and `last_updated`.
</ResponseField>

Responses include `Cache-Control: public, max-age=3600, s-maxage=3600` — cacheable for 1 hour at every tier.
