# URL pro přihlášení

> Každý seznam kontaktů má hostovanou URL pro přihlášení, která přidává lidi bez API klíče. Seznamte se s formátem požadavku, bezpečným voláním, limity a obnovením URL.

Každý seznam kontaktů má URL pro přihlášení: veřejný endpoint, který do seznamu přidá osobu bez API klíče. Použijte ji k propojení přihlašovacího formuláře na vašem webu nebo nástroje bez kódu, který umí odeslat požadavek JSON, se seznamem kontaktů.

```text
POST https://api.emailit.com/subscribe/{token}
```

`token` je tajný údaj seznamu. Kdokoli, kdo URL zná, může do seznamu přidávat adresy, takže s ní zacházejte jako s heslem.

## Najděte URL

1. **Otevřete seznam kontaktů.** Přejděte do **Email Marketing → Audiences** a vyberte seznam.

2. **Zkopírujte URL.** Vyberte **Subscribe URL** a zkopírujte URL z dialogového okna.

Přes API vrací stejnou hodnotu v poli `token` endpoint [Načtení seznamu kontaktů](/cs/docs/api-reference/audiences/get/).

## Formát požadavku

Pošlete požadavek `POST` s tělem JSON a hlavičkou `Content-Type: application/json`. Hlavička `Authorization` není potřeba.

- `email` (string, povinné): Adresa, kterou chcete přihlásit. Ukládá se malými písmeny.
- `first_name` (string): Křestní jméno osoby. U existujícího kontaktu přepíše uložené křestní jméno.
- `last_name` (string): Příjmení osoby. U existujícího kontaktu přepíše uložené příjmení.
- `custom_fields` (object): Hodnoty podle klíčů [vlastních polí](/cs/docs/contacts/custom-fields/). U existujícího kontaktu nahradí všechny hodnoty vlastních polí, takže je posílejte, jen když máte celou sadu.

Endpoint čte jen JSON. Těla kódovaná jako formulář, která posílá obyčejný HTML `<form>`, se odmítnou s kódem `400` a zprávou „Invalid JSON in request body“.

### Odpovědi

| Stav | Tělo | Kdy |
| --- | --- | --- |
| `200` | `{ "message": "Subscribed successfully" }` | Osoba byla přidána, znovu přihlášena nebo už přihlášená byla. |
| `400` | `{ "error": "Missing required field: email" }` nebo `{ "error": "Invalid email format" }` | E-mail chybí nebo má chybný formát, případně tělo není JSON. |
| `404` | `{ "error": "Audience not found" }` | Token je chybný, nebo byl obnoven. |
| `422` | `{ "error": "...", "usage": { ... } }` | Seznam dosáhl [limitu odběratelů](/cs/docs/audiences/#limits). |
| `429` | | Více než 30 požadavků za minutu ze stejné IP adresy. |

### Co přihlášení udělá

- **Nová adresa:** Emailit vytvoří kontakt a přihlásí ho k seznamu.
- **Existující kontakt, který v seznamu není:** Emailit upraví zaslaná jména a vlastní pole a kontakt přihlásí.
- **Existující odběratel, který se odhlásil:** Emailit ho znovu přihlásí.
- **Existující odběratel, který je přihlášený:** změní se jen datum přihlášení a odpověď je i tak `200`.

Přihlášení přes URL pro přihlášení nevyvolávají [události webhooků](/cs/docs/webhooks/event-types/) `subscriber.*` ani `contact.*` a nespouštějí automatizace **Added to audience**. Nemění ani marketingový stav kontaktu: pokud byl kontakt globálně odhlášený, kampaně ho budou dál vynechávat, dokud ho znovu nepřihlásíte v seznamu Contacts.

## Připojte přihlašovací formulář

URL pro přihlášení nemá žádnou ochranu proti botům a přijímá jen JSON. Nejbezpečnější je odesílat formulář na vlastní server, tam ho zkontrolovat a URL pro přihlášení volat ze serveru. Token se tak neobjeví ve zdrojovém kódu stránky a spam můžete zablokovat dřív, než se dostane do seznamu.

1. **Přidejte formulář na stránku.** Nechte ho odesílat na endpoint na vašem vlastním webu. Skryté pole `website` je honeypot: lidé ho nevidí, ale boti ho často vyplní.

```html title="signup.html"
<form id="signup" method="post" action="/newsletter">
  <label for="email">Email</label>
  <input id="email" name="email" type="email" required>

  <label for="first_name">First name</label>
  <input id="first_name" name="first_name" type="text">

  <!-- Honeypot: hidden from people, often filled in by bots -->
  <div style="position:absolute;left:-10000px" aria-hidden="true">
    <input name="website" type="text" tabindex="-1" autocomplete="off">
  </div>

  <button type="submit">Subscribe</button>
  <p class="status" role="status"></p>
</form>
```

2. **Zpracujte formulář na serveru.** Zahoďte odeslání s vyplněným honeypotem, ověřte CAPTCHA, pokud ji používáte, a pak pole předejte URL pro přihlášení jako JSON. Token mějte v proměnné prostředí, například `EMAILIT_SUBSCRIBE_TOKEN`. Viz [ukázky pro server](#server-examples) níže.

3. **Vyzkoušejte to.** Odešlete formulář se svou vlastní adresou a zkontrolujte, že se objevíte v tabulce odběratelů seznamu.

### Ukázky pro server

**Node.js**

```javascript title="server.js"
import express from 'express';

const app = express();

app.post('/newsletter', express.urlencoded({ extended: false }), async (req, res) => {
  // Bots fill in the honeypot. Pretend it worked and stop.
  if (req.body.website) return res.redirect(303, '/thanks');

  const response = await fetch(
    `https://api.emailit.com/subscribe/${process.env.EMAILIT_SUBSCRIBE_TOKEN}`,
    {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        email: req.body.email,
        first_name: req.body.first_name || undefined,
      }),
    },
  );

  if (!response.ok) {
    const { error } = await response.json().catch(() => ({}));
    return res.status(response.status).send(error || 'Could not subscribe.');
  }

  res.redirect(303, '/thanks');
});

app.listen(3000);
```

**PHP**

```php title="newsletter.php"
<?php
// Bots fill in the honeypot. Pretend it worked and stop.
if (!empty($_POST['website'])) {
    header('Location: /thanks', true, 303);
    exit;
}

$token = getenv('EMAILIT_SUBSCRIBE_TOKEN');
$ch = curl_init("https://api.emailit.com/subscribe/{$token}");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'email' => $_POST['email'] ?? '',
        'first_name' => $_POST['first_name'] ?? null,
    ]),
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);

if ($status !== 200) {
    http_response_code($status);
    echo json_decode($body, true)['error'] ?? 'Could not subscribe.';
    exit;
}

header('Location: /thanks', true, 303);
```

**cURL**

```bash
curl "https://api.emailit.com/subscribe/$EMAILIT_SUBSCRIBE_TOKEN" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{ "email": "ada@example.com", "first_name": "Ada" }'
```

Pokud stránka odesílá formulář JavaScriptem místo načtení celé stránky, volejte svůj vlastní endpoint přes `fetch` a volání Emailitu nechte na serveru:

```javascript title="signup.js"
document.querySelector('#signup').addEventListener('submit', async (event) => {
  event.preventDefault();
  const form = new FormData(event.target);
  const response = await fetch('/newsletter', { method: 'POST', body: new URLSearchParams(form) });
  event.target.querySelector('.status').textContent = response.ok
    ? 'Thanks, you are subscribed.'
    : 'Something went wrong. Please try again.';
});
```

### Limit rychlosti a vyšší objemy

URL pro přihlášení přijme 30 požadavků za minutu z každé IP adresy a nad tento limit vrací `429`. Když váš server přeposílá každé přihlášení, všechna přicházejí z IP adresy vašeho serveru, takže limit 30 za minutu platí pro celý váš web. Pokud jich čekáte víc, volejte ze serveru s API klíčem endpoint [Přidání odběratele](/cs/docs/api-reference/audiences/subscribers/add/). Ten navíc vrací `409` u lidí, kteří už přihlášení jsou, a spouští automatizace **Added to audience**, například pro odeslání uvítacího e-mailu.

## Potvrzujte přihlášení

URL pro přihlášení přidává lidi okamžitě. Emailit neposílá potvrzovací e-mail ani osobu nežádá o potvrzení adresy (double opt-in).

Pokud chcete potvrzená přihlášení, zabudujte potvrzení do vlastního procesu: když někdo odešle formulář, uložte žádost na svém serveru a [pošlete mu e-mail](/cs/docs/email-api/send-email/) s potvrzovacím odkazem, který vede zpět na váš web. URL pro přihlášení zavolejte, až když tento odkaz otevře.

## Obnovte URL

Pokud URL unikla, nebo vám chodí spamová přihlášení, obnovte token. Stará URL okamžitě přestane fungovat a vrací `404`.

1. **Otevřete dialogové okno.** Na stránce seznamu kontaktů vyberte **Subscribe URL**.

2. **Obnovte token.** Vyberte **Reset token** a potvrďte. Emailit vygeneruje novou URL.

3. **Aktualizujte své integrace.** Nahraďte token všude, kde ho používáte, například v proměnné `EMAILIT_SUBSCRIBE_TOKEN` na serveru.

Obnovit token můžete jen ve webovém rozhraní.

## Související

  - [Správa odběratelů](/cs/docs/audiences/subscribers/): Přidávejte lidi přes API a řešte opětovná přihlášení.
  - [Odhlášení](/cs/docs/audiences/unsubscribes/): Umožněte lidem ze seznamů odejít.

---
Zdroj: https://emailit.com/cs/docs/audiences/subscribe-url/
