Inference API · run in Sweden

Open models.
Swedish hardware.
One API.

Text, vision and embedding models behind an OpenAI-compatible endpoint. They run on servers we own and operate in Sweden, and your requests are never logged or used for training.

From
€1 / 1M input tokens
Context
up to 64K tokens
Billing
Prepaid credits
POST /v1/chat/completions Recorded response
Input · invoice scan A Swedish supplier invoice from Fjällbo Fastighetsservice AB with four line items and a total of 23 578 SEK
Output · schema-valid JSON
{
  "supplier": "Fjällbo Fastighetsservice AB",
  "supplier_org_no": "556871-4402",
  "invoice_number": "2026-1187",
  "invoice_date": "2026-09-15",
  "due_date": "2026-10-15",
  "customer": "Brf Storsjöutsikten",
  "net_amount": 18862.5,
  "vat_amount": 4715.63,
  "total_amount": 23578.0,
  "currency": "SEK",
  "bankgiro": "5521-0934",
  "ocr": "20261187049",
  "line_items": [
    {
      "description": "Fastighetsskötsel, september 2026",
      "amount": 8400.0
    },
    {
      "description": "Byte av cirkulationspump, undercentral",
      "amount": 6950.0
    },
    {
      "description": "Arbetstid, akut utryckning 2026-09-07",
      "amount": 2432.5
    },
    {
      "description": "Sophantering, extra tömning grovavfall",
      "amount": 1080.0
    }
  ]
}
qwen3-vl 9.4 s → qwen3.8-27b 3.4 s2 calls2,471 tokens€0.0040
01 / Connect

Two lines change. The rest of your code stays.

Use the OpenAI SDK you already have, or any client that speaks the same API: chat completions, streaming, vision input, JSON output and embeddings.

  1. 1

    Create an account and add credits in the portal.

  2. 2

    Create an API key per application.

  3. 3

    Point your client at api.juicefactory.ai/v1.

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.juicefactory.ai/v1",
    api_key=os.environ["JUICEFACTORY_API_KEY"],
)

reply = client.chat.completions.create(
    model="qwen3.8-27b",
    messages=[{"role": "user", "content": "Summarise this contract clause: …"}],
)
02 / Real calls

Four jobs, four recorded responses.

Every output below is the unedited response from the production API, recorded 2026-10-04 11:47 UTC. Timings and token counts are what the call reported; cost uses the published catalog prices.

A scanned invoice becomes fields your bookkeeping can post.

The vision model reads the page. The text model maps that reading onto your schema, which the API enforces. Your code then checks the arithmetic before anything is booked.

qwen3-vl 9.4 s → qwen3.8-27b 3.4 s2 calls2,471 tokens€0.0040
InputThe same sample invoiceSample document made for this page. The company and amounts are fictional.
Step 1 · qwen3-vl reads the page
```json
{
  "company": {
    "name": "Fjällbo Fastighetsservice AB",
    "address": "Sågverksgatan 14, 831 34 Östersund",
    "org_number": "556871-4402"
  },
  "invoice": {
    "type": "FAKTURA",
    "number": "2026-1187",
    "date": "2026-09-15",
    "due_date": "2026-10-15",
    "reference": "Serviceavtal SA-2209"
  },
  "billing_to": {
    "name": "Brf Storsjöutsikten",
    "attention": "Styrelsen, ref. Karin Lund",
    "address": "Rådhúsgatan 41, 831 30 Östersund"
  },
  "items": [
    {
      "description": "Fastighetsskötsel, september 2026",
      "quantity": 1,
      "unit": "mån",
      "unit_price": 8400.00,
      "amount": 8400.00
    },
    {
      "description": "Byte av cirkulationspump, undercentral",
      "quantity": 1,
      "unit": "st",
      "unit_price": 6950.00,
      "amount": 6950.00
    },
    {
      "description": "Arbetstid, akut utryckning 2026-09-07",
      "quantity": 3.5,
      "unit": "tim",
      "unit_price": 695.00,
      "amount": 2432.50
    },
    {
      "description": "Sophantering, extra tömning grovavfall",
      "quantity": 2,
      "unit": "st",
      "unit_price": 540.00,
      "amount": 1080.00
    }
  ],
  "totals": {
    "net": 18862.50,
    "vat": 4715.63,
    "vat_rate": 25,
    "rounding": -0.13,
    "total": 23578.00
  },
  "payment": {
    "bank_giro": "5521-0934",
    "ocr_number": "20261187049",
    "due_date": "2026-10-15"
  },
  "notes": [
    "Dröjsmålsränta enligt räntelagen. Godkänd för F-skatt. Exempeldokument skapat för JuiceFactory-demo — företag och belopp är fiktiva."
  ]
}
```
Step 2 · qwen3.8-27b fits the schema
{
  "supplier": "Fjällbo Fastighetsservice AB",
  "supplier_org_no": "556871-4402",
  "invoice_number": "2026-1187",
  "invoice_date": "2026-09-15",
  "due_date": "2026-10-15",
  "customer": "Brf Storsjöutsikten",
  "net_amount": 18862.5,
  "vat_amount": 4715.63,
  "total_amount": 23578.0,
  "currency": "SEK",
  "bankgiro": "5521-0934",
  "ocr": "20261187049",
  "line_items": [
    {
      "description": "Fastighetsskötsel, september 2026",
      "amount": 8400.0
    },
    {
      "description": "Byte av cirkulationspump, undercentral",
      "amount": 6950.0
    },
    {
      "description": "Arbetstid, akut utryckning 2026-09-07",
      "amount": 2432.5
    },
    {
      "description": "Sophantering, extra tömning grovavfall",
      "amount": 1080.0
    }
  ]
}
Checks your code runs on the output
  • Passed: Line items sum to net (18,862.50)
  • Passed: VAT is 25 % of net (4,715.63)
  • Passed: Net + VAT, rounded, is the total (23,578)
  • Passed: OCR reference passes its check digit
  • Passed: Bankgiro number passes its check digit

Why the checks matter: vision readings vary between runs. In the reading shown here the model wrote “Rådhúsgatan” for Rådhusgatan; in another recording it misspelt a line description. The address is not in the schema, and every amount and reference number was right in every recording.

03 / Models & pricing

Pay per token. No minimum.

Prices in EUR, excluding VAT, per million tokens. Billing is prepaid: add credits, and usage draws them down. The full list is always at GET /v1/models.

Model IDUse it forContextInputOutput
qwen3.8-27bText: extraction, classification, answers grounded in your sources64K€1.00€2.50
qwen3-vlVision: document pages, scans, screenshots32K€1.00€2.50
qwen3-embedEmbeddings for search and retrieval8K€0.10—

Models are open-weight Qwen models from Alibaba's Qwen team, run on our own hardware. The four examples above cost under one euro cent together.

Thinking is off by default. When a request turns it on (enable_thinking or reasoning_effort), the model's reasoning tokens are billed as output tokens at the same rate, typically two to three times the output of the same request without thinking. Each response reports them in usage.completion_tokens_details.reasoning_tokens.

04 / Data & privacy

What happens to a request.

These statements come from our data processing agreement, not from marketing copy. The DPA is issued on request as a signable PDF.

Request the DPA ↗
  1. 01

    Received in Sweden

    API traffic is routed through EU edge locations only and forwarded to our origin in Sweden over an encrypted connection.

  2. 02

    Authenticated, not recorded

    The API key is validated and rate limits are applied. No request body content is logged.

  3. 03

    Processed in memory

    Your content is passed to the model and held in volatile memory. Open-weight models run on hardware Juice Factory owns and operates.

  4. 04

    Never reused

    Your content is not used to train, fine-tune, evaluate or otherwise improve any model, and is not disclosed to any model vendor.

We meter tokens per API key for billing. Processing of your content stays within the EU/EEA; some sub-processors run support functions outside the EEA, and the DPA sets out what applies to them. AB Juice Factory AI, reg. no. 559484-2246, Sweden.

05 / In production

We run our own products on it.

These are services we build ourselves, not customer testimonials. Each one uses the API the same way you would.

Start with one document, one question or one field.