Skip to main content
    Skip to content
    NorruvaDeveloper Docs
    Sandbox · verified 2026-07-29
    This page
    Whole docs
    Machine formats

    PlaygroundGet API keys
    IntroductionQuickstartAuthenticationErrors & conventionsSandbox & environments
    Entity modelProducts & categoriesPassports & versionsDigital Link & resolutionCompliance & regulationsWebhooks & eventsAutoID print loopImport jobsObservability & audit
    OverviewAuth & API keysProductsCompliance & regulationsPassportsResolver & publicWebhooksPrint jobs & devicesImport / bulkObservabilityBeyond happy path
    Integration playbookWebhook receiver guideRun a print deviceDeviations & gotchas
    EN 18222 API methodsAnnex ZA — ESPR correspondence
    Docs/Concepts/Import jobs

    Import jobs

    An Import Job ingests many products at once. Row failures are isolated — one bad row does not fail the batch — and you correct and re-submit against a generated template.

    Lifecycle

    HTTP
    POST /api/v2/import/jobs        (multipart: file=CSV, UTF-8, ≤10 MB, magic-byte validated)  → 202 { jobId }
    GET  /api/v2/import/jobs/{jobId}                     → status / preview
    GET  /api/v2/import/jobs/{jobId}/errors              → row-level failures (isolated)
    GET  /api/v2/import/jobs/{jobId}/correction-template → fixable re-upload template
    POST /api/v2/import/jobs/{jobId}/confirm             → apply

    Get the right template first: GET /api/v2/schemas/categories/{category}/import-template?jurisdiction=EU renders the CSV columns from the category's effective schema — fill it in and upload it via POST /api/v2/import/jobs; the columns round-trip by construction. Also: POST /api/v2/import (single-shot CSV, ≤ 50 MB) and GET /api/v2/import/templates/{regulationCode} (same generator, keyed by regulation code). Re-submitting the same file is a no-op.

    Machine on-ramp (PRD F2)

    The JSON batch path TSC-style integrations use — no multipart, API-key auth:

    HTTP
    POST /api/v2/ingest/products                    (scope: ingest:write)
    { "sourceSystem": "tsc-middleware",
      "products": [ { "referenceId": "erp-4711",    // REQUIRED — per-row idempotency key
                      "name": "EcoCell Battery Pack",  // REQUIRED
                      "description": "…", "gtin": "…", // optional
                      "category": "Electronics",    // optional display-name enum
                      "materials": [{ "name": "lithium", "percentage": 5.2 }],
                      "manufacturing": { "facility": "Gigafactory 1", "country": "DE" },
                      "customData": { "line": "A" } } ],
      "callbackUrl": "https://integrator.example/hooks/ingest" }   // optional
    
    → 202 { jobId }
    GET /api/v2/ingest/{jobId}          → job status / row outcomes

    The item shape is the strict ERP-flavoured ingest schema (unknown keys rejected) — NOT the create-product shape. referenceId is the per-row identity: re-submitting the same rows does not duplicate products, and import.completed / import.failed webhook events close the loop.

    ◆
    Status. Driven green live 2026-07-22 (10,000 rows terminal in 67.5 s · 25/25 induced failures isolated row-level · idempotent re-submit, zero duplicates) — Implemented. AASX package import: POST /api/v2/import/aasx accepts a multipart .aasx (OPC/ZIP) package and creates a Draft product through the canonical create contract; XML-only payloads are refused honestly.
    Was this page helpful?
    Thanks — noted.Feedback goes to the docs team by email.
    ← PreviousAutoID print loopNext →Observability & audit
    On this page
    LifecycleMachine on-ramp (PRD F2)
    Norruva DPP API · sandbox developer docsGenerated 2026-07-29 · PRD-aligned (TSC roadmap rev 2) · statuses reflect E2E-verified sandbox behaviour — not marketing