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
- 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.
- Ö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).
- 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.
- 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
| API-adress | Syfte |
|---|---|
| GET /api/partner/config?id=ID | Varumärke, godkända origins, funktioner och åtkomstläge. |
| GET /api/partner/catalog?id=ID | Artikelnummer 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.
| API-adress | X-CR80-Contract | Svar |
|---|---|---|
| POST /api/production/preview | print-station-v1 | PNG-bild |
| GET /api/production/export-profiles | print-export-v1 | JSON med profiles |
| POST /api/production/exports | print-export-v1 | JSON med nedladdningsadress |
| GET /api/production/exports/{id} | print-export-v1 | ZIP 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_CREDENTIALPNG-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.
| Fält | Beskrivning |
|---|---|
| schemaVersion | Obligatoriskt. API-kontraktets version, alltid 1. Designens eget versionsnummer ligger i design.version. |
| design | Obligatoriskt. Hela JSON-objektet från designfilen. |
| renderedAt | Obligatoriskt. ISO 8601-tid i UTC, till exempel 2026-09-21T12:00:00.000Z. Fixerar tidsberoende fält i renderingen. |
| side | Valfritt: front eller back. Standard är front. |
| row | Valfritt objekt med kolumnnamn och strängvärden för det kort som visas. Använd samma kolumnnamn som designens datafält. |
| rowIndex / rowCount | Valfritt: 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_CREDENTIALSvaret ä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"
}
]| Fält | Beskrivning |
|---|---|
| schemaVersion | Obligatoriskt. API-kontraktets version, alltid 1. Designens eget versionsnummer ligger i design.version. |
| design | Obligatoriskt. Hela JSON-objektet från designfilen. |
| requestKey | Obligatoriskt UUID för exporten. Samma nyckel och samma JSON används vid återförsök. |
| rows | Obligatoriskt: 1–100 objekt med strängvärden. Varje objekt ger ett kort; exportprofilen styr vilka sidor som ingår. |
| profileId | Valfritt UUID från profilens id. Utelämna för automatiskt val utifrån design.baseCardSku. |
| renderedAt | Obligatoriskt. 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_CREDENTIALHTTP/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.
| Status | Beskrivning |
|---|---|
| 400 | Ogiltig JSON, design eller anropsstorlek. |
| 401 | Saknad eller ogiltig autentisering, inklusive fel kontraktsheader. |
| 403 | Otillräcklig åtkomst, otillåten origin eller produktion som inte är aktiverad (PARTNER_PRODUCTION_NOT_ACTIVE). |
| 404 | Exporten finns inte i den autentiserade organisationen. |
| 409 | Begärans nyckel återanvänds med annat innehåll, eller exportprofilen är inaktuell eller saknas. |
| 410 | Exporten har gått ut eller rensats. |
| 415 | Content-Type måste vara application/json för POST. |
| 422 | Designen kunde inte renderas eller matchar inte exportprofilen. PDF-valideringsfel kan innehålla issues. |
| 428 | Organisationens aktuella personuppgiftsbiträdesavtal saknas (PROCESSOR_AGREEMENT_REQUIRED). Svaret anger agreementUrl. |
| 429 | Anropsgränsen är nådd eller PDF-renderaren är upptagen. |
| 503 | Avtalstjä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.