---
title: "Create geo policy"
method: POST
path: "/v3/geo-policies"
tags: ["Labels"]
---

# Create geo policy

`POST /v3/geo-policies`

## Request body

- GeoPolicyRequest
  - `chainId` integer, nullable
  - `productId` string, nullable
  - `vaultAddress` string, nullable
  - `assetAddress` string, nullable
  - `assetSymbols` string[], nullable
  - `assetSymbolRegex` string, nullable
  - `assetNames` string[], nullable
  - `assetNameRegex` string, nullable
  - `countries` string[], required
  - `policyType` 'block' | 'restrict', required
  - `reason` string, nullable

## Response `201`

Geo policy created.

- object
  - `data` GeoPolicy, required
    - `id` string, uuid, required
    - `chainId` integer, nullable
    - `productId` string, nullable
    - `vaultAddress` string, nullable
    - `assetAddress` string, nullable
    - `assetSymbols` string[], nullable — Case-insensitive exact symbol matchers.
    - `assetSymbolRegex` string, nullable — Case-insensitive regular expression matched against token symbols.
    - `assetNames` string[], nullable — Case-insensitive exact token-name matchers.
    - `assetNameRegex` string, nullable — Case-insensitive regular expression matched against token names.
    - `countries` string[], required — As authored — ISO 3166-1 alpha-2 codes and group aliases (`EU`, `EEA`, `EFTA`). Unknown entries are rejected at write time.
    - `countriesResolved` string[], required — Read-time expansion of `countries` — group aliases replaced by their current member codes, deduplicated and sorted. Consumers evaluate against this list; a rule authored with an alias tracks the bloc's current membership.
    - `policyType` 'block' | 'restrict', required
    - `reason` string, nullable
    - `createdAt` string, date-time, required
  - `meta` PaginationMeta, required
    - `total` integer — Exact total count when the endpoint provides one.
    - `hasMore` boolean — Indicates whether another page exists beyond the current page.
    - `offset` integer
    - `limit` integer — Echoed page size after endpoint-side clamping.
    - `outcome` 'disabled' | 'removed' — On a toolbox config DELETE, what happened to the row.
    - `origin` 'baseline' | 'override' — On a toolbox config DELETE, whether the row is shipped in YAML (`baseline`) or was created through the API (`override`).
    - `products` ProductLabels[] — On a curation vault `POST`, `PUT`, or `PATCH`: the products the write touched (the one the vault left and the one it joined) as they are after the write, `governanceMode` included, so the caller applies them instead of re-reading.
      - `id` string, required
      - `chainId` integer, required
      - `entityId` string, required
      - `coBrandEntityIds` string[], required — Additional entities whose logos should be displayed. Product management remains exclusively with entityId.
      - `name` string, required
      - `logo` string, nullable
      - `description` string, nullable
      - `url` string, nullable
      - `portfolioNotice` string, nullable
      - `isDeprecated` boolean, required
      - `deprecationReason` string, nullable
      - `notExplorable` boolean, nullable, required — Curator listing flag. `null` leaves the decision to platform overrides and deprecation, `true` hides the vault(s) from discovery, `false` keeps a deprecated vault listed.
      - `governanceMode` 'governed' | 'ungoverned' | 'unknown', required — Derived by the server from the on-chain governor of member vaults; clients cannot set it. Products are created as `unknown`. Every vault assignment recomputes the mode over the resulting member set and rejects sets that mix governed and ungoverned vaults. Layer 2 adopts `governed` or `ungoverned` for an `unknown` product once its membership verifies against chain state. Entity members cannot update or delete an `ungoverned` product or its vaults after the initial assignment.
      - `resolved` ResolvedProductLabels, required — Read-time entity fallbacks for display. Derived, never stored.
        - `entityName` string, nullable, required
        - `url` string, nullable, required — Product url, falling back to the owning entity url.
        - `logo` string, nullable, required — Product logo, falling back to the owning entity logo.
      - `anyExplorableLend` boolean, required — True when at least one member vault is lend-discoverable per the materialized visibility verdicts. Live chain state (e.g. borrowability) is deliberately excluded.
      - `anyExplorableBorrow` boolean, required — True when at least one member vault is borrow-discoverable per the materialized visibility verdicts. Live chain state (e.g. borrowability) is deliberately excluded.
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required
      - `hold` LabelHoldSummary — What a draft read shows on a held row.
        - `id` string, uuid, required
        - `kind` 'quarantine' | 'entity-hold', required
        - `reason` string, required
        - `since` string, date-time, required
      - `platformListing` ProductPlatformListing — The platform-owned discovery decision on a product, as a product row shows it.
        - `notExplorableLend` boolean, required
        - `notExplorableBorrow` boolean, required
        - `reason` string, nullable, required
    - `timestamp` string, date-time, required
    - `chainId` string — Comma-separated chain IDs for multi-chain responses.
    - `degradedProviders` string[] — Live providers whose data is incomplete in this response.

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `403` — Forbidden
- `422` — Validation error

## Changes

- **2026-09-15** `ab342edda24d` — 1 info
  - added the optional property `meta/products/items/platformListing` to the response with the `201` status
- **2026-09-11** `fd7c881fd90a` — 5 info
  - api tag `Labels` added
  - api tag `Labeling Curation` removed
  - added the optional property `meta/origin` to the response with the `201` status
  - added the optional property `meta/outcome` to the response with the `201` status
  - …1 more

[Change history](https://skmtc.dev/euler/apis/euler-data-api-v3/changes/v3/geo-policies/post.md)

---

[API](https://skmtc.dev/euler/apis/euler-data-api-v3.md) · [All operations](https://skmtc.dev/euler/apis/euler-data-api-v3/llms.txt) · [OpenAPI document](https://skmtc.dev/euler/apis/euler-data-api-v3/revisions/ab342edda24d?raw)
