# Login embutido

> Como gerar URLs de acesso único, válidas por 60 segundos, que abrem o Cortecloud autenticado para um vendedor ou um marceneiro.

URL canônica: https://apis.cortecloud.com.br/docs/guias/login-embutido/

O login embutido abre telas do Cortecloud já autenticadas para um usuário do seu sistema, sem que ele digite usuário e senha. O seu backend pede à API uma URL de acesso e a entrega ao usuário, que a abre no navegador.

Há duas rotas, uma para cada tipo de usuário:

| Rota | Usuário | Tela aberta |
| --- | --- | --- |
| [`POST /embed/quick-service`](https://apis.cortecloud.com.br/docs/swagger#/Embed/createSellerLink) | Vendedor da central | Cadastro de um novo serviço para um marceneiro. |
| [`POST /embed/service`](https://apis.cortecloud.com.br/docs/swagger#/Embed/createCarpenterLink) | Marceneiro | Whitelabel da central: o site da central dentro do Cortecloud, com a marca dela. |

As duas rotas usam a mesma [autenticação](https://apis.cortecloud.com.br/docs/comecando/autenticacao.md) das demais e respondem `201` com a URL:

```json
{ "url": "https://..." }
```

## Cuidados com a URL {#cuidados-com-a-url}

- A URL vale para um único acesso e expira em 60 segundos. Gere-a no momento em que o usuário for abri-la, não antes.
- A URL dá acesso à conta do usuário. Entregue-a só a ele e não a registre em log nem a guarde.
- A chamada à API é feita pelo seu backend, que tem a secret key. O navegador recebe só a URL.

## Novo serviço para um vendedor {#novo-servico-para-um-vendedor}

Rota: [`POST /embed/quick-service`](https://apis.cortecloud.com.br/docs/swagger#/Embed/createSellerLink).

A URL abre o Cortecloud autenticado como o vendedor informado, na tela de cadastro de um novo serviço para o marceneiro informado, a ser produzido na linha de produção indicada.

| Campo | Descrição |
| --- | --- |
| `companyInternalCode` | [Código da central](https://apis.cortecloud.com.br/docs/comecando/conceitos.md#codigo-da-central). Precisa ser igual ao cabeçalho `x-company-internal-code`; se não for, a resposta é `401`. |
| `productionInternalCode` | Código interno da linha de produção onde as peças serão produzidas. |
| `sellerEmail` | E-mail do vendedor que vai receber o acesso. |
| `sellerName` | Nome do vendedor. |
| `carpenterEmail` | E-mail do marceneiro para quem o serviço será criado. |
| `carpenterName` | Nome do marceneiro. |
| `carpenterInternalCode` | Código que identifica o marceneiro no seu sistema. |

Todos os campos são obrigatórios.

Antes de gerar a URL, a rota cadastra o vendedor na central e o marceneiro no Cortecloud, caso ainda não existam, e vincula o marceneiro à central com o código `carpenterInternalCode`. Repetir a chamada com os mesmos dados não duplica cadastros. Dois casos merecem atenção:

- se o marceneiro já tem vínculo ativo com a central, o código interno que ele já tem é mantido, e `carpenterInternalCode` não o substitui;
- se o vendedor está cadastrado em outra central, ele é transferido para a central da requisição e perde o vínculo com a anterior.

```json
{
  "companyInternalCode": "CENTRAL-SP",
  "productionInternalCode": "LINHA-1",
  "sellerEmail": "vendedor@example.com",
  "sellerName": "Fulano Vendedor",
  "carpenterEmail": "marceneiro@example.com",
  "carpenterName": "Beltrano Marceneiro",
  "carpenterInternalCode": "CLI-0042"
}
```

## Área do marceneiro {#area-do-marceneiro}

Rota: [`POST /embed/service`](https://apis.cortecloud.com.br/docs/swagger#/Embed/createCarpenterLink).

A URL abre o whitelabel da central da requisição (`x-company-internal-code`) autenticado como o marceneiro informado. O marceneiro é cadastrado no Cortecloud se ainda não existir.

| Campo | Descrição |
| --- | --- |
| `carpenterEmail` | E-mail do marceneiro que vai receber o acesso. |
| `carpenterName` | Nome do marceneiro. |

Os dois campos são obrigatórios.

```json
{
  "carpenterEmail": "marceneiro@example.com",
  "carpenterName": "Beltrano Marceneiro"
}
```

## Erros {#erros}

| Status | Situação |
| --- | --- |
| `400` | Falta um campo obrigatório, um campo está vazio ou um e-mail é inválido. |
| `401` | Falha de [autenticação](https://apis.cortecloud.com.br/docs/comecando/autenticacao.md#quando-a-autenticacao-falha) ou, em `quick-service`, `companyInternalCode` diferente de `x-company-internal-code`. |
| `404` | Em `/embed/service`: a central não tem whitelabel configurado. |
| `409` | O e-mail informado já pertence a um usuário com outro perfil, por exemplo o e-mail de um vendedor enviado como marceneiro. |
| `429` | A integração passou do [limite de requisições](https://apis.cortecloud.com.br/docs/comecando/erros-limites-paginacao.md#limites-de-requisicao). |
| `5xx` ou outro status | Falha ao cadastrar os usuários ou ao gerar o acesso; a mensagem traz o motivo. Pode ser transitória: repita com espera crescente e um número limitado de tentativas, e escreva para suporte@serrabits.com.br se persistir. |
