# Roteamento por visitante e teste A/B

> Mande cada visitante para um destino conforme país, estado, cidade, sistema, dispositivo ou idioma, e divida o tráfego entre variantes A/B.

Fonte: https://curtei.com/docs/api/roteamento


## Regras (`rules`)

Até 20 regras por link. A primeira que casar decide o destino; sem nenhuma, vale `url`. Condições na mesma regra são combinadas com E; valores numa lista, com OU.

```json
{
  "url": "https://minhaloja.com.br",
  "rules": [
    {
      "label": "iPhone",
      "conditions": {
        "os": [
          "ios"
        ],
        "device_type": [
          "mobile"
        ]
      },
      "url": "https://apps.apple.com/br/app/id123"
    },
    {
      "label": "Android",
      "conditions": {
        "os": [
          "android"
        ]
      },
      "url": "https://play.google.com/store/apps/details?id=br.loja"
    },
    {
      "label": "Portugal",
      "conditions": {
        "country": [
          "PT"
        ]
      },
      "url": "https://loja.pt/"
    }
  ]
}
```

| Condição | Valores |
| --- | --- |
| `country` | ISO-3166 alfa-2: `BR`, `PT`… |
| `region` | Estado em ISO 3166-2: `BR-SP`, `BR-MG`… |
| `city` | Nome da cidade (`São Paulo`), sem diferenciar acento nem maiúsculas; combine com `region` |
| `os` | `ios`, `android`, `windows`, `macos`, `linux`, `other` |
| `device_type` | `mobile`, `tablet`, `desktop` |
| `language` | Do navegador: `pt`, `pt-br`, `es`… |

Para abrir um app, use links universais (iOS), App Links (Android) ou a página da loja. Esquemas próprios como `meuapp://` não são aceitos como destino.

## Teste A/B (`variants`)

De 2 a 10 variantes com peso de 1 a 100. O mesmo visitante cai sempre na mesma variante. As regras são avaliadas antes; as variantes valem para quem não casou com nenhuma regra.

```json
{
  "variants": [
    {
      "label": "A",
      "url": "https://loja.com.br/oferta-a",
      "weight": 50
    },
    {
      "label": "B",
      "url": "https://loja.com.br/oferta-b",
      "weight": 50
    }
  ]
}
```

No `PATCH`, mandar `rules` ou `variants` substitui a lista inteira daquele tipo (`[]` remove); omitir mantém. Compare as variantes com `GET /links/{id}/stats/breakdown?dimension=rule` ou, em vendas, `GET /links/{id}/conversions/stats?dimension=rule`.
