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

# Conta e equipe

> Confira as chaves de API e o time, o cadastro da empresa, a marca e os documentos de verificação.

As operações da conta em si: as **chaves de API**, os **membros do time** e o **cadastro da empresa**, com endereço, marca e documentos. Os webhooks têm guia próprio em [Gerenciar webhooks](https://docs.ephra.io/webhooks/gerenciar.md), e a subconta que libera o saque está em [Financeiro](https://docs.ephra.io/guias/financeiro.md#8-descubra-por-que-o-saque-não-sai).

## 1. Confira as chaves e o time

```bash cURL theme={"system"}
curl -s https://api.ephra.io/v1/api-keys \
  -H "Authorization: Bearer $TOKEN"
```

```javascript Node theme={"system"}
const res = await fetch("https://api.ephra.io/v1/api-keys", {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});
const json = await res.json();
```

```python Python theme={"system"}
import requests

res = requests.get(
    "https://api.ephra.io/v1/api-keys",
    headers={
        "Authorization": f"Bearer {token}",
    },
)
data = res.json()
```

```json theme={"system"}
{
  "success": true,
  "data": [
    {
      "id": 21,
      "type": "COMPANY",
      "publicKey": "cmtxzjidu0000isg1f7pzbisr",
      "active": true,
      "invalidatedAt": null,
      "createdAt": "2026-09-12T06:09:38.515Z",
      "updatedAt": "2026-09-12T06:09:38.515Z"
    },
    {
      "id": 16,
      "type": "COMPANY",
      "publicKey": "cmtxyq14b000014g1barehx03",
      "active": false,
      "invalidatedAt": "2026-09-12T06:09:38.507Z",
      "createdAt": "2026-09-12T05:46:43.116Z",
      "updatedAt": "2026-09-12T06:09:38.509Z"
    }
  ]
}
```

Chaves revogadas continuam na lista, com `active: false` e a data em `invalidatedAt`: serve de auditoria. O segredo nunca volta por esta rota: ele só existe na tela de criação, no painel.

```bash cURL theme={"system"}
curl -s "https://api.ephra.io/v1/team-members?page=1&pageSize=5" \
  -H "Authorization: Bearer $TOKEN"
```

```javascript Node theme={"system"}
const res = await fetch("https://api.ephra.io/v1/team-members?page=1&pageSize=5", {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});
const json = await res.json();
```

```python Python theme={"system"}
import requests

res = requests.get(
    "https://api.ephra.io/v1/team-members?page=1&pageSize=5",
    headers={
        "Authorization": f"Bearer {token}",
    },
)
data = res.json()
```

```json theme={"system"}
{
  "success": true,
  "data": [
    {
      "userId": "cmtxx1ua10000hlg1leidi9cj",
      "name": "Fixtures Produtor A",
      "email": "fixtures-company-a@public-api.invalid",
      "roles": [
        "user"
      ],
      "participation": null
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 5,
    "total": 1,
    "totalPages": 1
  }
}
```

## 2. Confira o cadastro da empresa

Antes de um lançamento, vale conferir se a empresa está `active`: e pegar o próprio `companyId`, que nenhuma outra rota pede porque ele sai sempre do token.

```bash cURL theme={"system"}
curl -s https://api.ephra.io/v1/company \
  -H "Authorization: Bearer $TOKEN"
```

```javascript Node theme={"system"}
const res = await fetch("https://api.ephra.io/v1/company", {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});
const json = await res.json();
```

```python Python theme={"system"}
import requests

res = requests.get(
    "https://api.ephra.io/v1/company",
    headers={
        "Authorization": f"Bearer {token}",
    },
)
data = res.json()
```

```json theme={"system"}
{
  "success": true,
  "data": {
    "id": "cmtxx1uar0001hlg1u3ajbj6o",
    "name": "Doce Ofício Confeitaria Digital LTDA",
    "document": "19131243000197",
    "documentType": "CNPJ",
    "type": "company",
    "status": "active",
    "isActive": true,
    "isBlocked": false,
    "logoUrl": "https://documentos.ephra.io/companies/cmtxx1uar0001hlg1u3ajbj6o/logo.jpg?X-Amz-Expires=900",
    "description": "Cursos de confeitaria artesanal para quem vende doce em casa.",
    "address": {
      "zipCode": "01310930",
      "street": "Avenida Paulista",
      "number": "1578",
      "complement": "Conjunto 402",
      "neighborhood": "Bela Vista",
      "city": "São Paulo",
      "state": "SP",
      "country": "Brasil"
    },
    "createdAt": "2026-03-11T13:02:00.000Z",
    "updatedAt": "2026-09-10T17:44:00.000Z"
  }
}
```

`status: "active"` com `isBlocked: false` é a única combinação que vende. `logoUrl` é uma URL temporária assinada: baixe o arquivo, não guarde o link.

Mudou de sede? O endereço que sai em documento fiscal e o que a verificação de cadastro confere é este:

```bash cURL theme={"system"}
curl -s -X PUT https://api.ephra.io/v1/company/address \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "zipCode": "01310930",
    "street": "Avenida Paulista",
    "number": "1578",
    "complement": "Conjunto 402",
    "neighborhood": "Bela Vista",
    "city": "São Paulo",
    "state": "SP"
  }'
```

```javascript Node theme={"system"}
const res = await fetch("https://api.ephra.io/v1/company/address", {
  method: "PUT",
  headers: {
    Authorization: `Bearer ${token}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "zipCode": "01310930",
    "street": "Avenida Paulista",
    "number": "1578",
    "complement": "Conjunto 402",
    "neighborhood": "Bela Vista",
    "city": "São Paulo",
    "state": "SP"
  }),
});
const json = await res.json();
```

```python Python theme={"system"}
import requests

res = requests.put(
    "https://api.ephra.io/v1/company/address",
    headers={
        "Authorization": f"Bearer {token}",
    },
    json={
        "zipCode": "01310930",
        "street": "Avenida Paulista",
        "number": "1578",
        "complement": "Conjunto 402",
        "neighborhood": "Bela Vista",
        "city": "São Paulo",
        "state": "SP"
    },
)
data = res.json()
```

Os campos omitidos ficam como estão.

O que o comprador vê da sua marca, o logo no checkout, no e-mail de confirmação e no perfil público, muda por outra rota. O logo vai em **base64**, num `data:` URL, e substitui o anterior:

```bash cURL theme={"system"}
curl -s -X PUT https://api.ephra.io/v1/company/branding \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
    "description": "Cursos de confeitaria artesanal para quem vende doce em casa."
  }'
```

```javascript Node theme={"system"}
const res = await fetch("https://api.ephra.io/v1/company/branding", {
  method: "PUT",
  headers: {
    Authorization: `Bearer ${token}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
    "description": "Cursos de confeitaria artesanal para quem vende doce em casa."
  }),
});
const json = await res.json();
```

```python Python theme={"system"}
import requests

res = requests.put(
    "https://api.ephra.io/v1/company/branding",
    headers={
        "Authorization": f"Bearer {token}",
    },
    json={
        "logo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
        "description": "Cursos de confeitaria artesanal para quem vende doce em casa."
    },
)
data = res.json()
```

```json theme={"system"}
{
  "success": true,
  "data": {
    "logoUrl": "https://documentos.ephra.io/companies/cmtxx1uar0001hlg1u3ajbj6o/logo_cmtxx1uar0001hlg1u3ajbj6o.png?X-Amz-Expires=900",
    "description": "Cursos de confeitaria artesanal para quem vende doce em casa."
  }
}
```

São aceitos `image/png`, `image/jpeg`, `image/jpg` e `image/webp`. Uma URL comum no lugar do `data:` URL é recusada na validação, com os formatos esperados na própria mensagem:

```json theme={"system"}
{
  "success": false,
  "message": "logo: logo deve ser um data URL base64 (image/jpeg, image/jpg, image/png, image/webp)"
}
```

`logo: null` remove o logo atual e `description: null` apaga a descrição: omitir o campo, ao contrário, não mexe nele. A `logoUrl` que volta é assinada e temporária, como a de `GET /v1/company`: serve para conferir o envio, não para colar num site.

Os documentos de verificação já enviados saem em URLs temporárias do mesmo tipo:

```bash cURL theme={"system"}
curl -s https://api.ephra.io/v1/company/documents \
  -H "Authorization: Bearer $TOKEN"
```

```javascript Node theme={"system"}
const res = await fetch("https://api.ephra.io/v1/company/documents", {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});
const json = await res.json();
```

```python Python theme={"system"}
import requests

res = requests.get(
    "https://api.ephra.io/v1/company/documents",
    headers={
        "Authorization": f"Bearer {token}",
    },
)
data = res.json()
```

```json theme={"system"}
{
  "success": true,
  "data": {
    "documentUrl": null,
    "companyConstitution": null,
    "proofOfAddress": null,
    "proofOfBankAccount": null
  }
}
```

`null` não é erro: significa que aquele documento ainda não foi enviado. Quatro `null` numa empresa que não consegue sacar é exatamente o diagnóstico de [por que o saque não sai](https://docs.ephra.io/guias/financeiro.md#8-descubra-por-que-o-saque-não-sai).

O envio é a mesma rota com `PUT`, e cada arquivo também vai em base64: aqui `application/pdf` entra na lista de formatos, com teto de 5 MB por arquivo:

```bash cURL theme={"system"}
curl -s -X PUT https://api.ephra.io/v1/company/documents \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "documentUrl": "data:application/pdf;base64,JVBERi0xLjQKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFI+PgpzdHJlYW0K",
    "proofOfAddress": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
  }'
```

```javascript Node theme={"system"}
const res = await fetch("https://api.ephra.io/v1/company/documents", {
  method: "PUT",
  headers: {
    Authorization: `Bearer ${token}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "documentUrl": "data:application/pdf;base64,JVBERi0xLjQKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFI+PgpzdHJlYW0K",
    "proofOfAddress": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
  }),
});
const json = await res.json();
```

```python Python theme={"system"}
import requests

res = requests.put(
    "https://api.ephra.io/v1/company/documents",
    headers={
        "Authorization": f"Bearer {token}",
    },
    json={
        "documentUrl": "data:application/pdf;base64,JVBERi0xLjQKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFI+PgpzdHJlYW0K",
        "proofOfAddress": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
    },
)
data = res.json()
```

```json theme={"system"}
{
  "success": true,
  "data": {
    "documentUrl": "https://documentos.ephra.io/companies/cmtxx1uar0001hlg1u3ajbj6o/document_cmtxx1uar0001hlg1u3ajbj6o.pdf?X-Amz-Expires=900",
    "companyConstitution": null,
    "proofOfAddress": "https://documentos.ephra.io/companies/cmtxx1uar0001hlg1u3ajbj6o/proof_of_address_cmtxx1uar0001hlg1u3ajbj6o.png?X-Amz-Expires=900",
    "proofOfBankAccount": null
  }
}
```

Os nomes dos campos não são óbvios, e são os mesmos na leitura e no envio:

| Campo | Documento |
| - | - |
| `documentUrl` | Cartão CNPJ |
| `companyConstitution` | Contrato social |
| `proofOfAddress` | Comprovante de endereço |
| `proofOfBankAccount` | Comprovante de conta bancária |

A resposta traz os quatro depois da gravação, então dá para conferir o que ainda falta sem uma segunda chamada. Os documentos que ficaram de fora do corpo continuam como estavam, e reenviar um substitui o anterior. É este envio que resolve o `needsCompanyDocuments: true` da [situação da subconta](https://docs.ephra.io/guias/financeiro.md#8-descubra-por-que-o-saque-não-sai).

## Todas as operações

> [card] [Chaves e equipe](https://docs.ephra.io/api-reference/plataforma/listar-chaves-de-api.md)
>
> Chaves de API ativas e revogadas, membros e convites.

> [card] [Empresa](https://docs.ephra.io/api-reference/plataforma/consultar-dados-da-empresa.md)
>
> Cadastro, endereço, marca e documentos.

> [card] [Integrações](https://docs.ephra.io/guias/integracoes.md)
>
> Aplicativos externos, canais de comunidade e entrega automática.

> [card] [Webhooks](https://docs.ephra.io/webhooks/gerenciar.md)
>
> Cadastro, teste, entregas e supressão.


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