Perfil do seller
Lê e altera o perfil da empresa do seller, em formato fixo ou como formulário dinâmico, e confere se uma URL de loja está disponível.
O perfil reúne tudo o que identifica o seller dentro da loja: nome fantasia, CNPJ, contatos, endereço, logomarca, dados para receber repasses e as preferências de e-mail. Há duas formas de ler e gravar o mesmo perfil, e você escolhe conforme o que está construindo:
- Formato fixo (
/profile): um objeto com os campos conhecidos. Simples para integrações. - Formulário dinâmico (
/profile/form): a lista de campos que a loja habilitou, com rótulos, obrigatoriedade e valor atual. Ideal para desenhar a tela de cadastro sem fixar campos no código.
Quem pode gravar: usuários do seller com o privilégio de configurações. A leitura é livre para qualquer usuário do seller.
Ler o perfil
/api/v1/vendor/profileSellerPerfil completo do seller autenticado
Devolve o seller dono do token. Se o usuário seller ainda não tem o cadastro da empresa, a resposta é 200 com vendor nulo (veja abaixo).
Exemplo de requisição: ler
curl "$BASE_URL/api/v1/vendor/profile" \
-H "Authorization: Bearer $TOKEN"Resposta: ler
{
"id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"display_id": 26,
"user_id": "0fd409fb-9869-4c50-a18c-a810a19abeed",
"company_name": "Loja Seller Teste",
"slug": "loja-seller-teste",
"status": "A",
"cnpj": "",
"email": "contato@lojaseller.example.com",
"phone": "+5511999998888",
"website": "https://lojaseller.example.com",
"address_line1": "Rua dos Testes, 100",
"city": "Volta Redonda",
"state": "RJ",
"postal_code": "27253-650",
"country": "BR",
"commission_rate": 9,
"commission_type": "percentage",
"payment_model": "marketplace_collects",
"fulfillment_type": "vendor_fulfilled",
"marketplace_shipping_fee_bps": 0,
"payout_method": "pix",
"bank_name": "Banco Exemplo",
"bank_agency": "0001",
"bank_account": "12345-6",
"pix_key": "contato@lojaseller.example.com",
"logo_url": "/uploads/.../logo.png",
"banner_url": "/uploads/.../banner.png",
"description": "<p>Descrição da loja</p>",
"terms_accepted": true,
"products_require_approval": true,
"email_new_order": true,
"email_order_status": true,
"email_low_stock": false,
"email_payout": true,
"is_on_vacation": false,
"debt_balance": 0,
"settlement_term_days": 20,
"settlement_term_anchor": "per_installment",
"approved_at": "2026-07-19T21:23:56.72622Z",
"created_at": "2026-05-29T18:52:13.802087Z",
"updated_at": "2026-09-15T19:00:17.901599Z"
}{ "vendor": null, "vendor_profile_required": true }Campos da resposta
iduuiddisplay_idintegeruser_iduuidcompany_namestringslugstring/<slug> na vitrine.statusstringA, ativo). O seller não consegue alterá-la.cnpjstringemailstringphonestringmobile_phonestringwebsitestringaddress_line1stringaddress_numberstringaddress_complementstringaddress_districtstringcitystringstatestringpostal_codestringcountrystringBR).latitudenumberlongitudenumbercommission_ratenumber9 = 9%). Somente leitura para o seller.commission_typestringpercentage). Somente leitura para o seller.payment_modelstringmarketplace_collects: a loja recebe e repassa). Somente leitura para o seller.fulfillment_typestringvendor_fulfilled: o próprio seller). Somente leitura para o seller.marketplace_shipping_fee_bpsinteger100 = 1%). Somente leitura para o seller.payout_methodstringpix).bank_codestringbank_namestringbank_agencystringbank_accountstringbank_account_typestringbank_account_holderstringpix_keystringlogo_urlstringemail_logo_urlstringbanner_urlstringdescriptionstringterms_acceptedbooleanterms_accepted_atstringproducts_require_approvalbooleanemail_new_orderbooleanemail_order_statusbooleanemail_low_stockbooleanemail_payoutbooleanis_on_vacationbooleandebt_balanceintegersettlement_term_daysintegersettlement_term_anchorstringper_installment, a cada parcela).approved_atstringcreated_atstringupdated_atstringA resposta traz ainda campos de compatibilidade com a plataforma antiga (address, company, company_id, zipcode, logos, timestamp, updated_timestamp) e os campos fiscais e de representante legal (legal_name, cnae_code, state_reg, tax_regime, rep_*, dpo_*) quando preenchidos. Em integrações novas, ignore os de compatibilidade.
Alterar o perfil
/api/v1/vendor/profileSellerAltera parcialmente o perfil do seller
Altera só os campos enviados; o que você omite fica como está. A resposta é o perfil completo depois da mudança. PUT /api/v1/vendor/settings é um apelido que faz exatamente a mesma coisa.
Campos que o seller não controla são descartados sem erro: commission_rate, commission_type, status, payment_model, pagarme_recipient_id, fulfillment_type, marketplace_shipping_fee_bps e products_require_approval.
Exige um privilégio de configurações do seller (por exemplo vendor_settings).
Corpo da requisição
company_namestringslugstringcnpjstringlegal_namestringcnae_codestringstate_regstringtax_regimestringmeisimples_nacionallucro_presumidolucro_reallucro_arbitradoemailstringphonestringmobile_phonestringwebsitestringaddress_line1stringaddress_line2stringaddress_numberstringaddress_complementstringaddress_districtstringcitystringstatestringpostal_codestringcountrystringlatitudenumberlongitudenumberdescriptionstringlogo_urlstringemail_logo_urlstringbanner_urlstringpayout_methodstringpix).bank_codestringbank_namestringbank_agencystringbank_accountstringbank_account_typestringbank_account_holderstringpix_keystringemail_new_orderbooleanemail_order_statusbooleanemail_low_stockbooleanemail_payoutbooleanignore_emailstringrep_full_namestringrep_cpf, rep_birth_date, rep_email, rep_phone, rep_mother_name.dpo_namestringdpo_email, dpo_phone.Exemplo de requisição: alterar
curl -X PUT "$BASE_URL/api/v1/vendor/profile" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"phone": "+5511988887777", "email_low_stock": true}'A resposta de sucesso é 200 com o mesmo objeto do perfil.
Ler o formulário dinâmico
/api/v1/vendor/profile/formSellerPerfil como lista de campos configuráveis
Devolve, em ordem, cada campo de perfil de seller que a loja habilitou, já com o valor atual. Use para montar a tela de cadastro sem listar campos no código. A senha nunca aparece.
{
"fields": [
{
"field_name": "company_name",
"field_type": "I",
"label": "Nome Fantasia",
"label_en": "Trade Name",
"placeholder": "Nome comercial do seller",
"placeholder_en": "Seller trade name",
"description": "Nome exibido na loja e nos pedidos.",
"description_en": "Name displayed in the storefront and orders.",
"required": true,
"position": 1,
"is_system": true,
"is_mandatory": true,
"section": "V",
"value": "Loja Seller Teste"
},
{
"field_name": "tax_regime",
"field_type": "S",
"label": "Regime tributário",
"required": false,
"position": 9,
"is_system": true,
"is_mandatory": false,
"section": "V",
"values": [
{ "label": "MEI", "value": "mei" },
{ "label": "Simples Nacional", "value": "simples_nacional" }
],
"value": ""
}
],
"total": 25
}Campos da resposta
fieldsarraytotalintegerfields[].field_namestringPUT /profile/form.fields[].field_typestringI texto curto, T texto longo, S lista de opções, P telefone, F arquivo. A loja pode definir outros.fields[].labelstringlabel_en é o rótulo em inglês.fields[].placeholderstringplaceholder_en em inglês.fields[].descriptionstringdescription_en em inglês.fields[].requiredbooleanfields[].is_systembooleantrue quando o campo grava numa coluna do seller; false quando é um campo extra criado pela loja.fields[].is_mandatorybooleantrue quando a plataforma exige o campo e a loja não pode torná-lo opcional.fields[].positionintegerfields[].sectionstringV é a seção do seller).fields[].valuesarraylabel e value) quando o tipo é lista.fields[].valuestringGravar o formulário dinâmico
/api/v1/vendor/profile/formSellerGrava valores do perfil por nome de campo
Recebe um objeto fields com pares nome do campo: valor (sempre texto). Cada valor vai para o destino certo: campos de sistema atualizam o cadastro do seller, campos extras ficam guardados à parte. A resposta é o formulário recalculado, no mesmo formato da leitura. Exige o privilégio de configurações.
Corpo da requisição
fieldsobjectobrigatóriofield_name para o novo valor, em texto. Só campos habilitados na loja; um campo desconhecido ou desligado recusa a requisição inteira. A chave password é sempre recusada.Exemplo de requisição: formulário
curl -X PUT "$BASE_URL/api/v1/vendor/profile/form" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"fields": {"company_name": "Loja Seller Teste", "phone": "+5511988887777"}}'Conferir a URL da loja
/api/v1/vendor/profile/check-slugSellerConfere se uma URL de loja está disponível
Antes de trocar o slug, pergunte se ele serve. A conferência ignora o próprio seller, então a URL que você já usa aparece como livre. Uma URL de loja já excluída continua ocupada.
Parâmetros de consulta
slugstringobrigatórioa-z, 0-9 e hífen entre grupos (minha-loja), sem começar nem terminar com hífen.{ "available": false, "reason": "reserved" }Campos da resposta
availablebooleantrue se pode usar.reasonstringreservedformattakenavailable é falso: reserved (nome reservado pela loja, como admin ou login) format (tamanho ou caracteres inválidos) ou taken (URL válida que já pertence a outro seller, inclusive um excluído).Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Corpo não é JSON. | {"error":"invalid request body","detail":"..."} |
| 400 | slug ausente na conferência. | {"error":"slug query param is required"} |
| 400 | Slug fora da regra, na gravação. | {"error":"slug_invalid","detail":"slug_invalid: must match ^[a-z0-9]+(-[a-z0-9]+)*$"} |
| 400 | Slug reservado, na gravação. | {"error":"slug_reserved","detail":"..."} |
| 400 | CNPJ inválido. | {"error":"vendor_cnpj_invalid","detail":"vendor_cnpj_invalid: 123"} |
| 400 | Regime tributário fora da lista. | {"error":"vendor_tax_regime_invalid","detail":"vendor_tax_regime_invalid: zzz"} |
| 400 | E-mail inválido (formulário). | {"error":"vendor_email_invalid","detail":"..."} |
| 400 | Formulário sem o objeto fields. | {"error":"fields object is required"} |
| 400 | Campo desconhecido ou desligado (formulário). | {"error":"unknown_or_disabled_profile_field","detail":"unknown_or_disabled_profile_field: nonexistent"} |
| 400 | Campo obrigatório ficaria vazio (formulário). | {"error":"required_profile_field_missing","detail":"..."} |
| 400 | password no formulário. | {"error":"password_not_a_profile_field","detail":"password is set during registration, not via the profile form"} |
| 401 | Sem token. | {"error":"authentication required"} |
| 403 | Falta privilégio de configurações. | {"error":"insufficient vendor privileges","privilege_required_any":["vendor_settings","..."]} |
| 403 | Usuário seller sem cadastro de empresa (gravação). | {"error":"vendor_profile_required"} |
| 403 | Troca de e-mail, senha ou dados bancários durante um "login como". | {"error":"impersonation_blocked_field","field":"email","message":"Esta alteração requer login direto do usuário."} |
| 404 | Conferência de slug sem seller para o usuário. | {"error":"vendor profile not found"} |
| 409 | Slug já em uso. | {"error":"slug_taken","detail":"..."} |
| 409 | CNPJ já em uso por outro seller. | {"error":"vendor_cnpj_in_use","detail":"..."} |
| 409 | E-mail já em uso (formulário). | {"error":"vendor_email_in_use","detail":"..."} |