API Key Externa (/api/ext)
App: Minotaur Sales API
Publicado por: Minotaur Sales
Compatível com: app.minotaursales.io
Documentação dos endpoints externos protegidos com API Key.
Autenticação
Todos os endpoints deste documento usam:
Authorization: X-API-Key YOUR_API_KEY
Content-Type: application/json
URL base:
https://api.minotaursales.io/api/ext
Exemplo:
curl --location 'https://api.minotaursales.io/api/ext/contacts/list' \
--header 'Authorization: X-API-Key YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{}'
Formatos de resposta comuns
DefaultResponse
Muitos endpoints de create/update/delete respondem com:
{
"success": true,
"data": {},
"message": "Operation completed"
}
PaginateResponse<T>
{
"data": [],
"pagination": {
"total_records": 0,
"current_page": 1,
"total_pages": 1
}
}
Cliente (/customer)
GET /customer/summary (customer:read)
Retorna o resumo do cliente associado ao API Key: dados da conta, contagem de usuários e assinatura ativa.
Resposta 200:
{
"customer": {
"id": "7a70f0db-aa4c-43fd-bbf5-f7b0d33c9172",
"business_name": "Acme Inc",
"status": "OK",
"country": null,
"city": null
},
"users_count": 5,
"subscription": {
"id": "3a35dea5-7354-43c8-a3ea-5abec718b2ab",
"status": "active",
"balance": 40000,
"price": "20000",
"periodicity": "month",
"currency": "usd",
"tier": {
"id": "66c609bc-cb1a-4a2b-a34b-212d3acb616b",
"title": "Free Tier",
"tier": 1,
"is_free": true,
"price": "20000"
},
"active_seats": 1
}
}
Contatos (/contacts)
POST /contacts/list (contacts:read)
Request (exemplo mínimo):
{
"filters": {},
"paginate": {
"page": 1,
"limit": 25
}
}
Resposta 200 (ContactsResponse[]):
[
{
"id": "7b9c3df7-0eb5-4be2-af74-7e48d4b43b9c",
"first_name": "Ana",
"middle_name": null,
"last_name": "Perez",
"gender": null,
"birth_year": null,
"linkedin_url": null,
"facebook_url": null,
"twitter_url": null,
"work_email": "ana@example.com",
"personal_email": null,
"other_emails": null,
"industry": "Software",
"job_title": "Engineer",
"location_locality": "Bogota",
"location_country": "CO",
"location_region": "Cundinamarca",
"location_postal_code": null,
"phone_numbers": [],
"company": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"company_name": "Acme",
"industry": "Software"
},
"mobile_phone": null,
"score": 87,
"verification_status": "verified",
"last_verified": "2026-04-01T10:30:00.000Z",
"hubspot_synced_at": null,
"custom_fields": {}
}
]
POST /contacts/metadata (contacts:read)
Request:
{
"filters": {},
"paginate": { "page": 1, "limit": 25 }
}
Resposta 200 (ContactMetadataResponse):
{
"pagination": {
"current_page": 1,
"total_records": 1,
"total_pages": 1
}
}
POST /contacts (contacts:create)
Campos obrigatórios:
first_namelast_namework_emailphone_numbers(pode ser array vazio)
Campos opcionais:
assigned_to— UUID do usuário ao qual o contato será atribuído.list_ids— UUIDs de listas existentes onde o contato será adicionado.company— objeto comid(empresa existente) ouname(busca ou cria pelo nome).
Request:
{
"first_name": "Ana",
"last_name": "Perez",
"work_email": "ana@example.com",
"phone_numbers": [],
"job_title": "Engineer",
"company": {
"name": "Acme",
"industry": "Software"
},
"list_ids": ["f1e2d3c4-b5a6-7890-abcd-ef1234567890"],
"assigned_to": "6cbe57bf-bf80-44c0-a2f7-8d6d4ca85dbd"
}
Resposta 201 (DefaultResponse):
{
"success": true,
"message": "Contact created successfully"
}
GET /contacts/:id (contacts:read)
Resposta 200 (ContactsResponse)
PATCH /contacts/:id (contacts:update)
Todos os campos são opcionais; apenas os campos enviados no body são atualizados.
Request:
{
"job_title": "Senior Engineer",
"phone_numbers": [
{ "country_code": "+57", "number": "3001234567" }
],
"company": { "name": "Acme", "industry": "Software" },
"list_ids": ["f1e2d3c4-b5a6-7890-abcd-ef1234567890"],
"assigned_to": "6cbe57bf-bf80-44c0-a2f7-8d6d4ca85dbd"
}
Resposta 200 (DefaultResponse)
DELETE /contacts/:id (contacts:delete)
Resposta 200 (DefaultResponse)
Empresas (/company)
POST /company/list (companies:read)
Resposta 200 (CompaniesResponse[])
POST /company/metadata (companies:read)
Resposta 200 (CompanyMetadataResponse)
POST /company (companies:create)
Campos obrigatórios: type, company_name.
Request:
{
"type": "COMPANY",
"company_name": "Acme Inc",
"industry": "Software"
}
Resposta 201 (DefaultResponse)
GET /company/:id (companies:read)
Resposta 200 (CompaniesResponse | null)
PATCH /company/:id (companies:update)
Resposta 200 (DefaultResponse)
DELETE /company/:id (companies:delete)
Resposta 200 (DefaultResponse)
Listas (/list-contact)
POST /list-contact/list (list_contacts:read)
Request (page e limit na raiz do body):
{
"page": 1,
"limit": 25
}
Resposta 200 (ListContactResponse[])
POST /list-contact (list_contacts:create)
Request:
{
"name": "Prospects Latam",
"description": "Lista inicial",
"rules": [
{ "field": "location_country", "operator": "contains", "value": "CO" }
]
}
Resposta 201 (CreateListContactResponse):
{
"id": "9f720ce2-f5d1-4ef4-a0c8-3399f68d386d",
"name": "Prospects Latam"
}
PATCH /list-contact/:id (list_contacts:update)
Resposta 200 (DefaultResponse)
DELETE /list-contact/:id (list_contacts:delete)
Resposta 200 (DefaultResponse)
POST /list-contact/duplicate (list_contacts:read)
Request:
{
"list_id": "9f720ce2-f5d1-4ef4-a0c8-3399f68d386d",
"new_name": "Prospects Latam Cópia"
}
Resposta 200 (DefaultResponse)
POST /list-contact/verify-contacts/:id (list_contacts:read)
Sem body. Inicia o processo de verificação dos contatos da lista.
Resposta 200 (DefaultResponse)
Detalhes de Lista (/list-contact-details)
POST /list-contact-details/add-contacts (list_contact_details:update)
Adiciona um ou mais contatos existentes a uma lista.
Request:
{
"list_id": "9f720ce2-f5d1-4ef4-a0c8-3399f68d386d",
"contact_ids": [
"7b9c3df7-0eb5-4be2-af74-7e48d4b43b9c",
"a96f2d7f-743f-4747-9198-7ca35ccab774"
]
}
Resposta 200 (DefaultResponse):
{
"success": true,
"message": "Contacts added successfully"
}
Produtos (/products)
POST /products/list (products:read)
Request:
{
"paginate": { "page": 1, "limit": 25 }
}
Resposta 201 (ProductListItemResponse[])
POST /products (products:create)
Campos obrigatórios: name, price, unit.
Request:
{
"name": "Plano Básico",
"price": 99.99,
"unit": "month",
"currency": "USD"
}
Resposta 201 (DefaultResponse)
GET /products/:id (products:read)
Resposta 200 (ProductResponse)
PATCH /products/:id (products:update)
Resposta 200 (DefaultResponse)
DELETE /products/:id (products:delete)
Resposta 200 (DefaultResponse)
Oportunidades (/opportunities)
POST /opportunities/list (opportunities:read)
Request:
{
"paginate": { "page": 1, "limit": 25 }
}
Resposta 201 (OpportunityResponse[])
POST /opportunities (opportunities:create)
Campos obrigatórios: name, contacts_ids, stage_id, user_id_assigned, products, estimated_closing_date, close_date, priority (URGENT | HIGHT | MEDIUM | LOW | NONE).
Campos opcionais: description, company_id, source_id.
Request:
{
"name": "Deal com Acme",
"contacts_ids": ["7b9c3df7-0eb5-4be2-af74-7e48d4b43b9c"],
"stage_id": "b1c2d3e4-f5a6-7b8c-9d0e-1f2a3b4c5d6e",
"user_id_assigned": "6cbe57bf-bf80-44c0-a2f7-8d6d4ca85dbd",
"estimated_closing_date": "2026-07-01T00:00:00.000Z",
"close_date": "2026-07-15T00:00:00.000Z",
"priority": "HIGHT",
"products": []
}
Resposta 201 (DefaultResponse)
GET /opportunities/:id (opportunities:read)
Resposta 200 (OpportunityResponse)
PATCH /opportunities/:id (opportunities:update)
Para atualizar produtos use a estrutura products.add, products.remove, products.update.
Resposta 200 (DefaultResponse)
DELETE /opportunities/:id (opportunities:delete)
Resposta 200 (DefaultResponse)
Pipelines (/pipelines)
GET /pipelines (pipelines:read)
Retorna todos os pipelines do cliente.
Resposta 200 (PipelineExternalItem[]):
[
{
"id": "c1d2e3f4-a5b6-7c8d-9e0f-1a2b3c4d5e6f",
"name": "Pipeline de Vendas",
"description": "Pipeline principal",
"currency": "USD",
"active": true
}
]
GET /pipelines/:id (pipelines:read)
Retorna o pipeline com seus estágios.
Resposta 200 (PipelineResponse)
Estágios (/stages)
POST /stages/list (stages:read)
Retorna os estágios de um pipeline.
Campo obrigatório: pipeline_id.
Request:
{
"pipeline_id": "c1d2e3f4-a5b6-7c8d-9e0f-1a2b3c4d5e6f",
"paginate": { "page": 1, "limit": 25 }
}
Resposta 201 (StageResponse[])
Prospectos (/prospect)
Requer conectividade com o cluster do Elasticsearch.
POST /prospect/filters (prospect:read)
Retorna valores sugeridos para autocompletar filtros.
Request:
{
"source": "job_title",
"search": "engineer"
}
Resposta 201 (lista de valores sugeridos)
POST /prospect/metadata (prospect:read)
paginate.limitaceita apenas:10,25,50,100.
Request:
{
"filters": {},
"paginate": { "page": 1, "limit": 25 },
"all_contacts": false
}
Resposta 201 (MetadataContactFilterResponse)
POST /prospect/list (prospect:read)
paginate.limitaceita apenas:10,25,50,100.
Request:
{
"filters": {},
"paginate": { "page": 1, "limit": 25 },
"all_contacts": false
}
Resposta 201 (ProspectContactResponse[])
Service Handler (/service-handler)
POST /service-handler/unlock-contacts (payment_prospect:create)
Desbloqueia contatos do catálogo de prospectos com base em filtros. Consome créditos da assinatura.
Request:
{
"filters": {},
"order_by": { "score": "DESC" },
"total_records": 100,
"sync_hubspot": false
}
Resposta 200:
{
"id": "7ec0d9c6-cab6-46cf-8d5a-b5f22f17f6da",
"status": "PENDING"
}
POST /service-handler/unlock-selected-contacts (payment_prospect:create)
Desbloqueia contatos específicos por ID. Consome créditos da assinatura.
Request:
{
"ids": [
"7b9c3df7-0eb5-4be2-af74-7e48d4b43b9c",
"a96f2d7f-743f-4747-9198-7ca35ccab774"
],
"sync_hubspot": false
}
Resposta 200:
{
"id": "dc7248f7-bc52-4710-b854-a8caac8ca5a6",
"status": "PENDING"
}
POST /service-handler/verify-email (verify_email:create)
Inicia a verificação de e-mails para uma lista de contatos. Consome créditos de verificação.
Request:
{
"emails": [
{
"email": "ana@example.com",
"contact_id": "7b9c3df7-0eb5-4be2-af74-7e48d4b43b9c"
}
],
"sync_hubspot": false
}
Resposta 200:
{
"id": "f2c4f038-63fc-4f78-a86d-88f26a7398d8",
"status": "PENDING"
}
Erros comuns
401 Unauthorized
Quando o header Authorization está ausente ou é inválido:
{
"statusCode": 401,
"message": "The provided API key is invalid or unauthorized."
}
400 Bad Request
Quando o body não passa nas validações (campos obrigatórios, UUID inválido, tipos incorretos, limit fora do intervalo).
403 Forbidden
Quando o API Key não tem a permissão necessária para o endpoint:
{
"statusCode": 403,
"message": "User does not have permission"
}