## POST /api/v2/domains/{id}/actions/retry-registration

**Retry failed domain registration**

Retry a failed pending registration. Send an empty body for plain retries, send `recoveryValues` for extension-specific details, or send `profileUpdated: true` after updating profile-targeted fields in account settings. Successful responses are wrapperless; validation, ownership, payment, and state failures use Problem Details. When a background status-sync job is queued, the optional `operation` object contains a public job ID and poll URL; refresh the domain after that job completes instead of immediately reloading stale local state.

### Related Endpoints

- `POST /api/v2/domains/{id}/actions/renew`: Renew a domain
- `POST /api/v2/domains/{id}/actions/update-epp`: Save EPP code for transfer
- `POST /api/v2/domains/{id}/actions/request-epp`: Request an EPP code

### Headers

- `Accept`: application/json
- `Authorization`: Bearer YOUR_API_KEY
- Required API scope: `write:domains`
- `Content-Type`: application/json

### Parameters

- `id` (path, string, required): Public domain ID. Get it from GET /api/v2/domains `data[].id`. Do not invent this value; use the exact ID returned by the referenced API response. Example: `dom_01hxa3b4c5d6e7f8g9h0j1k2m3`

### Request Body

- `recoveryValues` (object, optional): Extension-specific correction values keyed by lifecycle recovery field key. Do not send profile-targeted fields here; update account settings and use profileUpdated instead.
- `profileUpdated` (boolean, optional): True after the caller has updated profile-targeted fields in account settings and wants the retry to use freshly fetched account details.

### Request Examples

#### Retry without extra details

```bash
curl -X POST "https://cloud.hostup.se/api/v2/domains/dom_01hxa3b4c5d6e7f8g9h0j1k2m3/actions/retry-registration" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
```

#### Retry with .music holder details

```bash
curl -X POST "https://cloud.hostup.se/api/v2/domains/dom_01hxa3b4c5d6e7f8g9h0j1k2m3/actions/retry-registration" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "recoveryValues": {
      "music_nexus_connection_to_music": "ENT",
      "music_nexus_registry_policies_attestation": "YES"
    }
  }'
```

```json
{
  "recoveryValues": {
    "music_nexus_connection_to_music": "ENT",
    "music_nexus_registry_policies_attestation": "YES"
  }
}
```

#### Retry after account details were updated

```bash
curl -X POST "https://cloud.hostup.se/api/v2/domains/dom_01hxa3b4c5d6e7f8g9h0j1k2m3/actions/retry-registration" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "profileUpdated": true
  }'
```

```json
{
  "profileUpdated": true
}
```

### Response Schema

- `domainId` (string, required) Example: `dom_abc123`
- `registrationStatus` (string, required) Example: `submitted`
  Allowed values: queued, submitted, completed, failed
- `reason` (string | null, required) Example: `Domain registered. Account status sync is still in progress.`
- `outcome` (object, optional)
- `operation` (object, optional): Present when a background status-sync job was queued so clients can refresh only after local domain status is up to date.
- `operation.status` (string, required) Example: `in_progress`
  Allowed values: in_progress
- `operation.jobId` (string, required): Public job ID. Domain retry status jobs use the `dbj_...` prefix. Example: `dbj_01hxa3b4c5d6e7f8g9h0j1k2m3`
- `operation.pollUrl` (string, required) Example: `/api/jobs/dbj_01hxa3b4c5d6e7f8g9h0j1k2m3`

### Responses

#### 200 - Registration retry outcome.
```json
{
  "domainId": "dom_abc123",
  "registrationStatus": "submitted",
  "reason": "Domain registered. Account status sync is still in progress.",
  "operation": {
    "status": "in_progress",
    "jobId": "dbj_01hxa3b4c5d6e7f8g9h0j1k2m3",
    "pollUrl": "/api/jobs/dbj_01hxa3b4c5d6e7f8g9h0j1k2m3"
  }
}
```

#### 400 - Invalid request. The response body is an RFC 7807 Problem Details document.
```json
{
  "type": "https://developer.hostup.se/errors/invalid_request",
  "title": "Invalid request",
  "status": 400,
  "detail": "The request body failed validation.",
  "code": "invalid_request",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z",
  "errors": [
    {
      "pointer": "/items/0/domainName",
      "detail": "`domainName` is required.",
      "code": "invalid_request"
    }
  ]
}
```

#### 401 - Unauthorized. Authentication is required.
```json
{
  "type": "https://developer.hostup.se/errors/unauthorized",
  "title": "Unauthorized",
  "status": 401,
  "detail": "Authentication is required.",
  "code": "unauthorized",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 403 - Forbidden. The caller lacks a required scope or does not own the resource.
```json
{
  "type": "https://developer.hostup.se/errors/forbidden",
  "title": "Forbidden",
  "status": 403,
  "detail": "The caller lacks a required scope or does not own the resource.",
  "code": "forbidden",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 404 - Not found. The resource does not exist or is not owned by the caller.
```json
{
  "type": "https://developer.hostup.se/errors/not_found",
  "title": "Not found",
  "status": 404,
  "detail": "The requested resource could not be found.",
  "code": "not_found",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 422 - Registration details are required before retrying.
```json
{
  "type": "https://developer.hostup.se/errors/registration_recovery_required",
  "title": "Registration needs details",
  "status": 422,
  "code": "registration_recovery_required",
  "detail": "example.music: This domain extension needs a few extra registration details before we can submit it again.",
  "extensions": {
    "recovery": {
      "action": "provide_registration_details",
      "suggestedBody": {
        "recoveryValues": {
          "music_nexus_connection_to_music": ""
        }
      }
    }
  }
}
```

#### 429 - Rate limited. Retry after the limit resets. 429 responses include `Retry-After` seconds plus `X-RateLimit-*` headers.
```json
{
  "type": "https://developer.hostup.se/errors/rate_limit_exceeded",
  "title": "Too many requests",
  "status": 429,
  "detail": "Too many requests. Retry after the limit resets.",
  "code": "rate_limit_exceeded",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 500 - Internal error. Retry later or contact support if the issue persists.
```json
{
  "type": "https://developer.hostup.se/errors/internal_error",
  "title": "Internal server error",
  "status": 500,
  "detail": "An unexpected error occurred. Retry later or contact support if the issue persists.",
  "code": "internal_error",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```
