Encurta um URL de destino numa ligação curta que pode depois utilizar no texto de uma mensagem ou no Portal BulkGate.

## URL da API

URL utilizado para enviar os pedidos HTTP:

```url
https://portal.bulkgate.com/api/1.0/shortener/shorten
```

> [!NOTE]
> Se o pedido não chegar ao destino, repita-o no [servidor de reserva](https://www.bulkgate.com/pt/documentacao/administracao-da-api/servidor-de-reserva/) `backup1.bulkgate.com`.

## Métodos HTTP suportados

- `POST` - `application/json`

```http
POST /api/1.0/shortener/shorten HTTP/1.1
Host: portal.bulkgate.com
Content-Type: application/json
```

> [!NOTE]
> A API tem uma quota de `20` pedidos por minuto.

## Tabela de parâmetros

| NOME DO PARÂMETRO    | VALOR                                                                           | OBRIGATÓRIO | VALOR PREDEFINIDO |
|:------------------|:--------------------------------------------------------------------------------|:----------|:--------------|
| application_id    | [ID da aplicação](https://www.bulkgate.com/pt/documentacao/administracao-da-api/administracao-de-apis/)                                   | **Sim**   | -             | 
| application_token | [Token de autenticação da aplicação](https://www.bulkgate.com/pt/documentacao/administracao-da-api/tokens-de-api/)	                       | **Sim**   | -             |
| target_url        | URL a encurtar	                                                            | **Sim**   | -             |
| url_type          | Domínio da ligação curta, consulte [Domínios suportados](#dominios-suportados)           | Não        | `ur7.wf`      |

### Domínios suportados

Os valores de `url_type` fazem parte da configuração da instância e podem mudar — a lista atual para a sua conta é devolvida pelo [endpoint `domains`](https://www.bulkgate.com/pt/documentacao/encurtador-de-url/encurtador-dominios-disponiveis/). À data da redação:

| DOMÍNIO             | RESTRIÇÃO DO ENDEREÇO DE DESTINO                          |
|:--------------------|:----------------------------------------------------------|
| `ur7.wf`            | Sem restrição. Valor predefinido.                         |
| `ms6.fr`            | Sem restrição.                                            |
| `ur7.yt`            | Apenas domínios de destino na whitelist.                  |
| `ur7.tf`            | Apenas domínios de destino na whitelist.                  |
| `ms6.wf`            | Apenas domínios de destino na whitelist.                  |
| `ms6.tf`            | Apenas domínios de destino na whitelist.                  |
| `track-message.com` | Apenas domínios de destino na whitelist.                  |

Nos domínios com restrição, o endereço de destino tem de estar na whitelist da sua conta; caso contrário, o pedido falha com `domain_is_not_white_listed`. Alguns serviços públicos (Google, YouTube, Facebook, GitHub e outros) estão sempre na whitelist.

## Exemplo de pedido

```http-json
POST /api/1.0/shortener/shorten HTTP/1.1
Host: portal.bulkgate.com
Content-Type: application/json

{
  "application_id": 451,
  "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
  "target_url": "www.bulkgate.com",
  "url_type": "ur7.wf"
}
```

## Resposta

**Em caso de sucesso:**

```json
{
    "data": {
        "short_url": "http://ur7.wf/W",
        "target_url": "http://www.bulkgate.com/",
        "final_url": "http://www.bulkgate.com",
        "title": "SMS & other channels for business communication | BulkGate",
        "expiration": "2026-10-10T09:00:00+02:00"
    }
}
```

As ligações criadas através da API são válidas durante **30 dias** — `expiration` contém a data de expiração em ISO 8601.

Os três campos de URL não são a mesma coisa:

| CAMPO        | VALOR                                                                                                  |
|:-------------|:---------------------------------------------------------------------------------------------------------|
| `short_url`  | A própria ligação encurtada, composta por `url_type` e pela chave gerada                                |
| `target_url` | O endereço tal como foi guardado — o esquema é adicionado quando falta e o URL é normalizado, pelo que `www.bulkgate.com` passa a `http://www.bulkgate.com/` |
| `final_url`  | O endereço que enviou, apenas com o esquema adicionado. **Os redirecionamentos não são seguidos**, pelo que esta não é a página onde o visitante acaba por chegar |
| `title`      | Título lido da página de destino                                                                       |


**Em caso de erro:**

```json
{
    "type": "url_is_not_valid",
    "code": 400,
    "error": "Url is not valid",
    "detail": null
}
```

```json
{
    "type": "the_per_minute_quota_has_been_exceeded",
    "code": 400,
    "error": "The per minute quota has been exceeded",
    "detail": null
}
```

Em que:

- **type** e **error** (descrição do erro) encontram-se na [tabela de tipos de erros](https://www.bulkgate.com/pt/documentacao/administracao-da-api/tipos-de-erro-api/)
- **code** é o código de erro HTTP
- **detail** contém informações adicionais sobre o erro

### Tipos de erros da Shortener API

Além dos [tipos gerais](https://www.bulkgate.com/pt/documentacao/administracao-da-api/tipos-de-erro-api/), a Shortener API devolve os seus próprios:

| TIPO                                    | QUANDO OCORRE                                                          |
|:----------------------------------------|:-----------------------------------------------------------------------|
| `url_is_not_valid`                      | Não foi possível analisar `target_url`.                                |
| `url_type_is_incorrect`                 | `url_type` não consta da lista de domínios da conta.                   |
| `domain_is_not_white_listed`            | O domínio de destino não está na whitelist (nos domínios com restrição). |
| `url_is_not_allowed`                    | O endereço de destino aponta para um endereço local/interno.            |
| `url_can_not_be_redirected_out_of_target_domain` | O endereço de destino redireciona para fora do seu próprio domínio. |
| `url_can_not_be_created`                | Não foi possível criar a ligação.                                      |
| `the_per_minute_quota_has_been_exceeded`| A quota de 20 pedidos por minuto foi esgotada.                         |
