PARTNERINTEGRATION MED CR80

Integrera CR80 i din webbplats

Anslut CR80-editorn till din webbplats med en iframe. Här hittar du konfiguration, JavaScript-exempel och API:er för att ta emot och använda CR80-designer i ditt system.

HTTP-guide för AI-agenter (på engelska) · JSON Schema v1 · Exempeldesign

  1. När din ansökan har godkänts öppnar du partnerportalen och loggar in med den verifierade e-postadressen från ansökan. Aktivera din inbjudan där.
  2. Öppna partnerinställningarna. Ange ditt varumärke, exakt vilka HTTPS-origins som är tillåtna och ditt sortiment av fysiska kort. Varje material och teknik har ett separat artikelnummer (SKU).
  3. Partner-ID:t i inställningarna ersätter YOUR_PARTNER_ID i exemplen. Det är en publik identifierare. Licensnycklar och API-hemligheter används endast på servern.
  4. I testläget märks förhandsvisningar med PROVPERIOD och editorn skickar cr80-test-design. Produktions-API:erna blir tillgängliga när partnerns produktionsåtkomst är aktiverad.

Bädda in editorn

Lägg till webbplatsens origin i partnerinställningarna, inklusive protokoll och eventuell port som avviker från standard. Sidan som bäddar in editorn måste matcha en godkänd origin. Använd HTTPS i produktion.

<iframe id="cr80-editor"
  src="https://cr80.se/editor?partner=YOUR_PARTNER_ID&embed=1"
  title="Card editor"
  style="width:100%;height:760px;border:0"
></iframe>

Partnern väljer varumärke, sortiment och tillgängliga funktioner. Inbäddningen ger ingen åtkomst till konton. CR80-konton och partnerns kundkonton är fortsatt separata.

Ta emot en design säkert

Editorn skickar designen till värdsidan via postMessage. Exemplet filtrerar på CR80:s origin, iframe-fönstret, partner-ID och meddelandetyp. Meddelandet innehåller name och design. Testläget använder cr80-test-design med test: true; aktiv produktionsåtkomst använder cr80-design med test: false.

const frame = document.getElementById("cr80-editor");
const partnerId = "YOUR_PARTNER_ID";
window.addEventListener("message", (event) => {
  if (event.origin !== "https://cr80.se") return;
  if (event.source !== frame.contentWindow) return;
  const message = event.data;
  if (!message || message.partner !== partnerId) return;
  if (message.type === "cr80-test-design" && message.test === true) {
    // Test-mode completion uses a separate message type.
    document.getElementById("result").textContent = "Test design received";
    return;
  }
  if (message.type !== "cr80-design" || message.test !== false) return;
  // message.design contains the versioned CR80 design document.
  // Pass it to your backend to continue your integration.
  document.getElementById("result").textContent = message.name;
});

JavaScript-exemplet gäller bara kommunikationen mellan iframe och värdsida i webbläsaren. Server-API:erna nedan använder vanliga HTTP-anrop och JSON och är oberoende av programmeringsspråk.

Skapa ett resultatelement på sidan: <p id="result" role="status"></p>. Exemplet visar designens namn i elementet. Meddelandet överför en design och skapar ingen order. Validering och eventuell orderhantering sker i din serverintegration.

API:er och designkontraktet

Publika partner-API:er för läsning
API-adressSyfte
GET /api/partner/config?id=IDVarumärke, godkända origins, funktioner och åtkomstläge.
GET /api/partner/catalog?id=IDArtikelnummer för fysiska kort och publik tillgänglighet.

Designformatet är versionshanterad JSON. Vid lagring och återöppning används hela dokumentet, inklusive versionsnummer och eventuella utökade fält. Mått anges i millimeter och belopp i heltalsöre. Det valda artikelnumret kopplar designen till partnerns material, teknik och efterbehandling.

CR80:s rendering använder samma designformat för förhandsvisningar och produktionsfiler. Produktionsrendering ingår i serverintegrationen.

Signerade starter, hanterade kundidentiteter, produktionsrendering och SPI använder serverautentisering med avgränsade behörigheter. De är separata från iframe-integrationen och aktiveras för respektive partner. Partner-ID:t används för identifiering, inte autentisering.

Rendera en designfil via API

En exporterad .cr80.json-fil är designobjektet som skickas i fältet design. API:erna tar emot JSON, inte multipart-uppladdningar. Ingen öppen editor eller lokal skrivare behövs för PNG-förhandsvisning eller PDF-export.

Serverautentisering

API:erna använder HTTPS och JSON och kan anropas från valfritt serverspråk. Exemplen visar metod, sökväg, headers och JSON direkt, utan SDK eller särskild körmiljö. CR80 aktiverar maskinåtkomsten för en aktiv partnerorganisation med ett produktionskontrakt i version 1. Detta är separat från den publika iframe-konfigurationen.

X-CR80-Contract väljs per API enligt tabellen. Maskinnyckeln hör hemma på servern. Godkända iframe-origins ger inte webbläsaren åtkomst till dessa server-API:er.

Renderings- och exportendpoints
API-adressX-CR80-ContractSvar
POST /api/production/previewprint-station-v1PNG-bild
GET /api/production/export-profilesprint-export-v1JSON med profiles
POST /api/production/exportsprint-export-v1JSON med nedladdningsadress
GET /api/production/exports/{id}print-export-v1ZIP med PDF och produktionsdata

Autentiseringsheaders

Basadressen är https://cr80.se. Ersätt YOUR_PARTNER_ID och YOUR_MACHINE_CREDENTIAL med dina serveruppgifter. Skicka hela designfilens JSON-objekt i design. Exemplen använder ett litet namnkort; byt även white-pvc till din kortartikels SKU. Din HTTP-klient serialiserar JSON och hanterar överföringsheaders som Content-Length. Tillåt upp till 180 sekunder för rendering.

X-CR80-Contract: print-station-v1
X-CR80-Partner: YOUR_PARTNER_ID
X-License-Key: YOUR_MACHINE_CREDENTIAL

PNG-förhandsvisning

POST /api/production/preview returnerar image/png med HTTP 200. Förhandsvisningen är 100 dpi och använder CR80:s gemensamma renderare. Svaret cachelagras inte och anropet sparar ingen design. Testläge ger vattenstämpeln PROVPERIOD.

Anropsfält för förhandsvisning
FältBeskrivning
schemaVersionObligatoriskt. API-kontraktets version, alltid 1. Designens eget versionsnummer ligger i design.version.
designObligatoriskt. Hela JSON-objektet från designfilen.
renderedAtObligatoriskt. ISO 8601-tid i UTC, till exempel 2026-09-21T12:00:00.000Z. Fixerar tidsberoende fält i renderingen.
sideValfritt: front eller back. Standard är front.
rowValfritt objekt med kolumnnamn och strängvärden för det kort som visas. Använd samma kolumnnamn som designens datafält.
rowIndex / rowCountValfritt: nollbaserat radindex och totalt radantal. Standard är 0 respektive 1. Skicka aktuell rad separat i row.
POST /api/production/preview HTTP/1.1
Host: cr80.se
X-CR80-Contract: print-station-v1
X-CR80-Partner: YOUR_PARTNER_ID
X-License-Key: YOUR_MACHINE_CREDENTIAL
Content-Type: application/json

{
  "schemaVersion": 1,
  "design": {
    "version": 1,
    "name": "Example card",
    "orientation": "portrait",
    "baseCardSku": "white-pvc",
    "front": {
      "background": "#ffffff",
      "layers": [
        {
          "id": "name",
          "type": "text",
          "x": 6,
          "y": 15,
          "widthMm": 42,
          "fontSizeMm": 4,
          "text": "{name}"
        }
      ]
    }
  },
  "side": "front",
  "row": {
    "name": "Sample Person"
  },
  "rowIndex": 0,
  "rowCount": 2,
  "renderedAt": "2026-09-21T12:00:00.000Z"
}

Svar

HTTP/1.1 200 OK
Content-Type: image/png
Cache-Control: private, no-store

[binary PNG body]

Spara svarets binära innehåll som en PNG-fil. Byt side till back för baksidan. Vid flera kort görs ett anrop per sida och rad; anpassa row, rowIndex och rowCount till din datatabell.

PDF-export

1. Hämta exportprofil

Partnerns exportprofil anger PDF/X-4 eller PDF/X-1a:2001, CMYK/ICC-profil, utfall, skärmärken och sidordning. Den konfigureras under Partnerportalen → Tryckfiler. GET /api/production/export-profiles returnerar bara den autentiserade partnerns aktiva profiler.

GET /api/production/export-profiles HTTP/1.1
Host: cr80.se
X-CR80-Contract: print-export-v1
X-CR80-Partner: YOUR_PARTNER_ID
X-License-Key: YOUR_MACHINE_CREDENTIAL

Svaret är ett objekt med profiles. Varje post innehåller bland annat id, revision, profile, iccSha256 och card. Objektet profile innehåller bland annat sku, standard och pageOrder. Utan profileId väljer exporten den aktiva profilen för design.baseCardSku. Med profileId låses valet till en viss profilrevision; en inaktuell revision ger 409.

2. Förbered exportens JSON

Fältet rows innehåller exakt de kort som ska ingå, ett objekt per kort. Värdena är strängar och nycklarna motsvarar designens datafält. För två identiska kort utan datafält används [{}, {}]. API:et väljer inte automatiskt rader ur designfilens inbyggda datatabell.

[
  {
    "name": "Sample Person"
  },
  {
    "name": "Another Person"
  }
]
Anropsfält för PDF-export
FältBeskrivning
schemaVersionObligatoriskt. API-kontraktets version, alltid 1. Designens eget versionsnummer ligger i design.version.
designObligatoriskt. Hela JSON-objektet från designfilen.
requestKeyObligatoriskt UUID för exporten. Samma nyckel och samma JSON används vid återförsök.
rowsObligatoriskt: 1–100 objekt med strängvärden. Varje objekt ger ett kort; exportprofilen styr vilka sidor som ingår.
profileIdValfritt UUID från profilens id. Utelämna för automatiskt val utifrån design.baseCardSku.
renderedAtObligatoriskt. ISO 8601-tid i UTC, till exempel 2026-09-21T12:00:00.000Z. Fixerar tidsberoende fält i renderingen.

Skapa ett nytt UUID i requestKey för varje ny export och ange renderingstidpunkten i renderedAt. Exempelvärdena nedan ersätts vid en ny export. Spara begäran i ditt system så att hela JSON-innehållet, inklusive nyckel och tidpunkt, kan återanvändas vid återförsök.

3. Skapa och hämta tryckfilen

POST /api/production/exports returnerar HTTP 200 med id, downloadUrl, ticket och expiresAt när exporten är klar. Exporten startar ingen utskrift och skapar ingen order.

POST /api/production/exports HTTP/1.1
Host: cr80.se
X-CR80-Contract: print-export-v1
X-CR80-Partner: YOUR_PARTNER_ID
X-License-Key: YOUR_MACHINE_CREDENTIAL
Content-Type: application/json

{
  "schemaVersion": 1,
  "requestKey": "5dc49711-acb9-4a92-8ed6-b6f9d0617625",
  "design": {
    "version": 1,
    "name": "Example card",
    "orientation": "portrait",
    "baseCardSku": "white-pvc",
    "front": {
      "background": "#ffffff",
      "layers": [
        {
          "id": "name",
          "type": "text",
          "x": 6,
          "y": 15,
          "widthMm": 42,
          "fontSizeMm": 4,
          "text": "{name}"
        }
      ]
    }
  },
  "rows": [
    {
      "name": "Sample Person"
    },
    {
      "name": "Another Person"
    }
  ],
  "renderedAt": "2026-09-21T12:00:00.000Z"
}

Exempelsvar (urval; ticket utelämnad)

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: private, no-store

{
  "id": "export-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "downloadUrl": "/api/production/exports/export-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "expiresAt": "2026-09-22T12:00:00.000Z"
}

Hämta ZIP-filen

Använd sökvägen i svarets downloadUrl för nästa GET-anrop till https://cr80.se, med samma print-export-v1-autentisering. Spara svarets binära innehåll som en ZIP-fil och läs print.pdf ur den.

GET /api/production/exports/export-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HTTP/1.1
Host: cr80.se
X-CR80-Contract: print-export-v1
X-CR80-Partner: YOUR_PARTNER_ID
X-License-Key: YOUR_MACHINE_CREDENTIAL
HTTP/1.1 200 OK
Content-Type: application/zip
Cache-Control: private, no-store

[binary ZIP body]

ZIP-filen innehåller print.pdf, production.json och LAS-MIG.txt. Ticket och production.json beskriver bland annat låst profilrevision, sidornas radkoppling, geometri och filhashar. Nedladdningsadressen är privat, kräver autentisering och gäller i 24 timmar enligt expiresAt.

Återförsök och gränser

Vid timeout eller tillfälligt fel skickas samma POST-begäran igen med oförändrat JSON-innehåll. Ett identiskt återförsök returnerar den ursprungliga exporten, även om profilen senare ändrats. Ändrad JSON under samma requestKey ger 409. En utgången export ger 410 och kräver en ny begäran med ny nyckel.

Maximal anropsstorlek är 32 MB. PDF-export har högst 100 kort och 100 MB PDF. Förhandsvisning tillåter 60 anrop/minut; PDF-export 10 skrivningar och 120 läsningar/minut per organisation och serverprocess. En PDF-förberedelse åt gången körs per serverprocess. Vid 429 väntar klienten innan samma begäran skickas igen.

PDF-kontraktet stöder inte UV-/hologrampaneler, magnet- eller chipkodning, dekorfärger, PDF/VT eller arkutskjutning. Sådant underlag avvisas eller ligger utanför detta API.

Svar och felkoder

Felsvar är JSON med error. Vissa fel har även code, issues eller agreementUrl. Klienten bör använda HTTP-status och eventuellt code, inte tolka den översättningsbara feltexten.

HTTP-status för renderings- och export-API:erna
StatusBeskrivning
400Ogiltig JSON, design eller anropsstorlek.
401Saknad eller ogiltig autentisering, inklusive fel kontraktsheader.
403Otillräcklig åtkomst, otillåten origin eller produktion som inte är aktiverad (PARTNER_PRODUCTION_NOT_ACTIVE).
404Exporten finns inte i den autentiserade organisationen.
409Begärans nyckel återanvänds med annat innehåll, eller exportprofilen är inaktuell eller saknas.
410Exporten har gått ut eller rensats.
415Content-Type måste vara application/json för POST.
422Designen kunde inte renderas eller matchar inte exportprofilen. PDF-valideringsfel kan innehålla issues.
428Organisationens aktuella personuppgiftsbiträdesavtal saknas (PROCESSOR_AGREEMENT_REQUIRED). Svaret anger agreementUrl.
429Anropsgränsen är nådd eller PDF-renderaren är upptagen.
503Avtalstjänsten är tillfälligt otillgänglig (PROCESSOR_AGREEMENT_UNAVAILABLE).

Exempel på ett 422-svar

{
  "error": "Designen uppfyller inte tryckeriets krav.",
  "issues": [
    "Kort 1 saknar data i kolumnerna: name."
  ]
}

Organisationsexport och byte av tjänst

En verifierad ägare eller administratör kan hämta en kostnadsfri export under Konto → Organisationsexport. Exporten fungerar även efter avtalsslut och arkivering. Du behöver inget nytt abonnemang eller nytt avtal för att hämta befintliga uppgifter.

Designer och överlämningar
Versionshanterad CR80-JSON med inbäddade bilder/typsnitt, varianter och datarader. Bara designer som uttryckligen tillhör organisationen; överlämningens original tillhör avsändaren och kundens mottagna kopia kundkontot.
Partnerinställningar
Varumärke, godkända origins, kortsortiment, kanal-/producentversioner och PDF-exportprofiler. ICC-filen ingår som base64 med SHA-256.
Produktionshistorik
Inskickade orderdesigner och datarader, leveranser, stationsinställningar, låsta jobb, kortkvittenshistorik och återställningsinstruktioner. Produktionspartner får inte en annan säljares detaljpriser eller fakturor.
Fakturering och avtal
Organisationens faktureringskonto, abonnemang, fakturarader, faktura-PDF (base64), partnerfakturor/avräkningar, biträdesavtal med godkännanden och det accepterade partnererbjudandet.

Format och avgränsning

Numrerade ZIP-delar innehåller UTF-8 JSON-sidor och ett manifest med SHA-256. Mått anges i millimeter och belopp i heltalsöre. Spara alla delar. Varje sida läses sammanhängande, men hela exporten är ingen ögonblicksbild av databasen: pausa redigering inför en slutlig överföring. Poster skapade efter exportens starttid utelämnas; ändringar och radering kan påverka sidor som ännu inte lästs. Utrustningens rapporter gäller vid respektive sidas hämtning.

Ingår inte: lösenord, API-/stations-/OAuth-nycklar, andra organisationers uppgifter, personliga designer, kundägda mottagna kopior, CR80:s programvara och standardmallar, tillfälliga browsersessioner, utgångna delningar och tillfälliga produktionsfiler. Externa URL:er är referenser; filer som bara finns i webbläsaren, partnersystemet eller på en extern adress hämtas från den som förvarar dem. Befintliga tryck-PDF:er har fortsatt sin egen giltighet på 24 timmar. Källdataexport skapar inga nya produktionsfiler eller utskriftsjobb.

HTTP-gränssnitt

Dessa kontoendpoints kräver ägarens eller administratörens CR80-browsersession. Partnerns maskinnycklar kan inte exportera en hel organisation. GET /api/account/organization-export listar behöriga organisationer (även arkiverade), kategorier och starttid. Skicka följande JSON med POST till /api/account/organizations/{organizationId}/export med Content-Type: application/json, exakt CR80-Origin och X-CR80-Data-Action: export-organization.

{
  "action": "page",
  "category": "designs",
  "after": "",
  "cutoff": "2026-09-21T12:00:00.000Z",
  "runId": "8c987cf9-6a43-433b-9e88-c9ed0bc984f0"
}

Använd ett nytt UUID och starttiden från listningen. Använd nextCursor som after tills värdet är null, för varje kategori. Svaret har records, receiptId och X-Export-SHA256 för svarets exakta bytes. Sidor omfattar högst 50 poster/8 MiB, med möjlighet till en större post upp till 64 MiB; större poster hanteras med assisterad export. Gränsen är 120 anrop/minut per konto och serverprocess. Försök med samma markör vid 429/503; jämför kontrollsummor eftersom redigering däremellan kan ändra resultatet.

Kategoriidentifierare och exakta fält
organization
id, name, archived_at, created_at, updated_at
members
id, user_id, role, created_at
designs
id, user_id, name, design, project_id, revision, project_metadata, created_at, updated_at
shares
id, design_id, name, design, expires_at, revoked_at, created_at
quotes
id, retail, terms_version, target_working_days, expires_at, created_at
usage
id, event, origin, created_at
handovers
id, source_design_id, source_revision, recipient_email, customer_label, name, snapshot, expires_at, revoked_at, claimed_at, created_at
partners
id, name, config_version, logo_url, theme, allowed_origins, portal_url, pricing_url, catalog_url, pricing_visibility, capabilities, production_contract, fulfillment, fulfillment_label, destination_type, order_email, pricing, terms_url, design_guide_url, active, created_at
catalogue
id, partner_id, slug, name, technology, subtype, color, color_name, surcharge_ore, stock_quantity, oversell, active, sort_order, created_at
channels
id, legacy_partner_id, enabled, current_revision, created_at, updated_at
channel_revisions
id, branded_channel_id, revision, snapshot, created_at
providers
id, visibility, current_revision, created_at, updated_at
provider_revisions
id, fulfilment_provider_id, revision, snapshot, created_at
export_profiles
id, partner_id, sku, revision, profile, icc_sha256, icc_base64, created_at
orders
id, partner_id, commercial_channel, design_name, design, data_csv, quantity, status, price_ore, partner_order_ref, partner_status, tracking_url, customer_email, customer_name, shipping_address, terms_accepted_at, terms_version, created_at
fulfilment_orders
id, design_name, design, data_csv, quantity, partner_order_ref, partner_status, tracking_url, shipping_address, created_at
stations
id, name, partner_id, service_version, last_seen_at, revoked_at, created_at, updated_at
printers
id, station_id, instance_id, display_name, configuration, report, health, last_seen_at
encoders
id, station_id, instance_id, display_name, kind, connection, health, last_seen_at
jobs
id, station_id, printer_instance_id, payload, state, created_at, updated_at
acknowledgements
id, job_id, card_id, payload, created_at
recoveries
id, job_id, card_id, payload, state, created_at, applied_at
billing_accounts
id, legal_name, organization_number, vat_number, invoice_email, invoice_reference, billing_address, currency, billing_enabled, terms_accepted_at, terms_version, created_at, updated_at
subscriptions
id, catalog_item_id, status, cadence, current_period_start, current_period_end, trial_ends_at, cancel_at_period_end, ended_at, unit_ore_snapshot, vat_basis_points_snapshot, entitlement_snapshot, created_at, updated_at
subscription_history
id, subscription_id, event_type, occurred_at, previous_status, next_status, previous_period_start, previous_period_end, next_period_start, next_period_end, cancel_at_period_end, ended_at, created_at
invoices
id, original_invoice_id, document_number, kind, state, payment_state, currency, total_ore, vat_ore, issue_date, due_date, pdf_base64, pdf_sha256, created_at
invoice_lines
id, invoice_id, position, description, quantity, unit_list_ore, list_ore, discount_ore, vat_base_ore, vat_basis_points, vat_ore, total_ore, created_at
partner_invoices
id, partner_id, month, status, editor_loads, designs_sent, order_count, order_value_ore, license_ore, commission_ore, created_at, updated_at
settlements
id, order_id, amount_ore, currency, status, provider_reference, created_at, updated_at
agreements
id, snapshot_id, legal_entity_name, organization_number, country_code, accepted_by_name, accepted_by_email, accepted_by_role, authority_confirmed, accepted_at
agreement_documents
id, document_id, version, sha256, title, markdown, source_url, captured_at
partner_acceptance
partner_id, accepted_at, pilot_ends_at, acceptance, approved_at

Efter att ha sparat och kontrollerat en del: POST {action: "confirm", receipts: [{id: receiptId, sha256: responseHash}]} (högst 100 kvitton). CR80 behåller metadata om tillhandahållande och mottagarens bekräftelse, ingen extra kopia av kundinnehållet. Bekräftelsen kan upprepas säkert.

Byte och avslut

För assisterad överföring, en stor post, en slutlig sammanhängande ögonblicksbild eller radering: kontakta contact@premex.se med organisations-ID och önskat resultat. CR80 verifierar behörighet och mottagare, dokumenterar omfattning, tidplan och mottagande och hjälper till med säker överföring. Mejla inte kortinnehåll eller nycklar. Abonnemangsavslut, hämtning och radering är separata steg; arkiverade källdata raderas inte automatiskt. Partneravtalet och biträdesavtalet reglerar tidsfrister, återlämning, radering och eventuell lagstadgad lagring.