---
title: "Set the company or personal details"
method: PUT
path: "/project/company"
tags: ["Project"]
---

# Set the company or personal details

`PUT /project/company`

## Request

- Base URL: `https://api.hypamoon.com/api/v1`
- URL: `https://api.hypamoon.com/api/v1/project/company`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://app.hypamoon.com/oauth/authorize`, token URL `https://api.hypamoon.com/oauth/token`, scopes: `project:write`)

A phone number is registered to a business or a person. For a business, set the company name, the address with its country, a contact person and the number in its country's business register (kvk_number in the Netherlands, registration_number elsewhere) before you order a number. Without a company, send account_type personal with the user's address and the user as contact: no registration number needed. A national number needs a business; a personal account can order a geographic number. In test mode no registration or VAT number is needed to order a test number. Switching to account_type personal is refused while the project has a national number (account_type_change_blocked); every switch resets the number_documents and full verification levels to not_started. In the EU send vat_number: we check it with VIES before saving (vat_number_invalid when VIES says it is not valid; vat_status unverified when VIES does not respond, and we retry). A country we cannot serve returns country_not_supported. Which numbers you can order is what GET /numbers/available returns. PUT replaces all fields, except registrar_contact_name, which keeps its saved value when left out. When the project has domains registered or transferred through Hypamoon, the contact, email, phone and address also go to each domain's contact at the registry; domain_contacts in the response says per domain updated, unchanged, skipped or failed, with the reason. A change of organization, registration number or (personal account) person is a change of holder: never sent automatically, it needs Hypamoon support.

## Request body

- CompanyInput: Who the project belongs to, and who its phone numbers are registered to: a business or a personal account (account_type). For a business: company_name, the address, the number in its country's business register (kvk_number in the Netherlands, registration_number elsewhere) and, in the EU, vat_number (checked with VIES). For a personal account: the user's address and the contact (the user), without company fields.
  - `account_type` 'personal' | 'business': personal (someone without a company: no company_name, kvk_number, registration_number or vat_number) or business. Leave it out to keep the project's current type. A national number needs business. When a personal account is not available for the address, validation_failed says so.
  - `company_name` string, nullable: The legal name. Required for a business, not allowed for a personal account.
  - `kvk_number` string, nullable: For a company in the Netherlands (required there): the KvK number, 8 digits. Spaces and dots are removed.
  - `registration_number` string, nullable: For a company outside the Netherlands: the number in its country's business register (like a UK Companies House number or a German HRB number). Needed for the company verification level outside the EU.
  - `vat_number` string, nullable: The VAT number. In the EU outside the Netherlands it is needed for the company verification level and checked with VIES: send it with or without the country prefix. A number that VIES rejects returns vat_number_invalid.
  - `address` object, required
    - `street` string, required: The street, with the house number if the address has no separate one.
    - `house_number` string, nullable: The house number, starting with a digit, like 40 or 12A. Required where the country's addresses use one (like the Netherlands), optional elsewhere.
    - `postal_code` string, required: The postal code. It is normalized for the country where we know the format (in the Netherlands 1000aa is saved as 1000 AA).
    - `city` string, required: The city.
    - `country` string: ISO 3166-1 alpha-2, like GB, DE or NL. Defaults to NL when left out. A country we cannot serve returns country_not_supported.
  - `contact` object, required: A person the regulator can reach today. For a personal account: the user.
    - `name` string, required: The contact person's first and last name. For a business it can also be a role, like Administration or Webmaster; this name also goes on the domains registered or transferred through Hypamoon, unless registrar_contact_name is set. Ordering a phone number still needs a person with a first and last name. For a personal account: the user's own first and last name.
    - `phone` string, required: A phone number where the contact can be reached, in E.164.
  - `registrar_contact_name` string, nullable: Optional, for a business: the name on the contacts of the domains registered or transferred through Hypamoon, when it should differ from contact.name. Use a role, like Administration or Webmaster, so the domain registration carries no personal name while contact.name stays the person that number registration needs. Leave it out to keep the saved value; send null to use contact.name again. Not allowed for a personal account.

## Response `200`

The company details as saved.

- Company: The company details of the project (or, for a personal account, your own details), as saved.
  - `account_type` 'personal' | 'business', required: personal (your own details, no business register number) or business.
  - `company_name` string, nullable, required: The legal company name; null for a personal account.
  - `kvk_number` string, nullable, required: 8 digits, for a company in the Netherlands; null elsewhere.
  - `registration_number` string, nullable, required: The number in the business register of the company's country, for a company outside the Netherlands (there it is kvk_number).
  - `vat_number` string, nullable, required: The VAT number, with country prefix in the EU (like DE123456789).
  - `vat_status` 'valid' | 'invalid' | 'unverified' | 'missing' | 'not_required', required: For a company in the EU: the VIES check of vat_number (unverified when VIES did not answer; we retry automatically). missing: no VAT number yet. not_required: no VIES check needed for this country.
  - `vat_checked_at` string, nullable, required: When VIES last checked vat_number, ISO 8601.
  - `address` object, required
    - `street` string, required
    - `house_number` string, nullable, required
    - `postal_code` string, required: Normalized where we know the country's format.
    - `city` string, required
    - `country` string, required: ISO 3166-1 alpha-2, like NL, DE or GB.
  - `contact` object, required
    - `name` string, required
    - `phone` string, required: In E.164.
  - `registrar_contact_name` string, nullable: Only for a business: the name on the domain contacts at the registry when it differs from contact.name, or null (then contact.name is used).
  - `complete` boolean, required: The details are complete enough for the company or personal verification level: a business needs its business register number and, in the EU, a valid VAT number; a personal account needs a complete address.
  - `domain_contacts` object[]: Only when the project has domains registered or transferred through Hypamoon: per domain, whether the new details reached the domain's contact at the registry. A change of organization, registration number or (for a personal account) person is never sent: that is a change of holder.
    - `domain` string, required
    - `status` 'updated' | 'unchanged' | 'skipped' | 'failed', required: updated: the registry has the new contact, email, phone and address. unchanged: it already had them. skipped: not sent, see reason (a test domain, or a change of holder, which only Hypamoon support can do). failed: the registry or registrar refused it, see reason.
    - `reason` string, nullable, required

## Other responses

- `400`: Bad Request: invalid_json.
- `401`: Unauthorized: unauthorized, missing_api_key, invalid_api_key, api_key_revoked, project_deleted.
- `403`: Forbidden: project_not_enabled, key_mode_mismatch, missing_scope, verification_required.
- `422`: Unprocessable Content: validation_failed, vat_number_invalid, country_not_supported, account_type_change_blocked.
- `429`: Too Many Requests: rate_limited.
- `500`: Internal Server Error: internal_error.
- `503`: Service Unavailable: service_unavailable.

---

[API](https://skmtc.dev/hypamoon/apis/hypamoon-api.md) · [All operations](https://skmtc.dev/hypamoon/apis/hypamoon-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hypamoon/apis/hypamoon-api/revisions/9f0b90004c06?raw)
