# Integrator account

Your integrator account: names, sign-in email and password, and your EU responsible person. Integrators only, from a signed-in dashboard session.

## Endpoints

-   [GET `/v2/integrator/account`](https://public-api.dapi.digital/docs/reference/integrator-account.md#get_integrator_account)
-   [PATCH `/v2/integrator/account`](https://public-api.dapi.digital/docs/reference/integrator-account.md#update_integrator_account)
-   [POST `/v2/integrator/account/password`](https://public-api.dapi.digital/docs/reference/integrator-account.md#change_integrator_password)
-   [POST `/v2/integrator/account/email-change`](https://public-api.dapi.digital/docs/reference/integrator-account.md#request_integrator_email_change)
-   [GET `/v2/integrator/eu-responsible-person`](https://public-api.dapi.digital/docs/reference/integrator-account.md#get_eu_responsible_person)
-   [PUT `/v2/integrator/eu-responsible-person`](https://public-api.dapi.digital/docs/reference/integrator-account.md#set_eu_responsible_person)
-   [DELETE `/v2/integrator/eu-responsible-person`](https://public-api.dapi.digital/docs/reference/integrator-account.md#remove_eu_responsible_person)

## The eu responsible person object

A GPSR EU responsible person record. Records are never edited: replacing one disables it and adds a new one.

### Attributes

-   `id` (string): Unique identifier of the eu responsible person, prefixed with `erp_`. Treat it as an opaque string: store it and compare it, never parse it.
-   `object` (string): Names the type of this object. Always `eu_responsible_person`.
-   `company_name` (string or null): The responsible person, a company established in the EU or UK.
-   `email` (string or null): Where authorities and buyers can reach it.
-   `address` (string or null): Its postal address.
-   `country` (string or null): ISO 3166-1 alpha-2 country code: an EU member state or `GB` (United Kingdom).
-   `active` (boolean): Whether it is the current responsible person. At most one is active; the others are history.
-   `created_at` (timestamp): Point in time, ISO 8601 in UTC.
-   `disabled_at` (timestamp or null): When it stopped being the responsible person (replaced or removed). Null while active.

**The eu responsible person object**

```json
null
```

## Get your account settings

GET `/v2/integrator/account`

- **Credentials**: A signed-in dashboard session only; API keys are refused.

- **For**: Integrators

- **Operation id**: `get_integrator_account`

Returns your account id, sign-in email (and a new one waiting for confirmation), company and contact name, and when the account was created.

Integrators only, and only with a signed-in dashboard session (`credential_not_allowed` with an API key).

### Returns 200 OK

Your account settings.

Response attributes (IntegratorAccountSettings):

-   `id` (string): Unique identifier of the integrator account, prefixed with `itg_`. Treat it as an opaque string: store it and compare it, never parse it.
-   `object` (string): Names the type of this object. Always `integrator_account_settings`.
-   `email` (string): The email address you sign in with. Account emails go here.
-   `pending_email` (string or null): A new sign-in address waiting for its confirmation link (see `request_integrator_email_change`), or null. You keep signing in with `email` until it is confirmed.
-   `company_name` (string or null): Your company as 3DAPI shows it, for example to buyers of your checkout orders. Your legal name for invoices is in your billing details.
-   `contact_name` (string or null): The person 3DAPI contacts about the account.
-   `created_at` (timestamp): When the account was created.

### Responses

-   `200`: Your account settings.
-   `401`: Credentials are missing (`missing_credentials`), the API key is unknown or inactive (`invalid_api_key`), the session expired (`invalid_session`), or both a key and a session were sent (`ambiguous_credentials`).
-   `403`: The credentials are valid but not allowed to do this: a scope is missing (`missing_scope`), the endpoint is for another kind of account (`actor_not_allowed`) or another kind of credential (`credential_not_allowed`), the account may no longer use the API (`account_blacklisted`), or the account must change something first, in which case `details.fix_url` links to the dashboard page that fixes it.
-   `429`: Too many requests (`rate_limited`): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in the `Retry-After` header, then retry; `details` has `limit`, `window_seconds`, `reset_at` and `retry_after_seconds`.

Errors use [the error object](https://public-api.dapi.digital/docs/guides/errors.md#error-object).

**Request**

```bash
curl "https://public-api.dapi.digital/v2/integrator/account" \
  -H "x-api-key: $DAPI_API_KEY"
```

**Response 200**

```json
{
  "id": "itg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "integrator_account_settings",
  "email": "dev@acme.example",
  "pending_email": null,
  "company_name": "Acme Prints",
  "contact_name": "Ada Lovelace",
  "created_at": "2026-10-20T09:00:00Z"
}
```

## Update your company or contact name

PATCH `/v2/integrator/account`

- **Credentials**: A signed-in dashboard session only; API keys are refused.

- **For**: Integrators

- **Operation id**: `update_integrator_account`

Changes only the fields sent. Billing details and the sign-in email have their own operations.

Integrators only, and only with a signed-in dashboard session (`credential_not_allowed` with an API key).

### Request body

-   `company_name` (string): Your company name, shown in the dashboard and to 3DAPI staff. Omit to keep it.
-   `contact_name` (string or null): Null or an empty string clears it.

### Returns 200 OK

Saved. Your account settings.

Response attributes (IntegratorAccountSettings):

-   `id` (string): Unique identifier of the integrator account, prefixed with `itg_`. Treat it as an opaque string: store it and compare it, never parse it.
-   `object` (string): Names the type of this object. Always `integrator_account_settings`.
-   `email` (string): The email address you sign in with. Account emails go here.
-   `pending_email` (string or null): A new sign-in address waiting for its confirmation link (see `request_integrator_email_change`), or null. You keep signing in with `email` until it is confirmed.
-   `company_name` (string or null): Your company as 3DAPI shows it, for example to buyers of your checkout orders. Your legal name for invoices is in your billing details.
-   `contact_name` (string or null): The person 3DAPI contacts about the account.
-   `created_at` (timestamp): When the account was created.

### Responses

-   `200`: Saved. Your account settings.
-   `400`: The request is invalid. `details.errors` lists each problem (`validation_failed`), or an `expand[]` path is unknown (`invalid_expand`).
-   `401`: Credentials are missing (`missing_credentials`), the API key is unknown or inactive (`invalid_api_key`), the session expired (`invalid_session`), or both a key and a session were sent (`ambiguous_credentials`).
-   `403`: The credentials are valid but not allowed to do this: a scope is missing (`missing_scope`), the endpoint is for another kind of account (`actor_not_allowed`) or another kind of credential (`credential_not_allowed`), the account may no longer use the API (`account_blacklisted`), or the account must change something first, in which case `details.fix_url` links to the dashboard page that fixes it.
-   `429`: Too many requests (`rate_limited`): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in the `Retry-After` header, then retry; `details` has `limit`, `window_seconds`, `reset_at` and `retry_after_seconds`.

Errors use [the error object](https://public-api.dapi.digital/docs/guides/errors.md#error-object).

**Request**

```bash
curl -X PATCH "https://public-api.dapi.digital/v2/integrator/account" \
  -H "x-api-key: $DAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "contact_name": "Ada Lovelace"
}'
```

**Response 200**

```json
{
  "id": "itg_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "integrator_account_settings",
  "email": "dev@acme.example",
  "pending_email": null,
  "company_name": "Acme Prints",
  "contact_name": "Ada Lovelace",
  "created_at": "2026-10-20T09:00:00Z"
}
```

## Change your password

POST `/v2/integrator/account/password`

- **Credentials**: A signed-in dashboard session only; API keys are refused.

- **For**: Integrators

- **Operation id**: `change_integrator_password`

Sets a new sign-in password after checking the current one, and emails your sign-in address that it changed. Sessions already open stay signed in.

Integrators only, and only with a signed-in dashboard session (`credential_not_allowed` with an API key).

### Request body

-   `current_password` (string, required): The password you sign in with now.
-   `new_password` (string, required): The new password, 8 to 72 characters.

### Returns 204 No Content

The password was changed.

### Responses

-   `204`: The password was changed.
-   `400`: The request is invalid (`validation_failed`), the new password is the current one (`same_password`), or the sign-in service refused it as too weak (`weak_password`).
-   `401`: Credentials are missing (`missing_credentials`), the API key is unknown or inactive (`invalid_api_key`), the session expired (`invalid_session`), or both a key and a session were sent (`ambiguous_credentials`).
-   `403`: The credentials are valid but not allowed to do this: a scope is missing (`missing_scope`), the endpoint is for another kind of account (`actor_not_allowed`) or another kind of credential (`credential_not_allowed`), the account may no longer use the API (`account_blacklisted`), or the account must change something first, in which case `details.fix_url` links to the dashboard page that fixes it.
-   `422`: The current password is not correct (`current_password_incorrect`).
-   `429`: Too many requests (`rate_limited`): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in the `Retry-After` header, then retry; `details` has `limit`, `window_seconds`, `reset_at` and `retry_after_seconds`.
-   `503`: Sign-in details cannot be changed right now (`account_service_unavailable`).

Errors use [the error object](https://public-api.dapi.digital/docs/guides/errors.md#error-object).

**Request**

```bash
curl -X POST "https://public-api.dapi.digital/v2/integrator/account/password" \
  -H "x-api-key: $DAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "current_password": "correct-horse-battery",
  "new_password": "staple-violet-orbit"
}'
```

**Response 204**

```json
null
```

## Change your sign-in email

POST `/v2/integrator/account/email-change`

- **Credentials**: A signed-in dashboard session only; API keys are refused.

- **For**: Integrators

- **Operation id**: `request_integrator_email_change`

Emails a confirmation link to the new address, and to your current address when the sign-in service asks both to confirm (`confirm_current_email`). Nothing changes until the links are opened; until then the account signs in with its current email and shows the new one as `pending_email`. Asking again replaces the earlier links.

Integrators only, and only with a signed-in dashboard session (`credential_not_allowed` with an API key).

### Request body

-   `email` (string, required): The address to sign in with from now on.

### Returns 202 Accepted

The confirmation email(s) were sent.

Response attributes (IntegratorEmailChange):

-   `object` (string): Names the type of this object. Always `email_change`.
-   `new_email` (string): The address the account will use once the change is confirmed.
-   `confirm_current_email` (boolean): Whether your current address also got a link to open. When `true`, the change happens once both links are opened; when `false`, once the new address opens its link.

### Responses

-   `202`: The confirmation email(s) were sent.
-   `400`: The request is invalid (`validation_failed`), or the address is the one you already sign in with (`email_unchanged`).
-   `401`: Credentials are missing (`missing_credentials`), the API key is unknown or inactive (`invalid_api_key`), the session expired (`invalid_session`), or both a key and a session were sent (`ambiguous_credentials`).
-   `403`: The credentials are valid but not allowed to do this: a scope is missing (`missing_scope`), the endpoint is for another kind of account (`actor_not_allowed`) or another kind of credential (`credential_not_allowed`), the account may no longer use the API (`account_blacklisted`), or the account must change something first, in which case `details.fix_url` links to the dashboard page that fixes it.
-   `409`: Another account uses this address (`email_taken`).
-   `429`: Too many requests (`rate_limited`): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in the `Retry-After` header, then retry; `details` has `limit`, `window_seconds`, `reset_at` and `retry_after_seconds`.
-   `503`: Sign-in details cannot be changed right now (`account_service_unavailable`), or the confirmation email could not be sent (`email_not_sent`).

Errors use [the error object](https://public-api.dapi.digital/docs/guides/errors.md#error-object).

**Request**

```bash
curl -X POST "https://public-api.dapi.digital/v2/integrator/account/email-change" \
  -H "x-api-key: $DAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "ops@acme.example"
}'
```

**Response 202**

```json
{
  "object": "email_change",
  "new_email": "ops@acme.example",
  "confirm_current_email": true
}
```

## Get your EU responsible person

GET `/v2/integrator/eu-responsible-person`

- **Credentials**: A signed-in dashboard session only; API keys are refused.

- **For**: Integrators

- **Operation id**: `get_eu_responsible_person`

Returns your EU responsible person, earlier ones, and whether you need one. Under the GPSR, products sold to buyers in the EU or UK need a responsible person established there. A business billed outside the EU and UK needs one before its checkout orders can ship to EU or UK addresses; orders to other countries, and wallet orders, do not.

Integrators only, and only with a signed-in dashboard session (`credential_not_allowed` with an API key).

### Returns 200 OK

Your EU responsible person status.

Response attributes (EuResponsiblePersonStatus):

-   `object` (string): Names the type of this object. Always `eu_responsible_person_status`.
-   `required` (boolean): Whether checkout orders shipping to the EU or UK need an active EU responsible person. `true` when your billing country is outside the EU and UK, or not saved yet; `false` for EU and UK businesses, which answer for their products themselves.
-   `billing_country` (string or null): The country of your billing details, which decides `required`. Null until you save billing details.
-   `status` (string):
    
    -   `active`: an EU responsible person is on file.
    -   `missing`: none is on file. When `required` is `true`, checkout orders to EU or UK addresses are refused (`compliance_blocked`, requirement `eu_responsible_person_missing`).
    
-   `active` (object or null): The current responsible person, or null.
    -   `id` (string): Unique identifier of the eu responsible person, prefixed with `erp_`. Treat it as an opaque string: store it and compare it, never parse it.
    -   `object` (string): Names the type of this object. Always `eu_responsible_person`.
    -   `company_name` (string or null): The responsible person, a company established in the EU or UK.
    -   `email` (string or null): Where authorities and buyers can reach it.
    -   `address` (string or null): Its postal address.
    -   `country` (string or null): ISO 3166-1 alpha-2 country code: an EU member state or `GB` (United Kingdom).
    -   `active` (boolean): Whether it is the current responsible person. At most one is active; the others are history.
    -   `created_at` (timestamp): Point in time, ISO 8601 in UTC.
    -   `disabled_at` (timestamp or null): When it stopped being the responsible person (replaced or removed). Null while active.
-   `previous` (array of EuResponsiblePerson): Earlier responsible persons, newest first.
    
    Described in [the eu responsible person object](https://public-api.dapi.digital/docs/reference/integrator-account.md#eu_responsible_person_object).
    

### Responses

-   `200`: Your EU responsible person status.
-   `401`: Credentials are missing (`missing_credentials`), the API key is unknown or inactive (`invalid_api_key`), the session expired (`invalid_session`), or both a key and a session were sent (`ambiguous_credentials`).
-   `403`: The credentials are valid but not allowed to do this: a scope is missing (`missing_scope`), the endpoint is for another kind of account (`actor_not_allowed`) or another kind of credential (`credential_not_allowed`), the account may no longer use the API (`account_blacklisted`), or the account must change something first, in which case `details.fix_url` links to the dashboard page that fixes it.
-   `429`: Too many requests (`rate_limited`): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in the `Retry-After` header, then retry; `details` has `limit`, `window_seconds`, `reset_at` and `retry_after_seconds`.

Errors use [the error object](https://public-api.dapi.digital/docs/guides/errors.md#error-object).

**Request**

```bash
curl "https://public-api.dapi.digital/v2/integrator/eu-responsible-person" \
  -H "x-api-key: $DAPI_API_KEY"
```

**Response 200**

```json
{
  "object": "eu_responsible_person_status",
  "required": true,
  "billing_country": "US",
  "status": "active",
  "active": {
    "id": "erp_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
    "object": "eu_responsible_person",
    "company_name": "EU Rep GmbH",
    "email": "contact@eurep.example",
    "address": "Hauptstr. 1, 10115 Berlin",
    "country": "DE",
    "active": true,
    "created_at": "2026-10-20T09:00:00Z",
    "disabled_at": null
  },
  "previous": []
}
```

## Add or replace your EU responsible person

PUT `/v2/integrator/eu-responsible-person`

- **Credentials**: A signed-in dashboard session only; API keys are refused.

- **For**: Integrators

- **Operation id**: `set_eu_responsible_person`

Makes this company your active EU responsible person. A current one is disabled and kept in `previous`; records are never edited. Takes effect at once for new orders.

Integrators only, and only with a signed-in dashboard session (`credential_not_allowed` with an API key).

### Request body

-   `company_name` (string, required): Legal name of the EU responsible person, a company established in the EU.
-   `email` (string, required): Email where authorities can reach the EU responsible person.
-   `address` (string, required): Street, number, postal code and city.
-   `country` (string, required): ISO 3166-1 alpha-2 code of an EU member state, or `GB`. Any other country is refused.

### Returns 200 OK

Saved. Your EU responsible person status.

Response attributes (EuResponsiblePersonStatus):

-   `object` (string): Names the type of this object. Always `eu_responsible_person_status`.
-   `required` (boolean): Whether checkout orders shipping to the EU or UK need an active EU responsible person. `true` when your billing country is outside the EU and UK, or not saved yet; `false` for EU and UK businesses, which answer for their products themselves.
-   `billing_country` (string or null): The country of your billing details, which decides `required`. Null until you save billing details.
-   `status` (string):
    
    -   `active`: an EU responsible person is on file.
    -   `missing`: none is on file. When `required` is `true`, checkout orders to EU or UK addresses are refused (`compliance_blocked`, requirement `eu_responsible_person_missing`).
    
-   `active` (object or null): The current responsible person, or null.
    -   `id` (string): Unique identifier of the eu responsible person, prefixed with `erp_`. Treat it as an opaque string: store it and compare it, never parse it.
    -   `object` (string): Names the type of this object. Always `eu_responsible_person`.
    -   `company_name` (string or null): The responsible person, a company established in the EU or UK.
    -   `email` (string or null): Where authorities and buyers can reach it.
    -   `address` (string or null): Its postal address.
    -   `country` (string or null): ISO 3166-1 alpha-2 country code: an EU member state or `GB` (United Kingdom).
    -   `active` (boolean): Whether it is the current responsible person. At most one is active; the others are history.
    -   `created_at` (timestamp): Point in time, ISO 8601 in UTC.
    -   `disabled_at` (timestamp or null): When it stopped being the responsible person (replaced or removed). Null while active.
-   `previous` (array of EuResponsiblePerson): Earlier responsible persons, newest first.
    
    Described in [the eu responsible person object](https://public-api.dapi.digital/docs/reference/integrator-account.md#eu_responsible_person_object).
    

### Responses

-   `200`: Saved. Your EU responsible person status.
-   `400`: The request is invalid. `details.errors` lists each problem (`validation_failed`), or an `expand[]` path is unknown (`invalid_expand`).
-   `401`: Credentials are missing (`missing_credentials`), the API key is unknown or inactive (`invalid_api_key`), the session expired (`invalid_session`), or both a key and a session were sent (`ambiguous_credentials`).
-   `403`: The credentials are valid but not allowed to do this: a scope is missing (`missing_scope`), the endpoint is for another kind of account (`actor_not_allowed`) or another kind of credential (`credential_not_allowed`), the account may no longer use the API (`account_blacklisted`), or the account must change something first, in which case `details.fix_url` links to the dashboard page that fixes it.
-   `422`: The country is not an EU member state or the United Kingdom (`country_not_eu_or_uk`). Nothing was saved.
-   `429`: Too many requests (`rate_limited`): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in the `Retry-After` header, then retry; `details` has `limit`, `window_seconds`, `reset_at` and `retry_after_seconds`.

Errors use [the error object](https://public-api.dapi.digital/docs/guides/errors.md#error-object).

**Request**

```bash
curl -X PUT "https://public-api.dapi.digital/v2/integrator/eu-responsible-person" \
  -H "x-api-key: $DAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "company_name": "EU Rep GmbH",
  "email": "contact@eurep.example",
  "address": "Hauptstr. 1, 10115 Berlin",
  "country": "DE"
}'
```

**Response 200**

```json
{
  "object": "eu_responsible_person_status",
  "required": true,
  "billing_country": "US",
  "status": "active",
  "active": {
    "id": "erp_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
    "object": "eu_responsible_person",
    "company_name": "EU Rep GmbH",
    "email": "contact@eurep.example",
    "address": "Hauptstr. 1, 10115 Berlin",
    "country": "DE",
    "active": true,
    "created_at": "2026-10-20T09:00:00Z",
    "disabled_at": null
  },
  "previous": []
}
```

## Remove your EU responsible person

DELETE `/v2/integrator/eu-responsible-person`

- **Credentials**: A signed-in dashboard session only; API keys are refused.

- **For**: Integrators

- **Operation id**: `remove_eu_responsible_person`

Disables your active EU responsible person. It stays in `previous` and cannot be re-enabled; add it again to use it again. While you need one, checkout orders to EU or UK addresses are refused from this moment.

Integrators only, and only with a signed-in dashboard session (`credential_not_allowed` with an API key).

### Returns 200 OK

Removed.

Response attributes (EuResponsiblePersonDeleted):

-   `id` (string): Unique identifier of the eu responsible person, prefixed with `erp_`. Treat it as an opaque string: store it and compare it, never parse it.
-   `object` (string): Names the type of this object. Always `eu_responsible_person`.
-   `deleted` (boolean): Always true: the EU responsible person is removed.

### Responses

-   `200`: Removed.
-   `401`: Credentials are missing (`missing_credentials`), the API key is unknown or inactive (`invalid_api_key`), the session expired (`invalid_session`), or both a key and a session were sent (`ambiguous_credentials`).
-   `403`: The credentials are valid but not allowed to do this: a scope is missing (`missing_scope`), the endpoint is for another kind of account (`actor_not_allowed`) or another kind of credential (`credential_not_allowed`), the account may no longer use the API (`account_blacklisted`), or the account must change something first, in which case `details.fix_url` links to the dashboard page that fixes it.
-   `404`: You have no active EU responsible person (`eu_responsible_person_not_found`).
-   `429`: Too many requests (`rate_limited`): the limit is 500 per minute per API key (or signed-in user). Wait for the number of seconds in the `Retry-After` header, then retry; `details` has `limit`, `window_seconds`, `reset_at` and `retry_after_seconds`.

Errors use [the error object](https://public-api.dapi.digital/docs/guides/errors.md#error-object).

**Request**

```bash
curl -X DELETE "https://public-api.dapi.digital/v2/integrator/eu-responsible-person" \
  -H "x-api-key: $DAPI_API_KEY"
```

**Response 200**

```json
{
  "id": "erp_bfP0GSqKoZFrD72H5Os0rc7HV9XP6eQJu",
  "object": "eu_responsible_person",
  "deleted": true
}
```

---

3DAPI API Docs. This page on the web: https://public-api.dapi.digital/docs/reference/integrator-account. Index of every page: https://public-api.dapi.digital/docs/llms.txt.
