Hoppa till innehållet

Qrona Newsletter API · version 1

API för utvecklare

Koppla er webbutik, ert CRM eller egna system till Qrona Newsletter. Med API:t läser och uppdaterar ni kontakter, anmäler personer till listor med beviset för deras samtycke, skickar in butikens köp och håller andra system i takt med avregistreringar.

Kom igång

  1. Skapa en nyckel. En administratör i arbetsytan går till Inställningar → API-nycklar, ger nyckeln ett namn och väljer vad den får göra. Nyckeln visas en gång – spara den där den ska användas, till exempel i wp-config.php.
  2. Gör första anropet. Det berättar vilken arbetsyta nyckeln gäller och vad den får göra.
curl https://newsletter.qrona.se/api/v1 \
  -H "Authorization: Bearer $QRONA_NEWSLETTER_KEY"
  1. Skapa eller uppdatera en kontakt med POST /contacts/upsert, och anmäl till en lista med POST /lists/{id}/members.
curl -X POST https://newsletter.qrona.se/api/v1/contacts/upsert \
  -H "Authorization: Bearer $QRONA_NEWSLETTER_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "anna@example.se",
    "first_name": "Anna",
    "add_tags": ["kund"],
    "consent_source": "Kryssade i rutan i kassan på butik.se"
  }'

Nycklar och behörigheter

Skicka nyckeln i varje anrop: Authorization: Bearer qn_live_…. Nycklar hör hemma på en server, aldrig i en webbläsare eller app – API:t svarar inte på anrop från andra webbplatser (ingen CORS). Har en nyckel kommit ut: återkalla den under API-nycklar, så slutar den fungera direkt.

En nyckel gäller en arbetsyta och agerar som personen som skapade den. Den gör aldrig mer än personen själv får göra just nu: lämnar personen arbetsytan slutar nyckeln gälla, och har personen kontaktvillkor ser nyckeln bara de kontakterna. Allt som görs med en nyckel syns i arbetsytans revisionslogg, märkt med nyckelns namn.

BehörighetGerPersonens roll
contacts:readKontakter, deras listor och spärrlistan.alla
contacts:writeLägga till och ändra kontakter, taggar och listmedlemskap, avregistrera.redaktör+
contacts:eraseRadera en kontakts personuppgifter för gott. Adressen spärras.redaktör+
lists:readListor och deras medlemmar.alla
lists:writeSkapa, ändra och ta bort listor.redaktör+
fields:readVilka egna fält kontakterna har.alla
segments:readDistributionslistor (segment) med antal. Kräver att personen är administratör.administratör
ecommerce:readButiker, kunder, produkter, ordrar, kundkorgar och intäkt per kampanj.alla
ecommerce:writeSkicka in och ta bort butiker, kunder, produkter, ordrar och kundkorgar.redaktör+
webhooks:readArbetsytans webhooks och deras leveranser. Kräver att personen är administratör.administratör
webhooks:writeSkapa, ändra, testa och ta bort webhooks. Kräver att personen är administratör.administratör

messages:send · templates:render har bara Qronas systemnyckel för tillägget Byråstöd: Klientkommunikation, som hör till organisationen och inte till en person. Läs mer i Meddelanden från Qrona.

Format

  • Bas-adress: https://newsletter.qrona.se/api/v1. Allt är JSON i UTF-8; skicka kroppar med Content-Type: application/json.
  • Fältnamn är snake_case, id:n är strängar och tider är ISO 8601 i UTC (2026-10-19T08:30:00.000Z).
  • Ändringar (PATCH, upsert och e-handelns PUT) rör bara de fält du skickar – listor som orderrader och varianter ersätts när de skickas. null tömmer ett fält. Okända fält i en kropp ger 422, så att stavfel märks.
  • E-postadresser skickas i kroppen, inte i adressraden, så att de inte hamnar i loggar – därför finns POST /contacts/lookup.

Sidor (paginering)

Listor kommer en sida i taget: limit säger hur många, och svaret har data, has_more och next_cursor. Hämta nästa sida med cursor=next_cursor tills has_more är false. Sidorna är stabila även medan kontakter läggs till. För löpande synk: spara tiden innan du börjar och hämta sedan bara det som ändrats med updated_since.

let cursor = null;
do {
  const url = new URL('https://newsletter.qrona.se/api/v1/contacts');
  url.searchParams.set('limit', '500');
  if (cursor) url.searchParams.set('cursor', cursor);
  const page = await fetch(url, { headers: { Authorization: `Bearer ${key}` } }).then((r) => r.json());
  for (const contact of page.data) await save(contact);
  cursor = page.next_cursor;
} while (cursor);

Fel

Fel svarar med en HTTP-status och application/problem+json: code är till för program, title och detail för människor, och errors säger vad som är fel per fält. Alla koder finns under Felkoder.

Begränsningar

  • Högst 600 anrop per minut och nyckel. Varje svar har X-RateLimit-Limit, X-RateLimit-Remaining och X-RateLimit-Reset (sekunder); över gränsen blir svaret 429 med Retry-After.
  • Kroppar högst 64 kB (produkter, ordrar och korgar 256 kB, batch 5 MB). Upp till 500 per sida och 100 adresser per uppslag.
  • Upprepa ett anrop som fick 429 eller 5xx efter en stund – helst med växande väntetid. Upsert, PUT och anmälningar kan göras om utan att något dubbleras; för andra POST-anrop, skicka Idempotency-Key.

Samtycke och GDPR

Ni är personuppgiftsansvariga för era kontakter, och Qrona Newsletter sparar beviset för varje samtycke. Därför:

  • Skapa bara kontakter som har samtyckt till utskick, eller där ni har en annan rättslig grund. consent_source beskriver hur – med egna ord, till exempel ”Kryssade i rutan i kassan på butik.se”.
  • Vid anmälan till en lista skickar ni texten personen godkände, var det hände och personens IP-adress. På listor med dubbel opt-in får personen ett bekräftelsemejl.
  • Den som har avregistrerat sig kommer aldrig tillbaka utan att själv bekräfta via e-post, och spärrade adresser – studs, skräppostanmälningar, raderade – går inte att anmäla alls.
  • Avregistreringar: låt en webhook berätta när de händer, eller hämta spärrlistan regelbundet. Avregistrera med POST /contacts/{id}/unsubscribe när kunden säger nej i er butik.
  • Radering: när en kund begär att bli raderad, anropa POST /contacts/{id}/erase (kräver behörigheten contacts:erase). Känsliga fält, som personnummer, går varken att läsa eller skriva via API:t.
  • E-handel: butikens kunder blir aldrig kontakter, vare sig de har samtyckt eller inte. De som har samtyckt anmäler ni till en lista som vanligt. Läs mer i guiden om e-handel.

Exempel: webbutik

Så här kan en WooCommerce-butik lägga till kunder som kryssar i en ruta för nyhetsbrev i kassan. Nyckeln och listans id ligger i wp-config.php. Kör anropen i bakgrunden (till exempel med Action Scheduler) så att kassan aldrig väntar på oss. Ordrarna själva – för köpvillkor och intäkt per kampanj – skickas som i guiden om e-handel.

<?php
// När en order läggs i WooCommerce och kunden har kryssat i rutan för nyhetsbrev.
add_action('woocommerce_checkout_order_processed', function ($order_id) {
    $order = wc_get_order($order_id);
    if ($order->get_meta('_newsletter_optin') !== 'yes') {
        return; // Inget samtycke: kunden läggs inte till.
    }
    $request = fn ($method, $path, $body) => wp_remote_request('https://newsletter.qrona.se/api/v1' . $path, [
        'method'  => $method,
        'timeout' => 15,
        'headers' => [
            'Authorization' => 'Bearer ' . QRONA_NEWSLETTER_KEY,
            'Content-Type'  => 'application/json',
        ],
        'body'    => wp_json_encode($body),
    ]);

    // 1. Anmälan till listan, med beviset för samtycket.
    $request('POST', '/lists/' . QRONA_NEWSLETTER_LIST . '/members', [
        'email'      => $order->get_billing_email(),
        'first_name' => $order->get_billing_first_name(),
        'last_name'  => $order->get_billing_last_name(),
        'consent'    => [
            'text'       => 'Ja, jag vill få nyhetsbrev från Exempel AB.',
            'source'     => 'Kassan på ' . wp_parse_url(home_url(), PHP_URL_HOST),
            'ip'         => $order->get_customer_ip_address(),
            'user_agent' => $order->get_customer_user_agent(),
        ],
    ]);

    // 2. Egna fält och taggar på kontakten.
    $request('POST', '/contacts/upsert', [
        'email'    => $order->get_billing_email(),
        'fields'   => ['kundnummer' => (string) $order->get_customer_id()],
        'add_tags' => ['kund'],
    ]);
});

Versioner

Det här är version 1. Vi lägger till nya fält, anrop och felkoder utan förvarning – låt programmet strunta i fält det inte känner igen. Ändringar som kan få befintliga integrationer att sluta fungera kommer bara i en ny version, med god framförhållning.

2026-10-19
Version 1: nycklar, kontakter, listor och anmälningar, kontaktfält, distributionslistor och spärrlistan.
2026-10-19
E-handel (butiker, kunder, produkter, ordrar, kundkorgar, intäkt per kampanj), POST /batch, Idempotency-Key och webhooks.

Frågor? Skriv till support@qrona.se.