> ## Documentation Index
> Fetch the complete documentation index at: https://docs.acedata.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# WebExtrator Webbrendering API Integrationsguide

> WebExtrator Web Render & Extract API guide - Ace Data Cloud

`POST https://api.acedata.cloud/webextrator/render`

WebExtrator webbrendering API är en webbrenderingstjänst baserad på headless Chromium. Ge en URL,
returnera den helt renderade HTML (inklusive JS-injicerat innehåll), ren text, sidtitel och slutlig URL.

Render är WebExtrators mest grundläggande gränssnitt. Om du behöver **strukturerade** extraktionsresultat (artikeltext,
produktpriser, receptingredienser …), vänligen använd
[`/webextrator/extract`](development_webextrator_extract) — det kör en hel uppsättning typad extraktionspipeline
på samma renderingsgrund.

## Ansökningsprocess

För att använda WebExtrator-tjänsten, börja med att gå till [Ace Data Cloud-konsolen](https://platform.acedata.cloud/console/applications) för att få din API-token, som du kan spara för framtida bruk.

![](https://cdn.acedata.cloud/5hmkdg.jpg)

Om du inte har loggat in eller registrerat dig, kommer du automatiskt att omdirigeras till inloggningssidan för att registrera dig och logga in, och efter att ha slutfört detta kommer du automatiskt att återvända till den aktuella sidan.

**En API-token kan användas för att anropa alla tjänster på plattformen, utan att behöva ansöka om varje tjänst separat.** Första ansökan ger en gratis kvot, så att du kan prova gratis; när kvoten är slut kan du ladda på allmänna saldot i [konsolen](https://platform.acedata.cloud/console/coin).

> 📘 Fullständig dokumentation: [WebExtrator tjänstsida →](https://platform.acedata.cloud/service/webextrator)

## Autentisering

Alla WebExtrator-gränssnitt använder standard Bearer Token-autentisering:

```
Authorization: Bearer YOUR_API_KEY
Content-Type:  application/json
```

## Begärningsparametrar

| Fält                | Typ       | Obligatoriskt | Standard                   | Beskrivning                                                                                                                      |
| ------------------- | --------- | :-----------: | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `url`               | string    |       ✅       | —                          | URL för sidan som ska renderas, måste vara `http(s)://`.                                                                         |
| `user_agent`        | string    |       ❌       | Inbyggd UA-pool roterar    | Anpassad User-Agent.                                                                                                             |
| `timeout`           | number    |       ❌       | `30`                       | Tidsgräns för en navigering (**sekunder**).                                                                                      |
| `wait_until`        | enum      |       ❌       | `networkidle`              | Laddningskomplettering: `load` / `domcontentloaded` / `networkidle` / `commit`.                                                  |
| `delay`             | number    |       ❌       | `0`                        | **Extra väntetid i sekunder** efter att `wait_until` har utlösts (används för SPA andra renderingar).                            |
| `wait_for_selector` | string    |       ❌       | —                          | Vänta på att denna CSS-väljare ska dyka upp, mer stabil än `networkidle`.                                                        |
| `block_resources`   | string\[] |       ❌       | `["image","font","media"]` | Blockerade resurstyper, valfria: `image` / `font` / `media` / `stylesheet` / `xhr` / `fetch`.                                    |
| `headers`           | object    |       ❌       | —                          | Extra HTTP-begärningshuvuden (t.ex. `{"Accept-Language": "en-US"}`).                                                             |
| `cookies`           | array     |       ❌       | —                          | Cookies som injiceras före navigering, struktur se nedan.                                                                        |
| `callback_url`      | string    |       ❌       | —                          | Återkopplingsadress i asynkront läge, plattformen `POST`:ar det fullständiga resultatet till denna adress när uppgiften är klar. |
| `bypass_cache`      | boolean   |       ❌       | `false`                    | Hoppa över Redis-cacheläsning (men kommer fortfarande att skriva tillbaka resultatet till cachen).                               |
| `cache_ttl_seconds` | number    |       ❌       | `3600`                     | Anpassa TTL för denna skrivning till cache, skicka `0` för att inte cacha detta svar.                                            |
| `async`             | boolean   |       ❌       | `false`                    | Sätt till `true` för att omedelbart returnera `task_id`, resultatet kan hämtas via `callback_url` eller Tasks API.               |

> Plattformens avtal använder enhetligt **snake\_case**. Interna renderingtjänster stöder camelCase, men externa anrop använder alltid snake\_case.

### Cookie-struktur

```json theme={null}
{
  "name":      "string",
  "value":     "string",
  "domain":    "string",
  "path":      "/",
  "expires":   1735689600,
  "httpOnly":  false,
  "secure":    true,
  "sameSite":  "Lax"
}
```

## Synkron respons

```json theme={null}
{
  "success": true,
  "task_id": "550e8400-e29b-41d4-a716-446655440000",
  "trace_id": "550e8400-e29b-41d4-a716-446655440001",
  "started_at": 1777717800.123,
  "finished_at": 1777717801.234,
  "elapsed": 1.111,
  "data": {
    "kind": "render",
    "url": "https://example.com",
    "finalUrl": "https://example.com/",
    "title": "Exempeldomän",
    "status": 200,
    "html": "<!DOCTYPE html><html>...</html>",
    "text": "Exempeldomän\nDenna domän används för illustrativa exempel...",
    "userAgent": "Mozilla/5.0 ...",
    "elapsedMs": 1108
  }
}
```

| Fält                 | Typ            | Beskrivning                                                             |
| -------------------- | -------------- | ----------------------------------------------------------------------- |
| `data.kind`          | string         | Fast `"render"`.                                                        |
| `data.url`           | string         | Den URL du skickade in.                                                 |
| `data.finalUrl`      | string         | Den slutliga URL efter omdirigering.                                    |
| `data.title`         | string         | Den renderade `document.title`.                                         |
| `data.status`        | number \| null | HTTP-statuskod för huvudnavigeringen.                                   |
| `data.html`          | string         | Fullständig renderad HTML.                                              |
| `data.text`          | string         | Snapshot av `document.body.innerText` (använd Extract för renare text). |
| `data.userAgent`     | string         | Den faktiska använda UA.                                                |
| `data.elapsedMs`     | number         | Endast tiden för webbläsarens rendering.                                |
| `data.cached`        | boolean?       | `true` om cachen träffades.                                             |
| `data.cacheStoredAt` | number?        | Unix-millisekundstidsstämpel för första skrivning av cacheposten.       |

## Asynkron respons

`async=true` (eller ange `callback_url`) returnerar omedelbart (HTTP 200):

```json theme={null}
{
  "success": true,
  "task_id": "550e8400-...",
  "trace_id": "6ba7b810-...",
  "started_at": 1777717800.123
}
```

Resultatet kommer att skickas via `POST` till `callback_url` (om konfigurerat), eller genom
[`/webextrator/tasks`](development_webextrator_tasks) kan du aktivt fråga.

### Återkopplingsstruktur

Plattformen `POST`:ar en envelope som är **helt identisk** med den synkrona modellen till `callback_url`,
`Content-Type: application/json`. Att returnera valfritt `2xx` betraktas som bekräftat; `5xx` kommer att
återföras med exponentiell backoff i cirka 5 minuter.

## Felrespons

| HTTP | `error.code`     | Innebörd                                                                                                |
| ---- | ---------------- | ------------------------------------------------------------------------------------------------------- |
| 400  | `bad_request`    | Begäran kropp passerade inte Zod validering (saknar `url`, fel typ …).                                  |
| 401  | `unauthorized`   | Saknad eller ogiltig `Authorization: Bearer …`.                                                         |
| 402  | (x402)           | Plattformens saldo är otillräckligt, returnera x402 betalningskrav kuvert.                              |
| 408  | `timeout`        | Navigering överskred `timeout`.                                                                         |
| 429  | `queue_busy`     | Synkroniseringskö är överbelastad, vänligen försök igen eller använd `async=true`.                      |
| 500  | `internal_error` | Servern hanterade inte undantag (webbläsaren kraschade etc.), Worker försöker automatiskt igen en gång. |

Felstruktur:

```json theme={null}
{
  "success": false,
  "task_id": "...",
  "trace_id": "...",
  "started_at": 1777717800.123,
  "finished_at": 1777717800.135,
  "elapsed": 0.012,
  "error": { "code": "bad_request", "message": "url: Ogiltig url" }
}
```

## Exempel

### cURL

```bash theme={null}
curl -X POST https://api.acedata.cloud/webextrator/render \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com",
    "wait_until": "networkidle",
    "block_resources": ["image", "media", "font"]
  }'
```

### Python (requests)

```python theme={null}
import os, requests

API_KEY = os.environ["ACEDATA_API_KEY"]

resp = requests.post(
    "https://api.acedata.cloud/webextrator/render",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    },
    json={
        "url": "https://example.com",
        "wait_until": "networkidle",
        "block_resources": ["image", "media", "font"],
    },
    timeout=60,
)
resp.raise_for_status()
data = resp.json()["data"]
print(data["title"], data["status"], len(data["html"]))
```

### Node.js (fetch)

```js theme={null}
const apiKey = process.env.ACEDATA_API_KEY;

const res = await fetch('https://api.acedata.cloud/webextrator/render', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    url: 'https://example.com',
    wait_until: 'networkidle',
    block_resources: ['image', 'media', 'font'],
  }),
});
const { data } = await res.json();
console.log(data.title, data.status, data.html.length);
```

### Asynkron + Callback

```bash theme={null}
curl -X POST https://api.acedata.cloud/webextrator/render \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com",
    "async": true,
    "callback_url": "https://your-app.example.com/hooks/webextrator"
  }'
```

Omedelbart returnera `{ "success": true, "task_id": "...", "trace_id": "...", "started_at": 1777717800.123 }`;
När uppgiften är klar kommer plattformen att POST:a hela resultatet till din `callback_url`.

### Tvinga att kringgå cache

```bash theme={null}
curl -X POST https://api.acedata.cloud/webextrator/render \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com",
    "bypass_cache": true
  }'
```

## Tips och fallgropar

* **Att välja rätt `wait_until` är viktigt.** `networkidle` är mest stabil men långsam; `domcontentloaded`
  är snabb men kan missa asynkront injicerat innehåll; `load` passar traditionella statiska sidor.
* **Cache-nyckel ignorerar `async`.** Samma URL:s synkrona och asynkrona begärningar träffar samma cachepost,
  att växla fritt kommer inte att misslyckas.
* **Cache-nyckel ignorerar `bypass_cache` och `cache_ttl_seconds`.** Dessa två är operationsbrytare,
  påverkar inte svarsinnehållet.
* **`cookies` och `headers` kommer att dela upp cache.** Anpassning av dessa två kommer att göra att första samma kombination misslyckas.
* **Tunga SPA:er överskrider ofta standard 30 sekunder.** Rekommenderar `timeout: 60`, `wait_until: "domcontentloaded"`, `delay: 4`, och kombinera med `wait_for_selector` för att vänta på de element som verkligen är viktiga.
* **`block_resources` är den snabbaste vägen att minska latens.** Standard har redan blockerat bilder / typsnitt / media;
  Om du extraherar utan att vara beroende av CSS-layout, kan du lägga till `stylesheet` för att bli ännu snabbare.
