Pular para o conteúdo principal

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_name
  • last_name
  • work_email
  • phone_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 com id (empresa existente) ou name (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.limit aceita apenas: 10, 25, 50, 100.

Request:

{
"filters": {},
"paginate": { "page": 1, "limit": 25 },
"all_contacts": false
}

Resposta 201 (MetadataContactFilterResponse)

POST /prospect/list (prospect:read)

paginate.limit aceita 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"
}