Pular para o conteúdo principal

API: criar company (POST) — guia para o frontend

Canónico: guias/post-company.md · apis/05-companies.md · catálogo.

Documento de referência para integração do cadastro de empresa (company) na API CentralCRM.

Dois sistemas: o login (POST /api/v1/auth/login) usa outro banco (user_profiles) e emite JWT sem tenantId. Para criar/listar companies neste backend é necessário JWT com sub e tenantId (ver secção Autenticação abaixo).


Endpoint

ItemValor
MétodoPOST
URL{BASE_URL}/api/v1/companies
Exemplohttps://api.seudominio.com/api/v1/companies

Versão da API na URL: v1.


Autenticação (obrigatória)

Todas as rotas de /api/v1/companies exigem JWT no header:

Authorization: Bearer <access_token>

O token deve ser assinado com o mesmo JWT_SECRET configurado no backend e conter no payload (claims):

ClaimTipoObrigatórioDescrição
substringSimIdentificador do usuário (ex.: UUID do usuário no sistema).
tenantIdstring (UUID)SimTenant ao qual a company será vinculada. O backend não usa mais o header X-Tenant-Id para essa rota — o isolamento multi-tenant vem deste claim.

Se o token estiver ausente, inválido ou expirado, a API responde 401 Unauthorized.


Corpo da requisição (Content-Type: application/json)

Envie um objeto JSON com os campos abaixo.

Campos

Campo (JSON)ObrigatórioTipoLimite / regrasDescrição
razaoSocialSimstringmáx. 255 caracteres, não vazioRazão social da empresa.
nomeFantasiaNãostringmáx. 255Nome fantasia.
cnpjNãostringmáx. 18CNPJ (formato livre no envio; unicidade é por tenant no banco).
emailNãostringe-mail válido, máx. 255E-mail de contato.
telefoneNãostringmáx. 20Telefone.
statusNãostring (enum)Ver tabela abaixoSituação da company.
metadataNãoobjectJSON objetoMetadados extras (chave/valor livre para o produto).

Valores aceitos para status

Se omitido, o backend grava como ativo.

Valor enviadoSignificado
ativoCompany ativa (padrão).
inativoCompany inativa.
suspensoCompany suspensa.

Comportamento de campos opcionais omitidos

  • nomeFantasia, cnpj, email, telefone: armazenados como null se não enviados.
  • status: assume ativo.
  • metadata: assume {} (objeto vazio).

Validação (erros comuns)

  • Propriedades não listadas no contrato podem ser rejeitadas (400) se o backend estiver com validação estrita (whitelist).
  • Corpo inválido (tipos errados, razaoSocial vazio, e-mail inválido, etc.) → 400 Bad Request com mensagem de validação.

Resposta de sucesso

HTTPSignificado
201 CreatedCompany criada.

Corpo JSON de exemplo (campos retornados):

CampoTipoDescrição
idstring (UUID)ID da company criada.
tenantIdstring (UUID)Igual ao tenantId do JWT.
razaoSocialstring
nomeFantasiastring | null
cnpjstring | null
emailstring | null
telefonestring | null
statusstringEx.: "ativo".
metadataobject
createdAtstringData/hora ISO 8601 (UTC).
updatedAtstringData/hora ISO 8601 (UTC).

Erros relevantes

HTTPQuando
400JSON inválido ou falha nas regras de validação (campos obrigatórios, formatos).
401Sem Authorization, token inválido ou expirado.
409 ConflictViolação de unicidade no banco (ex.: mesmo CNPJ já cadastrado para o mesmo tenant).

Exemplo mínimo (fetch)

const baseUrl = 'https://api.seudominio.com';
const accessToken = '...'; // JWT com sub e tenantId

const res = await fetch(`${baseUrl}/api/v1/companies`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${accessToken}`,
},
body: JSON.stringify({
razaoSocial: 'Minha Empresa LTDA',
}),
});

if (!res.ok) {
const err = await res.json().catch(() => ({}));
throw new Error(err.message ?? res.statusText);
}

const company = await res.json();
// company.id, company.tenantId, ...

Exemplo completo (todos os campos opcionais)

{
"razaoSocial": "ACME Serviços LTDA",
"nomeFantasia": "ACME",
"cnpj": "12345678000199",
"email": "contato@acme.com.br",
"telefone": "11987654321",
"status": "ativo",
"metadata": {
"origemCadastro": "web",
"codigoInterno": 12345
}
}

Tipagem TypeScript (referência)

type CompanyStatus = 'ativo' | 'inativo' | 'suspenso';

interface CreateCompanyRequest {
razaoSocial: string;
nomeFantasia?: string;
cnpj?: string;
email?: string;
telefone?: string;
status?: CompanyStatus;
metadata?: Record<string, unknown>;
}

interface CompanyResponse {
id: string;
tenantId: string;
razaoSocial: string;
nomeFantasia: string | null;
cnpj: string | null;
email: string | null;
telefone: string | null;
status: string;
metadata: Record<string, unknown>;
createdAt: string;
updatedAt: string;
}

Gerado a partir do contrato atual do backend (CreateCompanyRequestDto, CompanyResponseDto, guard JWT).