---
title: "Several platform brands by name_key or entity_id"
method: POST
path: "/v1/brands"
tags: ["Entities"]
---

# Several platform brands by name_key or entity_id

`POST /v1/brands`

## Request

- Base URL: `https://intelapi.publicaml.org`
- URL: `https://intelapi.publicaml.org/v1/brands`
- Auth: one of:
  - API key in header `X-API-Key`
  - none

The batch form of GET /v1/brands/{name_key}, for the brands of a page of addresses in one call. Same records, same `as_of` rule. Keys that resolve to nothing come back in `not_found` — an unknown brand is not an error for the whole batch. Each returned brand echoes `requested_as` and `matched_by`.

Priced per requested key, like every batch method here.

## Request body

- object
  - `name_keys` string[]: `brand.name_key` values, or label brand keys.
  - `entity_ids` integer[]: `brand.entity_id` values. At least one of the two lists is required.
  - `as_of` string, date

## Response `200`

The brands that resolved, and the keys that did not.

- object
  - `brands` object[]
    - `entity_id` integer
    - `name_key` string
    - `display_name` string, nullable
    - `legal_name` string, nullable: The operating legal entity as the REGISTER spells it. Filled only from a primary register, which is why it is often null: overview sites invent legal entities.
    - `website_url` string, nullable
    - `logo_url` string, nullable
    - `domicile_country` string, nullable: ISO-3166-1 alpha-2 of REGISTRATION of the head operating entity.
    - `management_country` string, nullable: Country of ACTUAL CONTROL, and a different fact — filled only on a regulator's or a court's finding. Neither of the two is the conservative one: Bybit registers in SC and is managed from AE, Garantex registers in EE and is managed from RU.
    - `brand_risk` object
      - `risk_score` integer, nullable: The field to read. max(sanction of the organisation, jurisdiction); null = no component at all.
      - `complete` boolean: false = risk_score is a lower bound and can only go up.
      - `high_risk` boolean, nullable: Derived (risk_score >= high_risk_min), kept for compatibility. null when risk_score is null — nothing was known to derive it from.
      - `high_risk_legacy` boolean, nullable: The pre-scale boolean, computed from the FATF and EU lists only, published so a divergence is visible.
      - `designated` boolean: The ORGANISATION itself carries an active designation.
      - `past_designations` integer
      - `reasons` object[]: What produced the score, worst first: {kind: designation, count, status, score} and {kind: jurisdiction, code, list, status, valid_from, score}.
    - `jurisdiction` object: The verdict for `as_of`, computed on read and never stored: the union of domicile, management and the issuing countries of currently valid licences; worst status wins; `valid_in` (passporting) is ignored.
      - `as_of` string, date
      - `risk_score` integer, nullable
      - `complete` boolean
      - `high_risk` boolean, nullable: null = no countries, or a country with no list row for the date — unknown, not clean.
      - `unchecked` string[]: Countries with no row for as_of in an external list — the reason `complete` is false, named.
      - `domicile` object, nullable
        - `code` string
        - `name` string, nullable
        - `kind` string, nullable: `country` or `bloc`.
        - `risk_score` integer
        - `complete` boolean
        - `high_risk` boolean, nullable
        - `lists` object: Per list (fatf, eu-high-risk, weak-supervision) the row valid on the date — status, validity, source, evidence_url, its score — or null when there is none.
      - `management` object, nullable
        - `code` string
        - `name` string, nullable
        - `kind` string, nullable: `country` or `bloc`.
        - `risk_score` integer
        - `complete` boolean
        - `high_risk` boolean, nullable
        - `lists` object: Per list (fatf, eu-high-risk, weak-supervision) the row valid on the date — status, validity, source, evidence_url, its score — or null when there is none.
      - `licence_countries` object[]
        - `code` string
        - `name` string, nullable
        - `kind` string, nullable: `country` or `bloc`.
        - `risk_score` integer
        - `complete` boolean
        - `high_risk` boolean, nullable
        - `lists` object: Per list (fatf, eu-high-risk, weak-supervision) the row valid on the date — status, validity, source, evidence_url, its score — or null when there is none.
      - `high_risk_basis` object[]: Deduplicated by (country, list), worst first.
    - `regulatory` object
      - `claims` object[]: Regulatory records, the negative ones included: `kind` is licence / authorisation / registration / aml-registration / designation / warning / enforcement / not-registered, with `authority`, `act_ref`, `issuing_country`, `holder_legal_name`, validity window, and `source` + `evidence_url` naming the register entry. A designation lives here, one row per act.
      - `kyc` object[]: Published KYC periods: kyc_level, threshold, validity, `current` for the one in force, and its evidence.
  - `not_found` object[]
  - `brand_risk_policy` object

## Other responses

- `400`: Malformed request.
- `429`: Rate limited: anonymous callers, and keys issued with a quota of their own. Authenticate to remove the limit.
- `500`: Server error.

---

[API](https://skmtc.dev/publicaml/apis/publicaml-intelligence-api.md) · [All operations](https://skmtc.dev/publicaml/apis/publicaml-intelligence-api/llms.txt) · [OpenAPI document](https://skmtc.dev/publicaml/apis/publicaml-intelligence-api/revisions/7c0c6315088c?raw)
