---
title: "Resolve a field name to the live concept"
method: GET
path: "/v1/fields/resolve"
tags: ["Schemas"]
---

# Resolve a field name to the live concept

`GET /v1/fields/resolve`

## Request

- Base URL: `https://api.talonic.com`
- URL: `https://api.talonic.com/v1/fields/resolve`
- Auth: HTTP bearer

Stable-identity entry point for a consumer that holds a field NAME rather
than an id. Lookup order, first hit wins — indexed arms first, then two
case-insensitive sequential-scan fallbacks: exact `canonical_name` → the
registry `match_key` fold (separator / case / accent / plural
insensitive, the same `field_match_key()` the resolver binds with) → a
merge alias (`field_registry_aliases`) → exact `synonyms[]` containment
(names folded in by merges and cleanup) → case-insensitive canonical
name → case-insensitive synonym. The hit's redirect chain
is then followed to the survivor unless `follow_redirects=false`, and
every hop is reported in `redirected_from` so a cache can rewrite its keys.

## Query parameters

- `name` string, required
- `follow_redirects` boolean

## Response `200`

The resolved concept.

- FieldResolveResponse
  - `name` string, required
  - `matched_by` 'canonical_name' | 'synonym' | 'alias' | 'match_key', required
  - `redirected_from` string[], required: Ids walked through `superseded_by`, oldest first (empty when the hit was live).
  - `field` FieldResponse, required
    - `id` string, uuid, required
    - `canonical_name` string, required
    - `maturity` 'core' | 'proven' | 'candidate', required: Named maturity level — the contract a consumer caching the vocabulary can rely on (`tier` is the frozen numeric twin: core = 1, proven = 2, candidate = 3). - `core`: universal, fully trusted; safe to bind schemas, dashboards and downstream models to. Demotion is hysteresis-guarded and always emits `field.demoted`. - `proven`: recurring and useful; stable id, name may still be groomed (`field.renamed` / `field.merged` announce it). - `candidate`: newly discovered; may be merged, renamed or expire with no notice beyond the event feed. Do not hard-code.
    - `admission_state` 'canonical' | 'provisional'
    - `description` string, nullable: Curated semantic description of the concept.
    - `synonyms` string[]: Names folded onto this concept by merges and cleanup; all resolve via `GET /v1/fields/resolve`.
    - `superseded_by` FieldRef
      - `id` string, uuid, required
      - `links` object, required
        - `self` string
    - `display_name` string, required: Human-readable label, always present. A stored display name wins; otherwise it is derived from `canonical_name`, e.g. `invoice_number` → `Invoice Number`.
    - `data_type` string, required
    - `tier` integer, required
    - `cluster_name` string, nullable
    - `occurrence_count` integer, required
    - `master_instruction` string, nullable
    - `created_at` string, date-time, required
    - `updated_at` string, date-time
    - `links` object, required
      - `self` string
      - `similar` string
      - `card` string
      - `values` string
      - `history` string

## Other responses

- `400`: `missing_name` — the `name` query parameter is required exactly once.
- `401`: Missing or invalid API key.
- `404`: `unknown_field` — no arm matched the name in this registry.
- `429`: Daily rate limit exceeded.

---

[API](https://skmtc.dev/talonic/apis/talonic-api.md) · [All operations](https://skmtc.dev/talonic/apis/talonic-api/llms.txt) · [OpenAPI document](https://skmtc.dev/talonic/apis/talonic-api/revisions/678fe5f8c9c3?raw)
