# Get a registration packet

> The registrations.packet operation: GET /api/v1/registrations/{id}/packet in the REST API and the registration_get_packet tool in the MCP server.

Returns the registration packet of a registration: what you need to apply in the authority's portal,
generated from the entity's current data:

- `fields`: the regime's registration form fields filled in (with `missing` for required ones Ownrecord
  doesn't have: find them elsewhere before you submit);
- the entity, the representatives (authorizations valid now for the regime), the start date, the expected
  turnover (a guide from the threshold counters), bank details, the activity, websites and prerequisites;
- the regime's method, portal URL and identity requirements from the tax knowledge.

`format: "pdf"` returns a PDF summary instead (base64 in `content`); over MCP, read it as the resource
`ownrecord://entities/{entity_id}/registrations/{id}/packet.pdf` rather than in a tool result. The steps
themselves are in the regime's playbook. The packet is data; only the playbook is guidance.

## At a glance

- **REST:** `GET /api/v1/registrations/{id}/packet`
- **MCP tool:** `registration_get_packet`
- **Operation ID:** `registrations.packet`
- **Scope:** Legal entity
- **Permission:** `registrations:read`
- **Risk tier:** `read`
- **Dry run:** Not supported
- **Idempotency:** Not needed (read only)
- **Modes:** Test and live
- **Authentication:** API key with the `registrations:read` scope
- **Since:** M10

## Request

### Path parameters

| Field | Type   | Description                                                                               |
| ----- | ------ | ----------------------------------------------------------------------------------------- |
| `id`  | string | The registration (`regn_…`) or its regime's ID, e.g. `EU_OSS_UNION` or `US_SALES_TAX:TX`. |

### Query parameters

| Field    | Type                 | Required | Description                                    |
| -------- | -------------------- | -------- | ---------------------------------------------- |
| `format` | one of `json`, `pdf` | No       | `json` (default) or `pdf` (a summary, base64). |

## Response

`200 OK` with a JSON object:

| Field            | Type                             | Description |
| ---------------- | -------------------------------- | ----------- |
| `object`         | `"registration_packet_document"` |             |
| `registrationId` | `regn_…` ID                      |             |
| `format`         | one of `json`, `pdf`             |             |
| `filename`       | string                           |             |
| `contentType`    | string                           |             |
| `data`           | object or null                   |             |
| `content`        | string or null                   |             |
| `size`           | integer (at least 0)             |             |
| `sha256`         | string                           |             |

## Examples

### The packet for the EU One-Stop Shop, non-Union scheme

```http
GET /api/v1/registrations/regn_01m4ttwd3veh9apbewxheq5xag/packet
Authorization: Bearer or_test_…
```

Response (`200`):

```json
{
  "object": "registration_packet_document",
  "registrationId": "regn_01m4ttwd3veh9apbewxheq5xag",
  "format": "json",
  "filename": "registration-packet-EU_OSS_NON_UNION.json",
  "contentType": "application/json",
  "data": {
    "object": "registration_packet",
    "regimeId": "EU_OSS_NON_UNION",
    "regimeName": "One-Stop Shop, non-Union scheme",
    "registrationId": "regn_01m4ttwd3veh9apbewxheq5xag",
    "state": "grace",
    "method": "online_portal",
    "portalUrl": "https://ownrecord.io/fixtures/EU/oss-non-union-portal",
    "identityRequirements": "Online registration with the chosen member state of identification",
    "typicalProcessingDays": 14,
    "fields": [
      {
        "label": "Legal name",
        "value": "Helvetia Apps AG",
        "source": "legal_entities.legalName",
        "required": true,
        "missing": false,
        "notes": null
      },
      {
        "label": "Date of the first supply",
        "value": "2026-10-14",
        "source": "registrations.triggeredAt",
        "required": true,
        "missing": false,
        "notes": null
      },
      {
        "label": "Contact person and email",
        "value": null,
        "source": null,
        "required": true,
        "missing": true,
        "notes": "The entity's tax manager"
      }
    ],
    "entity": {
      "legalName": "Helvetia Apps AG",
      "tradingName": null,
      "address": "Bahnhofstrasse 1, 8001 Zürich, CH",
      "country": "CH",
      "companyRegistryId": "CHE-000.000.042",
      "taxId": {
        "type": "ch_vat",
        "value": "CHE-000.000.042 MWST"
      },
      "currency": "CHF",
      "timeZone": "Europe/Zurich"
    },
    "representatives": [
      {
        "name": "Ana Horvat",
        "kind": "employee_eid",
        "contact": "ana.horvat@example.com",
        "validFrom": "2026-01-01",
        "validTo": null,
        "portals": ["OSS portal"]
      }
    ],
    "startDate": "2026-10-14",
    "expectedTurnover": {
      "amount": {
        "amount": "1200000000",
        "currency": "EUR",
        "decimal": "1200.00"
      },
      "basis": "Sales counted toward the EU_OSS_NON_UNION threshold in 2026, all brands (a guide, not a forecast)."
    },
    "bankDetails": null,
    "activity": "Software as a service",
    "websites": ["pay.helvetia.example"],
    "prerequisites": [
      {
        "code": "portal_access",
        "description": "Open a portal account",
        "leadTimeDays": 14,
        "status": "done"
      }
    ],
    "missing": ["Contact person and email"]
  },
  "content": null,
  "size": 1630,
  "sha256": "9b2f4c6e8a0d1f3b5c7e9a2d4f6b8c0e1a3d5f7b9c2e4a6d8f0b1c3e5a7d9f2b"
}
```

## Errors

| Code                                                                                     | HTTP status | When                                                                                  | What to do                                                                                                                                         |
| ---------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`validation_failed`](https://ownrecord.io/docs/reference/errors.md#validation_failed)   | 400         | The registration reference or `format` is invalid.                                    | Fix the fields listed in `details.issues` and send the request again.                                                                              |
| [`resource_not_found`](https://ownrecord.io/docs/reference/errors.md#resource_not_found) | 404         | No registration with this ID or regime exists for the legal entity in this mode.      | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.                                               |
| [`scope_required`](https://ownrecord.io/docs/reference/errors.md#scope_required)         | 400         | The request names no legal entity (an organization key or agent without `entity_id`). | Call the operation with credentials or a target at its level: an organization, a legal entity, a brand or the platform (`details.required_scope`). |
| [`permission_denied`](https://ownrecord.io/docs/reference/errors.md#permission_denied)   | 403         | You can't see this entity's registrations.                                            | Ask an organization owner or admin for a role or scope that allows this action.                                                                    |

It can also return these [common errors](https://ownrecord.io/docs/reference.md#common-errors): [`api_version_unsupported`](https://ownrecord.io/docs/reference/errors.md#api_version_unsupported), [`authentication_required`](https://ownrecord.io/docs/reference/errors.md#authentication_required), [`api_key_invalid`](https://ownrecord.io/docs/reference/errors.md#api_key_invalid), [`dry_run_not_supported`](https://ownrecord.io/docs/reference/errors.md#dry_run_not_supported), [`rate_limited`](https://ownrecord.io/docs/reference/errors.md#rate_limited), [`internal_error`](https://ownrecord.io/docs/reference/errors.md#internal_error).
