> ## Documentation Index
> Fetch the complete documentation index at: https://docs.capcells.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Company profile

> What your Tenancy states about the company behind it, what the Platform does with it, and the figures it does not touch.

A **Company profile** is what your Tenancy states about the company behind it: the legal entity, the market, its time zone, and optionally the name its products go out under and the legal form it is registered as. It is the second half of onboarding, and it is held for screens and for reporting rather than for any calculation.

A Tenancy holds one profile. The latest statement is the profile, and no call answers any statement it replaced.

## What it carries

Five fields, three of them required. Each is stated by you; the Platform derives none of them.

| Field | Required | What it is | Bounds |
| - | - | - | - |
| `legal_entity_name` | Yes | The company as its own registry of companies has it. | 1 to 200 characters |
| `country_code` | Yes | Where the company lends, as an ISO 3166-1 alpha-2 code. | One of the 50 countries the Platform names |
| `time_zone` | Yes | The company's own civil clock, as an IANA zone name. | A name the zone database carries — `America/Mexico_City`, never an offset |
| `brand_name` | No | The name the products go out under, where it differs from the legal one. | 1 to 200 characters |
| `entity_type` | No | The legal form the company is registered under, named as its own country names it. | 1 to 200 characters |

An optional field is stated or absent, never blank. A statement carrying `"brand_name": ""` or `"brand_name": null` is refused `422` naming the field; leaving the key out is the ordinary statement, and the answer leaves the field out too rather than returning an empty string.

<Info>
  The Platform holds no tax rate, no address, no tax identifier, no bank account and no officer. A body carrying one is refused `400` naming that field rather than accepted with the field dropped: a Tenancy that sent a value believes the value is held.
</Info>

<Warning>
  `vat_rate_bps` was a required field until the profile stopped holding a rate. Until **15 January 2027** a statement carrying it is accepted with the field ignored, and the answer carries `Deprecation` and `Sunset` headers naming that day, and a `Link` to the [changelog entry](/changelog#2026-10-15). From that day it is refused `400` like any other field the profile does not hold. Remove it from your statements now.
</Warning>

## Stating it

You state the whole profile with `PUT /v1/tenants/{tenant_id}/company-profile`. There is no partial edit: a field you leave out is you saying the company has none.

A correction is the same call with the whole profile again. Onboarding and a later correction are the same act performed at different times, so both answer `200` and neither is told apart by its status.

```json The whole profile, stated theme={null}
{
  "legal_entity_name": "Capyplazo S.A. de C.V.",
  "brand_name": "Capyplazo",
  "country_code": "MX",
  "time_zone": "America/Mexico_City",
  "entity_type": "S.A. de C.V."
}
```

The answer is the profile as recorded, with `stated_at` added — the moment the Platform recorded it, in UTC.

```json 200 theme={null}
{
  "legal_entity_name": "Capyplazo S.A. de C.V.",
  "brand_name": "Capyplazo",
  "country_code": "MX",
  "time_zone": "America/Mexico_City",
  "entity_type": "S.A. de C.V.",
  "stated_at": "2026-08-23T21:27:59.672084Z"
}
```

Stating a profile you already hold records nothing and answers what stands, `stated_at` included. A retry after a lost response is therefore indistinguishable from the attempt it repeats, and the call needs no Reference and no idempotency key.

<Warning>
  A statement replaces what the last one said, and no call answers what it replaced. Recovering a value you overwrote means stating it again.
</Warning>

## Absence is an answer

A Tenancy that has never stated a profile answers `404` and names the state:

```json 404 theme={null}
{ "error": "company: no profile has been stated", "code": "no_profile" }
```

That is an answer rather than a fault. Read it as onboarding not being finished and render the form. The Platform never invents an empty profile, because a company with no name and a company that has not been asked yet are different states and a screen has to be able to tell them apart.

Another Tenancy's profile answers `404` too, which keeps a profile that exists elsewhere and one that was never stated indistinguishable from outside.

## What the Platform suggests

The Platform has worked four markets out for onboarding and carries a list of legal forms for each. A screen offers them so the operator picks from a filled list instead of typing into an empty field.

| Market | Legal forms offered |
| - | - |
| Mexico (`MX`) | S.A.P.I. de C.V., S.A. de C.V., SOFOM E.N.R., SOFOM E.R., SOFIPO, SOCAP, Banco |
| Spain (`ES`) | S.L., S.A., Establecimiento Financiero de Crédito, Entidad de crédito |
| Philippines (`PH`) | Corporation, Lending Company, Financing Company, Bank |
| Uzbekistan (`UZ`) | MChJ, AJ, Mikromoliya tashkiloti, Lombard, Bank |

The registry also answers the tax rules each of these markets admits, as `tax_rules`. Those are not a suggestion and not part of the profile: they are what a Loan's `tax` is held to at issuance. See [Markets](/lending/markets).

Every country carries a suggested time zone, not only the four with a pack: the registry answers `suggested_time_zone` on every entry, the Console prefills the field from it, and you confirm or change it. A country is not a zone — Mexico spans three — so the suggestion is the one thing the Platform will not apply for you. What a record freezes is the zone you stated.

They suggest and constrain nothing. A legal form no list carries is recorded as stated — a list that constrained would make every correction to it a breaking change for companies already registered under an older form.

The country is the one field the Platform does hold you to. A code outside the 50 it names is refused `422` naming the country:

```json 422 theme={null}
{ "error": "company: unknown country: the registry does not name JP", "code": "unknown_country" }
```

The 46 countries without a pack are named and carry no legal forms and no tax rules. Stating one is a profile with a market and only its zone prefilled, not a lesser profile.

## What it does not govern

No figure the Platform computes reads the profile. Two consequences are worth stating on their own, because both are easy to assume the other way.

**A Loan's tax owes nothing to the profile.** Tax on a Loan is one of the rules the Platform admits for the Loan's jurisdiction, chosen in the Loan's `tax` and frozen when it is issued. The profile states no rate to differ from it. [Mexico](/lending/mexico) lists the rules Mexico admits.

**The stated country neither opens nor closes lending.** Whether the Platform can carry a Loan in a market is decided at issuance, from the rule tables, by name — and decided the same way for a Tenancy that stated nothing. A company that states Spain and issues in Mexico is admitted; a company that states Spain and issues in Spain is refused, because the Platform reads none of Spain's law. Where a company is and what the Platform is supplied to do there are two statements, and only the second gates anything.

The profile is not a precondition for lending. A Tenancy issues Loans, registers Clients and reports Receipts without ever stating one. Facilities and credit decisions are the exception: they read the stated time zone, and are refused `no_time_zone` until a profile carrying one stands.

Reading it back and stating it are [Read the company profile](/api-reference/company-profile/read) and [State the company profile](/api-reference/company-profile/state).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.