For utviklere

Integrer med Atlas API på minutter

Opprett og les produkter, varianter, merker og produktgrupper i Atlas — som menneske, eller som KI-agent.

Gi API-et til en KI-agent

Bruker du Claude, er den korteste veien MCP: Atlas er en MCP-server, og Claude.ai kobler seg til med en innlogging — ingen nøkkel å lime inn. Se oppsettet på /mcp.

Skal du bruke en annen modell — eller Claude Code, som tar en API-nøkkel som header — ligger referansen skrevet som en Claude Code Skill på en offentlig URL, og ingen nøkkel kreves for å lese den.

Offentlig, ingen autentisering
curl https://atlas.flowretail.com/llms.txt
Claude Code
Lagre svaret som .claude/skills/atlas-api/SKILL.md
Annen modell
Lim innholdet inn i konteksten, eller pek modellen rett til URL-en.
Har du nøkkel?
Samme tekst ligger alltid på GET /api/v1/skill.md.

Dokumentasjon

Endepunktene

Alt under https://atlas.flowretail.com/api/v1, med Bearer-nøkkel. HTTP-statusen er den ekte suksess/feil-linjen — 200/201 ved suksess, 400/401/403/404/409/422/429/500 ved feil — og body speiler den samme beskjeden i { ok, data } eller { ok: false, errors }, så en kaller aldri må se på begge for å vite hvilken. Klikk et endepunkt for et eksempel.

Feilsvar — HTTP 422 Unprocessable Content
{
  "ok": false,
  "errors": [
    {
      "path": "products[0].brand",
      "code": "unknown_brand",
      "message": "Merket «Harío» finnes ikke i registeret.",
      "hint": "Mente du «Hario»? Opprett merket først med POST /api/v1/brands, og send så produktet på nytt."
    }
  ]
}

Produkter

  • GET/api/v1/productsListe produkter, sidevis
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "products": [
          {
            "id": "prod_8f2a1c",
            "name": "Nokia 6110",
            "sku": "NOK-6110",
            "sale_price_incl_vat": "699.00"
          }
        ],
        "next_cursor": null
      }
    }
  • GET/api/v1/products/{id}Ett produkt med varianter
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "id": "prod_8f2a1c",
        "name": "Nokia 6110",
        "sku": "NOK-6110",
        "variants": [
          {
            "id": "var_44b2",
            "sku": "NOK-6110-GRA",
            "axis": { "Farge": "Grå" }
          }
        ]
      }
    }
  • POST/api/v1/productsOpprette produkter og varianter
    Request
    {
      "products": [{
        "name": "Nokia 6110",
        "sku": "NOK-6110",
        "brand": "Nokia",
        "product_group": ["Elektronikk", "Mobiltelefoner"],
        "sale_price_incl_vat": "699.00",
        "vat": 25
      }]
    }
    Response — HTTP 201 Created
    {
      "ok": true,
      "data": {
        "products": [
          { "id": "prod_8f2a1c", "sku": "NOK-6110", "created": true }
        ]
      }
    }
  • PATCH/api/v1/products/{id}Oppdatere ett produkt eller én variant
    Request
    {
      "version": 0,
      "sale_price_incl_vat": "649.00"
    }
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "id": "prod_8f2a1c",
        "sku": "NOK-6110",
        "sale_price_incl_vat": "649.00",
        "version": 1
      }
    }
  • POST/api/v1/products/{id}/imagesHente bilder fra URL-er og feste dem til produktet
    Request
    {
      "image_urls": ["https://example.com/nokia-6110.jpg"]
    }
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "product_id": "prod_8f2a1c",
        "images": [
          {
            "url": "https://example.com/nokia-6110.jpg",
            "status": "attached",
            "asset_id": "asset_1",
            "position": 0,
            "is_cover": true
          }
        ]
      }
    }
  • POST/api/v1/products/{id}/axis-imagesFeste ett fotosett til én farge — havner på alle variantene med den verdien
    Request
    {
      "axis_value": "Rød",
      "image_urls": ["https://example.com/jeans-rod-1.jpg"]
    }
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "attribute_value": "Rød",
        "attribute": "Farge",
        "variant_count": 18,
        "images": [{ "asset_id": "asset_4", "url": "https://ik.…/jeans-rod-1.jpg", "position": 0 }],
        "variants_touched": 18
      }
    }

Bilder

  • POST/api/v1/assetsLaste opp en bildefil (multipart) og få en asset_id — for bilder som ikke ligger på en URL
    Request
    curl -H "Authorization: Bearer atlas_live_…" \
         -F "file=@rider-rod-1.jpg" \
         https://<din-atlas>/api/v1/assets
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "asset_id": "asset_4",
        "url": "https://ik.…/rider-rod-1.jpg",
        "mime": "image/jpeg",
        "next": "Fest bildet med POST /api/v1/products/{id}/images (asset_ids)."
      }
    }
  • POST/api/v1/image-generateLage AI-produktbilder — velg selv modell
    Request
    {
      "source_image_urls": ["https://example.com/hylle.jpg"],
      "name": "Stue S – vegghengt, 3 hyller",
      "hint": "Vis møbelet i en lys, skandinavisk stue.",
      "model": "gemini"
    }
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "model": "gemini",
        "images": [
          {
            "asset_id": "asset_9",
            "url": "https://ik.…/generert.jpg",
            "width": 2048,
            "height": 1536
          }
        ]
      }
    }

Registre

  • GET/api/v1/brandsListe merker
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "brands": [{ "id": "brand_91", "name": "Nokia" }]
      }
    }
  • POST/api/v1/brandsOpprette merker (finn-eller-opprett)
    Request
    { "items": [{ "name": "Nokia" }] }
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "brands": [
          { "name": "Nokia", "id": "brand_91", "created": false }
        ]
      }
    }
  • GET/api/v1/product-groupsProduktgruppetreet, med sti
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "product_groups": [
          {
            "id": "pg_12",
            "name": "Mobiltelefoner",
            "path": ["Elektronikk", "Mobiltelefoner"]
          }
        ]
      }
    }
  • POST/api/v1/product-groupsOpprette produktgrupper
    Request
    { "items": [{ "path": ["Elektronikk", "Mobiltelefoner"] }] }
    Response — HTTP 201 Created
    {
      "ok": true,
      "data": {
        "product_groups": [
          {
            "path": ["Elektronikk", "Mobiltelefoner"],
            "id": "pg_12",
            "created": true
          }
        ]
      }
    }
  • GET/api/v1/categoriesKategoritreet, med sti (ingen bladregel)
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "categories": [
          {
            "id": "cat_3",
            "name": "Mobiltelefoner",
            "path": ["Elektronikk", "Mobiltelefoner"]
          }
        ]
      }
    }
  • POST/api/v1/categoriesOpprette kategorier
    Request
    { "items": [{ "path": ["Elektronikk", "Mobiltelefoner"] }] }
    Response — HTTP 201 Created
    {
      "ok": true,
      "data": {
        "categories": [
          {
            "path": ["Elektronikk", "Mobiltelefoner"],
            "id": "cat_3",
            "created": true
          }
        ]
      }
    }
  • GET/api/v1/attributesListe egenskaper
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "attributes": [
          { "id": "attr_5", "name": "Farge", "is_variant_axis": true }
        ]
      }
    }
  • POST/api/v1/attributesOpprette egenskaper
    Request
    { "items": [{ "name": "Farge", "type": "dropdown", "is_variant_axis": true }] }
    Response — HTTP 201 Created
    {
      "ok": true,
      "data": {
        "attributes": [
          { "name": "Farge", "id": "attr_5", "created": true }
        ]
      }
    }
  • GET/api/v1/attributes/{id}/valuesVerdiene på en egenskap
    Response — HTTP 200 OK
    {
      "ok": true,
      "data": {
        "values": [{ "id": "val_1", "value": "Grå" }]
      }
    }
  • POST/api/v1/attributes/{id}/valuesLegge til egenskapsverdier
    Request
    { "items": [{ "value": "Grå" }] }
    Response — HTTP 201 Created
    {
      "ok": true,
      "data": {
        "values": [
          { "value": "Grå", "id": "val_1", "created": true }
        ]
      }
    }

Hent produkter

Nøkler lages under Innstillinger → API-nøkler — rollen må være editor eller admin.

bash
curl https://atlas.flowretail.com/api/v1/products \
  -H "Authorization: Bearer atlas_live_…"

Opprett et produkt

Merke og produktgruppe må finnes fra før — slå opp eller opprett med registerendepunktene over.

bash
curl -X POST https://atlas.flowretail.com/api/v1/products \
  -H "Authorization: Bearer atlas_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "products": [{
      "name": "Nokia 6110",
      "sku": "NOK-6110",
      "brand": "Nokia",
      "product_group": ["Elektronikk", "Mobiltelefoner"],
      "sale_price_incl_vat": "699.00",
      "vat": 25
    }]
  }'

Velg selv hvilken AI-modell

Send inn et vanlig produktfoto, få tilbake et iscenesatt bilde. Du bestemmer hvilken bildemodell som skal brukes — de tre tolker den samme beskrivelsen ulikt, og gir merkbart forskjellig uttrykk på det samme produktet.

modelModellOppløsning
geminiGoogle Nano Banana Prostandard2K
openaiOpenAI gpt-image-21536 × 1024
grokxAI Grok Imagine2K

Prisen er den samme uansett modell — 10 kr per bilde etter den inkluderte kvoten. Du velger altså på uttrykk og oppløsning, ikke på pris, og kan bytte mellom to kall uten at det merkes på fakturaen. Utelater du feltet, brukes standardmodellen, og svaret sier alltid hvilken som faktisk kjørte.

Bestem utsnittet med «aspect» 1:1, 3:4 eller 4:3 (standard 4:3), og det virker likt på alle tre modellene. Utsnittet betyr mer enn man tror: et bredt møbel i stående format blir mest tom vegg, mens det samme bildet i 1:1 fyller flaten. Velg format etter produktets fasong, ikke etter webshoppens grid.

Ett tips som endrer resultatet mest: si i hint hvordan produktet skal opptre, ikke bare hvor det står. Et møbel klarer seg med «i en lys stue», men et klesplagg fotografert flatt på hvit bakgrunn blir liggende flatt også i det nye bildet — be om at det bæres av en person, med vekt og fall, så endres resultatet fullstendig. Modellene gjengir dessuten ikke tekst pålitelig, så et logotrykk med skrift kommer sjelden korrekt ut.

bash
curl -X POST https://atlas.flowretail.com/api/v1/image-generate \
  -H "Authorization: Bearer atlas_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "source_image_urls": ["https://example.com/hylle.jpg"],
    "name": "Stue S – vegghengt, 3 hyller",
    "hint": "Vis møbelet i en lys, skandinavisk stue.",
    "model": "grok"
  }'

Viktig å vite

  • Beløp er streng, aldri tall. Inkl. mva, maks to desimaler — "299.00", ikke 299.00.
  • Feilsvar du kan feilsøke på. En ugyldig forespørsel gir 422 med path til feltet, en code du kan forgrene på, og hva som var galt — «merket «Acme» finnes ikke», ikke «ugyldig input». Ukjente merker og grupper opprettes aldri stille i bakgrunnen.
  • Kjør en dry-run først. {"dry_run":true} kjører hele valideringen og ruller tilbake, så du får nøyaktig samme feilliste som en ekte skriving ville gitt — uten å ha skrevet noe. Verdt det på alt større enn noen få rader.
  • Trygt å gjenta. Sender du sku, er varekoden identiteten — en retry lander i skipped i stedet for å lage produktet på nytt. Oppretter du uten varekode, får hvert forsøk en ny kode og ville blitt duplisert: send Idempotency-Key, så får du det opprinnelige svaret tilbake i 24 timer.
  • 1000 produkter per kall, 600 kall i minuttet. En import på 100 000 produkter er 100 kall — den bruker en sjettedel av minuttkvoten og går som en lek. Går du likevel over, får du 429 med en Retry-After-header å vente på, ikke en gjetning.

Full kontroll på alle produkt-data.

Opprett konto, koble til Flow Retail eller Shopware, og publiser det første produktet på minutter.