Skip to content

Create a legal entity

The entities.create operation: POST /api/v1/entities in the REST API and the entities_create tool in the MCP server.

POST/api/v1/entities

Adds a legal entity: the company that sells (the seller of record), with its establishment, company registry ID, home tax ID, default currency, time zone and invoice settings. Brands are created under an entity next.

The entity starts onboarding and unverified. Its home tax ID is verified later (VIES for eu_vat, HMRC for gb_vat, CH UID for ch_vat, otherwise a registry extract reviewed by Ownrecord). Invoice settings default to the number format {series}-{year}-{seq:06}, a yearly sequence reset and English invoices.

The plan limits the number of entities (entities.max); one more than the limit is entitlement_required. The slug is unique within the organization. Needs entities:write (organization owners and admins).

At a glance

  • REST: POST /api/v1/entities
  • MCP tool: entities_create
  • Operation ID: entities.create
  • Scope: Organization
  • Permission: entities:write
  • Risk tier: write
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key required
  • Modes: Test and live
  • Authentication: API key with the entities:write scope
  • Since: M1

Request

Body

A JSON object (Content-Type: application/json):

FieldTypeRequiredDescription
slugstringYes
legalNamestringYes
tradingNamestringNo
establishmentobjectYes
establishment.countrystringYes
establishment.subdivisionstringNo
establishment.addressobjectYes
establishment.address.line1stringYes
establishment.address.line2stringNo
establishment.address.citystringYes
establishment.address.postalCodestringNo
establishment.address.regionstringNo
establishment.address.countrystringNo
establishment.companyRegistryIdstringYes
establishment.euVatEstablishedbooleanNo
homeTaxIdobjectYes
homeTaxId.typestringYes
homeTaxId.valuestringYes
defaultCurrencystringYes
timezonestringYes
invoiceSettingsobjectNo
invoiceSettings.numberFormatstringNo
invoiceSettings.sequenceResetYearlybooleanNo
invoiceSettings.languagestringNo
invoiceSettings.bilingualstring or nullNo
invoiceSettings.footerTextstring or nullNo
invoiceSettings.bankTransferobject or nullNo

Response

201 Created with a JSON object:

FieldTypeDescription
ident_… ID
object"legal_entity"
orgIdorg_… ID
slugstring
legalNamestring
tradingNamestring or null
establishmentobject
establishment.countrystring
establishment.subdivisionstring or null
establishment.addressobject
establishment.address.line1string
establishment.address.line2string or null
establishment.address.citystring
establishment.address.postalCodestring or null
establishment.address.regionstring or null
establishment.address.countrystring
establishment.companyRegistryIdstring
establishment.euVatEstablishedboolean
homeTaxIdobject
homeTaxId.typestring
homeTaxId.valuestring
verificationobject
verification.statusone of unverified, pending_review, verified, rejected
verification.methodone of vies, hmrc, ch_uid, document
verification.checkedAtdate-time or null
defaultCurrencystring
timezonestring
invoiceSettingsobject
invoiceSettings.numberFormatstring
invoiceSettings.sequenceResetYearlyboolean
invoiceSettings.languagestring
invoiceSettings.bilingualstring or null
invoiceSettings.footerTextstring or null
invoiceSettings.bankTransferobject or null
statusone of onboarding, active, suspended, archived
createdAtdate-time
updatedAtdate-time

Examples

A Croatian company

HTTP
POST /api/v1/entities
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "slug": "acme-hr",
  "legalName": "Acme Digital d.o.o.",
  "establishment": {
    "country": "HR",
    "address": {
      "line1": "Ilica 1",
      "city": "Zagreb",
      "postalCode": "10000"
    },
    "companyRegistryId": "080000000",
    "euVatEstablished": true
  },
  "homeTaxId": {
    "type": "eu_vat",
    "value": "HR12345678901"
  },
  "defaultCurrency": "EUR",
  "timezone": "Europe/Zagreb"
}

Response (201):

JSON
{
  "id": "ent_01m4tx5nj8emwbyf7y9vcf47x2",
  "object": "legal_entity",
  "orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
  "slug": "acme-hr",
  "legalName": "Acme Digital d.o.o.",
  "tradingName": null,
  "establishment": {
    "country": "HR",
    "subdivision": null,
    "address": {
      "line1": "Ilica 1",
      "line2": null,
      "city": "Zagreb",
      "postalCode": "10000",
      "region": null,
      "country": "HR"
    },
    "companyRegistryId": "080000000",
    "euVatEstablished": true
  },
  "homeTaxId": {
    "type": "eu_vat",
    "value": "HR12345678901"
  },
  "verification": {
    "status": "unverified",
    "method": "vies",
    "checkedAt": null
  },
  "defaultCurrency": "EUR",
  "timezone": "Europe/Zagreb",
  "invoiceSettings": {
    "numberFormat": "{series}-{year}-{seq:06}",
    "sequenceResetYearly": true,
    "language": "en",
    "bilingual": null,
    "footerText": null,
    "bankTransfer": null
  },
  "status": "onboarding",
  "createdAt": "2026-10-13T12:00:00.000Z",
  "updatedAt": "2026-10-13T12:00:00.000Z"
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400A field is missing or malformed (details.issues).Fix the fields listed in details.issues and send the request again.
slug_invalid400The slug has the wrong format or is a reserved word.Choose a slug such as acme or acme-app. Reserved words such as api, console and docs can't be used.
slug_taken409Another entity of this organization already uses this slug.Choose another slug. Organization and brand slugs are unique across Ownrecord; entity slugs are unique within an organization.
entitlement_required403The plan's entities.max is reached.Upgrade the organization's plan, or remove something to get back under the limit.
permission_denied403You can't create legal entities in this organization.Ask an organization owner or admin for a role or scope that allows this action.

It can also return these common errors: api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, resource_not_found, idempotency_key_required, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.