Skip to main content
PUT
http://api.gu1.ai
/
entities
/
upsert
Upsert
curl --request PUT \
  --url http://api.gu1.ai/entities/upsert \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "entity": {},
  "options": {},
  "options.conflictResolution": {},
  "options.deduplicationStrategy": {},
  "options.createRelationships": true
}
'
{
  "success": true,
  "action": "<string>",
  "entity": {},
  "previousEntity": {},
  "confidence": 123,
  "reasoning": "<string>",
  "conflicts": [
    {}
  ]
}

Visão Geral

O endpoint upsert cria inteligentemente uma nova empresa ou atualiza uma existente com base em estratégias de detecção de duplicatas configuráveis. Ele lida automaticamente com conflitos e previne registros duplicados usando correspondência exata, correspondência difusa ou detecção de similaridade alimentada por IA.

Endpoint

PUT http://api.gu1.ai/entities/upsert

Autenticação

Requer uma chave de API válida no cabeçalho Authorization:
Authorization: Bearer YOUR_API_KEY

Corpo da Requisição

entity
object
required
Os dados da empresa (mesma estrutura do endpoint Criar Empresa)
options
object
Opções de configuração para comportamento do upsert
options.conflictResolution
enum
Como lidar com conflitos quando uma empresa existente é encontrada:
  • source_wins - Novos dados sobrescrevem dados existentes
  • target_wins - Manter dados existentes, ignorar novos dados
  • manual_review - Sinalizar para revisão manual sem atualizar
  • smart_merge (padrão) - Mesclar inteligentemente ambos os conjuntos de dados
options.deduplicationStrategy
enum
Estratégia para detectar empresas duplicadas:
  • exact_match - Correspondência por externalId e taxId (case-insensitive)
  • fuzzy_match - Correspondência de similaridade em name e taxId (limite de 80%)
  • ai_similarity - Detecção de similaridade semântica alimentada por IA
  • hybrid (recomendado) - Correspondência exata com fallback difuso
options.createRelationships
boolean
default:"true"
Se deve criar automaticamente relacionamentos entre entidades

Resposta

success
boolean
Indica se a operação foi bem-sucedida
action
string
A ação realizada: created ou updated
entity
object
O estado final da empresa após o upsert
previousEntity
object
O estado da empresa antes da atualização (null se recém-criada)
confidence
number
Pontuação de confiança (0-1) para a correspondência de detecção de duplicatas
reasoning
string
Explicação de por que a empresa foi criada/atualizada
conflicts
array
Array de conflitos em nível de campo detectados durante a mesclagem (se houver)

Exemplos

Upsert Simples (Comportamento Padrão)

curl -X PUT http://api.gu1.ai/entities/upsert \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "entity": {
      "type": "company",
      "externalId": "business_12345",
      "name": "María González",
      "countryCode": "AR",
      "taxId": "20-12345678-9",
      "entityData": {
        "company": {
          "firstName": "María",
          "lastName": "González",
          "dateOfBirth": "1985-03-15",
          "occupation": "Software Engineer",
          "income": 85000
        }
      }
    }
  }'

Upsert com Correspondência Difusa

curl -X PUT http://api.gu1.ai/entities/upsert \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "entity": {
      "type": "company",
      "externalId": "business_new_123",
      "name": "Maria Gonzales",
      "countryCode": "AR",
      "taxId": "20-12345678-9",
      "entityData": {
        "company": {
          "firstName": "Maria",
          "lastName": "Gonzales"
        }
      }
    },
    "options": {
      "deduplicationStrategy": "fuzzy_match",
      "conflictResolution": "smart_merge"
    }
  }'

Exemplos de Resposta

Nova Empresa Criada

{
  "success": true,
  "action": "created",
  "entity": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "externalId": "business_12345",
    "type": "company",
    "name": "María González",
    ...
  },
  "previousEntity": null,
  "confidence": 1.0,
  "reasoning": "No existing entity found matching criteria. Created new entity.",
  "conflicts": []
}

Empresa Existente Atualizada

{
  "success": true,
  "action": "updated",
  "entity": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "externalId": "business_12345",
    "type": "company",
    "name": "María González",
    "entityData": {
      "company": {
        "income": 95000
      }
    },
    ...
  },
  "previousEntity": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "entityData": {
      "company": {
        "income": 85000
      }
    },
    ...
  },
  "confidence": 1.0,
  "reasoning": "Exact match found on externalId. Updated existing entity with smart merge.",
  "conflicts": [
    {
      "field": "entityData.company.income",
      "oldValue": 85000,
      "newValue": 95000,
      "resolution": "source_wins"
    }
  ]
}

Casos de Uso

Importação de Dados do CRM

// Importar dados de empresa do CRM, evitando duplicatas
async function importBusiness(crmData) {
  const response = await fetch('http://api.gu1.ai/entities/upsert', {
    method: 'PUT',
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      entity: {
        type: 'company',
        externalId: crmData.businessId,
        name: crmData.fullName,
        countryCode: crmData.country,
        taxId: crmData.taxId,
        entityData: {
          company: {
            firstName: crmData.firstName,
            lastName: crmData.lastName,
            income: crmData.annualIncome
          }
        },
        attributes: {
          source: 'crm_import',
          importDate: new Date().toISOString()
        }
      },
      options: {
        deduplicationStrategy: 'hybrid',
        conflictResolution: 'smart_merge'
      }
    })
  });

  return response.json();
}

Enriquecimento Progressivo de Dados

def enrich_company_data(external_id, new_data):
    """Adicionar progressivamente dados à empresa conforme ficam disponíveis"""
    response = requests.put(
        'http://api.gu1.ai/entities/upsert',
        headers={
            'Authorization': 'Bearer YOUR_API_KEY',
            'Content-Type': 'application/json'
        },
        json={
            'entity': {
                'type': 'company',
                'externalId': external_id,
                'name': new_data.get('name'),
                'countryCode': new_data.get('country'),
                'entityData': new_data.get('details', {}),
                'attributes': new_data.get('attributes', {})
            },
            'options': {
                'deduplicationStrategy': 'exact_match',
                'conflictResolution': 'smart_merge'  # Mesclar novo com existente
            }
        }
    )

    result = response.json()
    if result['action'] == 'updated':
        print(f"Enriched existing company with new data")
    return result

Melhores Práticas

  1. Escolha a Estratégia Certa:
    • exact_match para dados limpos e estruturados com IDs confiáveis
    • fuzzy_match para dados inseridos por usuários com possíveis erros de digitação
    • hybrid para a maioria dos cenários de produção
  2. Lide com Conflitos Graciosamente:
    • Use smart_merge para resolução automática
    • Use manual_review para dados críticos
    • Verifique o array conflicts na resposta para mudanças importantes
  3. Monitore Pontuações de Confiança:
    • Pontuações abaixo de 0.7 podem indicar correspondências fracas
    • Registre atualizações de baixa confiança para revisão

Respostas de Erro

400 Bad Request

{
  "error": "Invalid tax ID format for country"
}

500 Internal Server Error

{
  "error": "Failed to upsert entity"
}

Próximos Passos