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

# Sync e Conflitos

> Gerenciamento de sincronização de assinaturas e resolução de conflitos para catálogos do Marketplace Hub.

## Visão Geral

Quando um publisher lança uma nova versão de catálogo, os assinantes recebem notificação de sync. Dependendo da política de resolução de conflitos da assinatura, conflitos de atualização de produto podem requerer revisão manual.

***

## Acionar sync manualmente

```
POST /api/hub/catalogs/{catalogId}/sync
```

Aciona uma verificação de sync para uma assinatura de catálogo. Normalmente as sincronizações são automáticas quando o publisher lança atualizações, mas você pode acionar manualmente para verificar mudanças pendentes.

### Resposta

```json theme={null}
{
  "synced": true,
  "newVersion": 6,
  "productsUpdated": 12,
  "conflictsDetected": 3,
  "conflictIds": ["prod_abc", "prod_def", "prod_ghi"]
}
```

***

## Listar conflitos

```
GET /api/workspace/{workspaceId}/catalogs/{catalogId}/conflicts
```

Retorna produtos com conflitos pendentes de resolução.

### Resposta

```json theme={null}
{
  "conflicts": [
    {
      "productId": "prod_abc",
      "field": "price",
      "localValue": "79.90",
      "remoteValue": "89.90",
      "detectedAt": "2026-03-18T10:00:00Z"
    }
  ],
  "total": 3
}
```

***

## Resolver conflito

```
PATCH /api/workspace/{workspaceId}/catalogs/{catalogId}/conflicts/{productId}
```

### Corpo da requisição

```json theme={null}
{
  "resolution": "keep_local"
}
```

| Valor             | Descrição                               |
| ----------------- | --------------------------------------- |
| `"keep_local"`    | Manter o valor do workspace local       |
| `"accept_remote"` | Aceitar o valor atualizado do publisher |

***

## Exemplos

<CodeGroup>
  ```bash cURL theme={null}
  # Listar conflitos
  curl "https://app.alana.shopping/api/workspace/ws_123/catalogs/cat_456/conflicts" \
    -H "Authorization: Bearer sk_live_sua_chave_api"

  # Resolver conflito
  curl -X PATCH "https://app.alana.shopping/api/workspace/ws_123/catalogs/cat_456/conflicts/prod_abc" \
    -H "Authorization: Bearer sk_live_sua_chave_api" \
    -H "Content-Type: application/json" \
    -d '{"resolution": "accept_remote"}'
  ```

  ```javascript JavaScript theme={null}
  // Listar conflitos
  const { conflicts } = await fetch(
    `https://app.alana.shopping/api/workspace/${workspaceId}/catalogs/${catalogId}/conflicts`,
    { headers: { 'Authorization': `Bearer ${process.env.ALANA_API_KEY}` } }
  ).then(r => r.json());

  // Resolver
  for (const conflict of conflicts) {
    await fetch(
      `https://app.alana.shopping/api/workspace/${workspaceId}/catalogs/${catalogId}/conflicts/${conflict.productId}`,
      {
        method: 'PATCH',
        headers: {
          'Authorization': `Bearer ${process.env.ALANA_API_KEY}`,
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ resolution: 'accept_remote' }),
      }
    );
  }
  ```

  ```python Python theme={null}
  import requests, os

  headers = {"Authorization": f"Bearer {os.environ['ALANA_API_KEY']}"}
  base = f"https://app.alana.shopping/api/workspace/{workspace_id}/catalogs/{catalog_id}"

  conflicts = requests.get(f"{base}/conflicts", headers=headers).json()["conflicts"]
  for c in conflicts:
      requests.patch(
          f"{base}/conflicts/{c['productId']}",
          headers=headers,
          json={"resolution": "accept_remote"}
      )
  ```
</CodeGroup>
