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

> ## Agent Instructions
> Documentação das APIs da DeliveryVip, em português. Regras que mais quebram integrações: (1) Merchant API: faça polling em GET /merchant/v3/events:polling no máximo a cada 30 s por token; confirme todo evento recebido com POST /merchant/v3/events/acknowledgment e corpo [{"id": "<eventId>"}] (o campo lido é id, não eventId), inclusive eventos repetidos ou que o sistema não trata; deduplique por eventId; o evento é só um aviso, busque o pedido na orderURL. (2) Tokens client_credentials valem 24 h e não têm refresh_token: peça outro ao receber 401. (3) Webhooks: valide a assinatura HMAC sobre o corpo bruto e responda 2xx rápido; o polling é a reconciliação. (4) Open Delivery: host od.deliveryvip.com.br, um client_secret por loja, datas em UTC. (5) Fidelidade: o operador implementa 5 rotas assinadas com HMAC e chama o config push; o estorno precisa ser idempotente. (6) Partner API: scope dv.partner. Não invente endpoints: use a referência gerada das specs OpenAPI.

# Cadastro de lojas

> Cadastre loja e conta do proprietário a partir de uma landing page pública, sem expor quais e-mails têm conta.

`POST /partner/v2/{partnerId}/signup` cria uma loja e a conta do proprietário a partir de uma **página pública** (landing page). A diferença para [Cadastrar uma loja](/docs/guides/partner/merchant/utilizando-a-api/adicionar-um-merchant.md) é quem preenche o formulário: aqui é um visitante anônimo, não o seu backend. Por isso o endpoint nunca revela se um e-mail já tem conta e nunca dá acesso a uma conta existente.

> [!WARNING]
>
> O token `dv.partner` não pode ir para o navegador. A landing page envia o formulário ao **seu backend**, e é ele que chama este endpoint.

## Como funciona

![O backend chama o signup; se o e-mail é novo, conta e loja são criadas e o visitante segue pelo entryUrl; se já existe, nada é criado e o dono recebe um e-mail](https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/partner-signup.png?fit=max\&auto=format\&n=ELxpcniK2_BP8zxT\&q=85\&s=e6fde0c363d3bf8cd004e8b57fb0bbdf)

O fluxo do signup

* **E-mail novo**: a conta e a loja são criadas (a loja nasce em `TRIAL`, no plano padrão do parceiro, com o visitante como `OWNER`). A resposta traz o `merchantId` e o `entryUrl`, um link de **uso único**, válido por **5 minutos**, que autentica o novo proprietário no painel.
* **E-mail já cadastrado**: nada é criado e nenhum acesso é concedido. O dono real da conta recebe um e-mail com os próximos passos. Uma conta existente nunca é vinculada a uma loja nova sem prova de posse.

> [!WARNING]
>
> A resposta é **intencionalmente a mesma** (`201`, mesma `message`) nos dois casos. **Não diferencie a interface**: use só a presença de `entryUrl` para decidir se redireciona o visitante.

## Corpo

**partnerId** `uuid` *required*

ID do parceiro ou de uma revenda. Com o ID de uma revenda, a loja nasce nela.

**user** `object` *required*

Proprietário.

**propriedades**

**name** `string` *required*

Nome.

**email** `string` *required*

E-mail.

**password** `string` *required*

Senha escolhida pelo proprietário, com no mínimo 6 caracteres. É com ela que ele acessa o painel depois.

**phone.number** `string`

Telefone.

**store** `object` *required*

Loja.

**propriedades**

**name** `string` *required*

Nome fantasia.

**corporateName** `string`

Razão social. Sem ela, usa o nome fantasia.

**identifier** `string` *required*

CNPJ ou CPF válido.

**email** `string`

E-mail da loja. Sem ele, usa o e-mail do proprietário.

**address** `object` *required*

Endereço completo: `postalCode`, `street`, `number`, `district`, `city` e `state`, todos obrigatórios.

## Requisição

```bash cURL theme={null}
curl --request POST 'https://api.deliveryvip.com.br/partner/v2/{partnerId}/signup' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "user": {
      "name": "Maria Silva",
      "email": "maria@exemplo.com.br",
      "password": "segredo123",
      "phone": { "number": "11999998888" }
    },
    "store": {
      "name": "Cantina da Maria",
      "corporateName": "Cantina da Maria LTDA",
      "identifier": "11222333000144",
      "email": "contato@cantinadamaria.com.br",
      "address": {
        "postalCode": "01310100",
        "street": "Avenida Paulista",
        "number": "1000",
        "district": "Bela Vista",
        "city": "São Paulo",
        "state": "SP"
      }
    }
  }'
```

```js Node.js theme={null}
const response = await fetch(`https://api.deliveryvip.com.br/partner/v2/${partnerId}/signup`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ user: form.user, store: form.store }),
})
const result = await response.json()

if (response.status === 201 && result.entryUrl) {
  // Redirect the visitor's browser to result.entryUrl
}
```

```python Python theme={null}
response = requests.post(
    f"https://api.deliveryvip.com.br/partner/v2/{partner_id}/signup",
    headers={"Authorization": f"Bearer {token}"},
    json={"user": form["user"], "store": form["store"]},
)
result = response.json()

if response.status_code == 201 and result.get("entryUrl"):
    redirect_url = result["entryUrl"]
```

## Respostas

> [tab] 201 · e-mail novo
>
> Conta e loja criadas. Redirecione o visitante para o `entryUrl`.
>
> ```json theme={null}
> {
>   "message": "Recebemos seu cadastro. Enviamos um e-mail com os próximos passos.",
>   "entryUrl": "https://painel.seudominio.com.br/signup/entry?token=...",
>   "merchantId": "261c2c8f-9b6a-4ce3-88ef-10b49d7d716d"
> }
> ```
>
> O host do `entryUrl` é o domínio do painel configurado para o parceiro, não um host fixo.

> [tab] 201 · e-mail cadastrado
>
> Nada foi criado. Mostre a mesma mensagem de sucesso; o dono da conta recebe um e-mail.
>
> ```json theme={null}
> {
>   "message": "Recebemos seu cadastro. Enviamos um e-mail com os próximos passos."
> }
> ```

> [tab] 403 · sem domínio
>
> O parceiro não tem domínio de painel configurado. Nada é criado.
>
> ```json theme={null}
> { "status": "403", "title": "partner must be setup a domain to user access" }
> ```

> [tab] 422 · validação
>
> O `title` traz os erros por campo, com os nomes internos em snake\_case.
>
> ```json theme={null}
> { "status": "422", "title": { "password": ["is too short (minimum is 6 characters)"] } }
> ```

> [!WARNING]
>
> Configure o domínio do painel **antes** de publicar a landing page. Sem ele, todo cadastro é recusado com `403`.


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