---
title: "Get person-to-company graph"
method: GET
path: "/api/v1/grafo/persona/{slug}"
tags: ["Graph"]
---

# Get person-to-company graph

`GET /api/v1/grafo/persona/{slug}`

## Request

- Base URL: `https://openmercantil.es`
- URL: `https://openmercantil.es/api/v1/grafo/persona/{slug}`
- Auth: one of:
  - none
  - API key in header `X-API-Key`
  - HTTP bearer
- TypeScript: <https://skmtc.dev/openmercantil/apis/openmercantil-public-api/docs/api/v1/grafo/persona/:slug/get.ts> (a function with typed inputs; its response is checked against the schema)

Return a private/no-store BORME-only graph derived from an exact person_public_v1 report. Every company edge is revalidated against the same company_public_v2 generation. It contains no UK/external-person enrichment and does not infer identity, control or vigency. Withheld/absent is neutral 404; unavailable authority is 503/no-store.

## Path parameters

- `slug` string, required

## Query parameters

- `limit` integer

## Response `200`

Person graph

- PersonGraphResponse
  - `schema_version` 'person_graph_v1', required
  - `status` 'available', required
  - `canonical_url` string, uri, required
  - `center` object, required
    - `slug` string, required
    - `name` string, required
    - `companies_count` integer, required
    - `first_seen` string, date, nullable, required
    - `last_seen` string, date, nullable, required
    - `subject_type` 'person_documentary_mentions', required
    - `identity_resolution` 'not_performed', required
  - `companies` PersonGraphCompany[], required
    - `slug` string, required
    - `name` string, required
    - `rel_type` 'OFFICER_OF', required
    - `role` string, required
    - `since` string, date, nullable, required
    - `until` string, date, nullable, required
    - `documentary_status` 'open_documentary_mention' | 'historical_documentary_mention', required
    - `vigency_verified` false, required
    - `source_slug` 'borme', required
  - `coverage` object, required
    - `borme_officer_edges` 'included', required
    - `external_person_enrichment` 'withheld_not_in_person_public_v1', required
  - `projection` PersonPublicProjectionMetadata, required
    - `name` 'person_public_v1', required
    - `schema_version` '1.0', required
    - `contract_sha256` string, required
    - `source_generation` string, required
    - `content_sha256` string, required
    - `projected_at` string, date-time, required
  - `as_of` string, date, required
  - `ttl_seconds` 0, required
  - `subject_type` 'person_documentary_mentions', required
  - `identity_resolution` 'not_performed', required
  - `_legal_notice` string, required
  - `_source_catalog` SourceCatalogEnvelope, required
    - `catalog_version` string, required
    - `policy_fingerprint` string, required
    - `policy_effective_date` string, date
    - `sources` object, required
  - `_data_sources_used` PublicSourcePolicyMetadata[], required
    - `slug` string, required
    - `name` string, required
    - `license` string, required
    - `license_url` string, uri, nullable
    - `attribution_required` boolean, required
    - `attribution_text` string, nullable
    - `official_url` string, uri, nullable
    - `reuse_conditions` string, required: Condiciones de reutilizacion que el consumidor debe conservar al presentar o transformar el dato.
    - `policy_effective_date` string, date, required
    - `reviewed_at` string, date, required
    - `data_updated_at` string, date-time, nullable
    - `catalog_version` string, required
  - `_attributions` object

## Other responses

- `400`: Invalid request
- `404`: Resource not found
- `422`: The query is lexically valid but outside a documented numeric or length bound, or uses an unsupported indexed combination.
- `429`: Rate limit exceeded
- `503`: Controlled fail-closed denial: the required dataset or legal layer is absent, invalid, unsupported or not authorized for this public surface.

## Changes

- **2026-07-26** `996f96a11758`: 7 breaking, 6 warning, 106 info
  - the response property `center/first_seen` became nullable for the status `200`
  - the response property `center/last_seen` became nullable for the status `200`
  - the response property `companies/items/since` became nullable for the status `200`
  - the `center/first_seen` response's property type changed from `string` to `string, null`, and format from no format to `date` for status `200`
  - …115 more

[Operation history](https://skmtc.dev/openmercantil/apis/openmercantil-public-api/changes/api/v1/grafo/persona/:slug/get.md)

---

[API](https://skmtc.dev/openmercantil/apis/openmercantil-public-api.md) - [All operations](https://skmtc.dev/openmercantil/apis/openmercantil-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/openmercantil/apis/openmercantil-public-api/revisions/601ff6123c86?raw)
