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

# SUNARP Public Registries

> Search Peru's public registries at SUNARP by partida, plate or ficha, and read a partida's inscriptions with every page as a PDF.

SUNARP (Superintendencia Nacional de los Registros Públicos) keeps Peru's
public registries: real estate, vehicles, companies, persons, mining, vessels and
aircraft. Every registered asset or entity has a partida, the record that
collects its inscriptions (asientos). Search an office's registry by partida,
plate or ficha, then read a partida's inscriptions with each page as a PDF.

## Connect your account

SUNARP answers only to a signed-in person: a Peruvian DNI, with the verification digit and issue date printed on the card. Each query runs as your organization's own connection, so register one before your first query. SUNARP allows each DNI five sign-ins a day; Croma keeps every session open as long as SUNARP allows, so five sign-ins cover many queries.

`POST /pe/sunarp/connections/v1` Register a connection once. Croma checks it with the source before saving it, and answers with its id and a masked name.

| Field | Type | Notes |
| - | - | - |
| `document_number` | string | **Required.** The DNI of the person whose account this is: eight digits. |
| `check_digit` | string | **Required.** The verification digit printed after the DNI number on the card. |
| `issue_date` | string | **Required.** The issue date printed on the DNI card, `yyyy-mm-dd`. |
| `authorized` | boolean | **Required.** `true`: you confirm you are the account's owner or have the owner's authorization to use it. |

```bash theme={"dark"}
curl https://api.croma.run/pe/sunarp/connections/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "document_number": "12345678",
        "check_digit": "1",
        "issue_date": "2020-01-01",
        "authorized": true
      }'
```

```json theme={"dark"}
{
  "data": {
    "id": "conn_2f8Kq1xVb7Lm0Pz9Rt4Wc3",
    "source": "sunarp",
    "status": "active",
    "display_name": "J*** P*** G***",
    "usage": {
      "sign_ins_today": 1,
      "daily_limit": 5,
      "resets_at": "2026-10-01T05:00:00.000Z"
    },
    "available_again_at": null,
    "created_at": "2026-09-30T20:00:00.000Z",
    "last_used_at": "2026-09-30T20:00:00.000Z"
  }
}
```

Every query then runs as one of your organization's connections. Croma picks one, keeps its session open between queries, and moves to the next when one reaches its daily allowance (5 sign-ins a day, reset at midnight America/Lima). Register more than one to get more capacity a day. To run as a specific one, send its id as `connection_id`.

How the flow works, step by step: [Connections](/connections).

List and delete them:

```bash theme={"dark"}
curl https://api.croma.run/pe/sunarp/connections/v1 -H "Authorization: Bearer $CROMA_API_KEY"
curl -X DELETE https://api.croma.run/pe/sunarp/connections/v1/conn_2f8Kq1xVb7Lm0Pz9Rt4Wc3 -H "Authorization: Bearer $CROMA_API_KEY"
```

Over [MCP](/mcp-server), the same verbs are the `sunarp_connect`, `sunarp_list_connections`, `sunarp_delete_connection` tools, so an agent can connect the user's account in conversation.

When a query cannot run as any connection:

| Status | Code | Meaning |
| - | - | - |
| 409 | `connection_required` | The organization has no connection for this source yet. |
| 422 | `connection_rejected` | The source no longer accepts the connection's credentials. |
| 429 | `connections_exhausted` | Every connection used its daily allowance. `Retry-After` says when one is available again. |
| 409 | `connection_exists` | The same account is already connected (on register). |
| 422 | `connection_limit_reached` | The organization already has 5 connections for this source (on register). |

<Note>
  Credentials are encrypted as soon as they reach Croma, bound to your organization, and can only be opened by the isolated service that signs in to the source on your behalf. They are never returned by the API or shown to anyone. Deleting a connection destroys it permanently.
</Note>

## Registry search

`POST /pe/sunarp/registry-search/v1`

| Field | Type | Notes |
| - | - | - |
| `office` | string | **Required.** The registry office by name, e.g. `LIMA`, `AREQUIPA`, `CUSCO`. Case and accents are ignored. |
| `registry_area` | enum | **Required.** `real_estate`, `non_land_property`, `legal_entities`, `natural_persons`, `vehicles`, `mining`, `vessels` or `aircraft`. |
| `search_by` | enum | `partida`, `plate` for vehicles, or `ficha` for the other registries. Default `partida`. |
| `number` | string | **Required.** The partida, plate or ficha. A partida starting with P is written as `P12345678`. |
| `connection_id` | string | Optional. Run as this connection (`conn_…`). Empty lets Croma pick among your organization's connections, moving to the next one when one reaches its daily allowance. |

```bash theme={"dark"}
curl https://api.croma.run/pe/sunarp/registry-search/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "office": "LIMA",
        "registry_area": "vehicles",
        "search_by": "plate",
        "number": "ABC123"
      }'
```

## Response

| Field | Notes |
| - | - |
| `found` | `false` when the office has no entry under that number. |
| `office` | The office searched, as SUNARP names it. |
| `registry_area`, `search_by`, `number` | Echo the request (the number uppercased, without spaces or hyphens). |
| `count` | Number of entries returned. |
| `theft_alert` | A stolen-vehicle notice SUNARP attaches to the result, else `null`. |
| `entries[]` | The matching partidas (below). |

Each entry has `registry_zone`, `office`, `partida_number` (pass it to the registry entry endpoint), `status` (`open`, `closed`, `extinguished`, or `null` for vehicle partidas), `moved_to_partida` (the number to search instead when SUNARP has renumbered the partida), `plate` and `vehicle_status` (vehicles only), and `ficha_number`, `volume`, `folio`, `book` and `registry` when the entry comes from older cards or books.

```json theme={"dark"}
{
  "data": {
    "found": true,
    "office": "LIMA",
    "registry_area": "vehicles",
    "search_by": "plate",
    "number": "ABC123",
    "count": 1,
    "theft_alert": null,
    "entries": [
      {
        "registry_zone": "ZONA REGISTRAL IX - SEDE LIMA",
        "office": "LIMA",
        "partida_number": "12345678",
        "status": null,
        "moved_to_partida": null,
        "plate": "ABC123",
        "vehicle_status": "En Circulación",
        "ficha_number": null,
        "volume": null,
        "folio": null,
        "book": null,
        "registry": null
      }
    ]
  }
}
```

<Note>
  Registry entries change slowly, so an answer can be up to 30 days old. Ask
  for the same entry again after that to read it anew.
</Note>

<Note>
  This lookup can take longer than a typical request. It is an
  [async job](/async-jobs). By default the request waits inline and returns
  `{ data }`, or you can poll / use a `callback_url`.
</Note>

## Registry entry

`POST /pe/sunarp/registry-entry/v1`

| Field | Type | Notes |
| - | - | - |
| `office` | string | **Required.** The registry office by name, as in the search. |
| `registry_area` | enum | **Required.** The registry the partida belongs to, as in the search. |
| `partida_number` | string | **Required.** The partida number from a search result. |
| `connection_id` | string | Optional. Run as this connection (`conn_…`). Empty lets Croma pick among your organization's connections, moving to the next one when one reaches its daily allowance. |

```bash theme={"dark"}
curl https://api.croma.run/pe/sunarp/registry-entry/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "office": "LIMA",
        "registry_area": "real_estate",
        "partida_number": "12345678"
      }'
```

## Response

| Field | Notes |
| - | - |
| `found` | `false` when the office has no such partida in that registry. |
| `registry_zone`, `status`, `plate`, `vehicle_status` | As in the search. |
| `has_images` | `false` when SUNARP shows no pages for the partida. Vehicle partidas are not shown. |
| `page_count` | Pages returned. |
| `pages_truncated` | `true` when the partida has more pages than one call returns. |
| `inscriptions[]` | Each inscription (asiento), newest first: `number`, `act`, `registered_at`, `title_number`, `year`, `section` and `section_name` (rubro), and its `pages[]`. |
| `cards[]` | Older cards (fichas) the partida continues from, with their `pages[]`. |
| `folios[]` | Book folios (`volume`, `folio`) the partida continues from. |
| `checked_at` | When SUNARP was read. |

Every page's `document_url` is our stored copy of the PDF SUNARP serves, byte for byte, and stays available after the lookup.

```json theme={"dark"}
{
  "data": {
    "found": true,
    "office": "LIMA",
    "registry_area": "real_estate",
    "partida_number": "12345678",
    "registry_zone": "ZONA REGISTRAL IX - SEDE LIMA",
    "status": "open",
    "plate": null,
    "vehicle_status": null,
    "has_images": true,
    "moved_to_partida": null,
    "page_count": 3,
    "pages_truncated": false,
    "inscriptions": [
      {
        "number": "7",
        "act": "COMPRA VENTA  ( PROPIEDAD )",
        "registered_at": "2024-08-23T15:30",
        "title_number": "02440831",
        "year": "2024",
        "section": null,
        "section_name": null,
        "pages": [
          { "page": 1, "document_url": "https://.../sunarp/registry-entries/.../7-1.pdf" }
        ]
      }
    ],
    "cards": [
      { "ficha_number": "0001234567", "pages": [{ "page": 1, "document_url": "https://.../cards/0001234567-1.pdf" }] }
    ],
    "folios": [
      { "volume": "001926", "folio": "000304", "document_url": "https://.../folios/001926-000304.pdf" }
    ],
    "checked_at": "2026-09-30T20:00:00.000Z"
  }
}
```

<Note>
  Registry entries change slowly, so an answer can be up to 30 days old. Ask
  for the same entry again after that to read it anew.
</Note>

<Note>
  This lookup can take longer than a typical request. It is an
  [async job](/async-jobs). By default the request waits inline and returns
  `{ data }`, or you can poll / use a `callback_url`.
</Note>

<Card title="Full reference" icon="code" href="/api-reference/overview">
  Schemas, all response fields, and an interactive playground.
</Card>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.