# PUT /api/v1/domains/{domain}/contacts

> Hold a registrar contact update for confirmation

- Group: domains
- Tier: W
- Required scope: write:domains
- Docs: https://api.inleed.com/reference/domains/update-domain-contacts

## Description

Validates ownership and the full contact, then returns `{status:"confirmation_required", confirmationUrl, preview, …}`. It writes nothing on this call.

## Path parameters

- `domain` — string (required)

## Body

- `first_name` — string (required). Up to 64 characters.
- `last_name` — string (required). Up to 64 characters.
- `email` — string · email (required). Up to 255 characters.
- `street` — string (required). Up to 128 characters.
- `city` — string (required). Up to 64 characters.
- `postalcode` — string (required). Up to 32 characters.
- `country` — string (required). Up to 2 characters.
- `phone` — string (required). Up to 32 characters.
- `state` — string. Up to 64 characters.
- `company` — string. Up to 128 characters.
- `organization_no` — string. Up to 64 characters.
- `vat_number` — string. Up to 64 characters.
- `attempt_key` — string. Idempotency key for this intent. Keep it stable across retries so a timed-out retry cannot buy the same thing twice. Up to 128 characters.

## Request

```bash
curl -X PUT "https://mcp.inleed.com/api/v1/domains/example.se/contacts" \
  -H "Authorization: Bearer inl_live_…" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"example.se","last_name":"example.se","email":"info@example.se","street":"example.se","city":"example.se","postalcode":"example.se","country":"example.se","phone":"example.se","state":"example.se","company":"example.se","organization_no":"example.se","vat_number":"example.se","attempt_key":"example.se"}'
```

## Response · 200

```json
{
  "status": "active",
  "pendingActionId": "example.se",
  "confirmationUrl": "https://mcp.inleed.com/…",
  "expiresAt": "2026-08-30T09:12:44.000Z",
  "preview": []
}
```

## Errors

- **400**  — codes: invalid_request
- **401** No token was presented, or the token is revoked, expired or unknown. — codes: unauthorized, token_expired, token_revoked
- **403** The token lacks a required scope, or this account does not own the resource. — codes: insufficient_scope, not_owned
- **404** No such resource for this account. — codes: not_found
- **422** Validation error — codes: validation_failed
- **429** The rate limit for this token is exhausted. See `Retry-After`. — codes: rate_limited
- **500** Something went wrong on our side. The failure is logged against `requestId`. — codes: internal_error

## Related

- GET /api/v1/domains/{domain}/contacts — https://api.inleed.com/reference/domains/get-domain-contacts
- GET /api/v1/domains — https://api.inleed.com/reference/domains/list-domains
- GET /api/v1/domains/{domain} — https://api.inleed.com/reference/domains/get-domain
- GET /api/v1/domains/{domain}/contacts/verification — https://api.inleed.com/reference/domains/get-contact-verification

