REST API

Programmatic access to the AAS Studio extraction pipeline. Send a PDF datasheet, get back a structured Asset Administration Shell extraction result. Useful for integrating AAS file generation into ERP, PLM, or PIM workflows.

Open interactive API explorer — try it out →
TypeScript SDK
@aas-studio/sdk · npm
Python SDK
aas-studio · PyPI
Integration guides
SAP, Siemens, AVEVA, BaSyx + generic
Standards conformance
AAS V3.1, IDTA, IEC 63278 evidence
Generate API key
Studio → Settings → API Keys
OpenAPI 3.0 schema
Plug into Postman / openapi-generator

Authentication

Every request needs a Bearer API key in the Authorization header. Generate one in Studio → Settings → API Keys. Keys are prefixed sk_aas_ and are shown ONCE at creation — store them in a secret manager.

Authorization: Bearer sk_aas_a1b2c3d4...

Each call counts against your monthly extraction quota — same limits as the web app (Free 3 / Individual 50 / Team 300 / Enterprise unlimited).

Quickstart — extract from a PDF

Use the official SDK for production work — typed, zero-deps, error classes for every status code. Or stay with curl for quick tests.

TypeScript SDK

import { AasStudioClient } from '@aas-studio/sdk'
import { readFileSync } from 'node:fs'

const aas = new AasStudioClient({ apiKey: process.env.AAS_STUDIO_KEY! })

const { result, provider } = await aas.extract({
  file: readFileSync('./datasheet.pdf'),
  idPrefix: 'urn:acme:aas',
})
console.log(result.assetIdShort, '·', result.submodels.length, 'submodels via', provider)

Python SDK

from aas_studio import AasStudioClient

aas = AasStudioClient(api_key=os.environ["AAS_STUDIO_KEY"])

with open("./datasheet.pdf", "rb") as f:
    response = aas.extract(f.read(), id_prefix="urn:acme:aas")
print(response["result"]["assetIdShort"])

curl (raw HTTP)

curl -X POST https://aas-studio.eu/api/v1/extract \
  -H "Authorization: Bearer $AAS_STUDIO_KEY" \
  -F "file=@datasheet.pdf" \
  -F "idPrefix=urn:acme:aas"

Response (truncated):

{
  "result": {
    "assetIdShort": "UR10e",
    "assetId": "urn:acme:aas:UR10e",
    "assetDescription": "Universal Robots UR10e collaborative robot",
    "submodels": [
      {
        "idShort": "Nameplate",
        "elements": [
          { "idShort": "ManufacturerName", "value": "Universal Robots A/S",
            "semanticIdIrdi": "0173-1#02-AAO677#002",
            "confidence": 95, "tier": "high", "needsReview": false }
        ]
      }
    ]
  },
  "provider": "gemini",
  "warnings": []
}

Endpoints

POST/api/v1/extract
Extract an AAS submodel from a PDF datasheet
Body: multipart/form-data with file (binary PDF, max 20 MB), optional idPrefix, optional apiKey override, optional provider
200Extraction succeeded — returns ExtractionResult
401Missing or invalid Bearer key
402Monthly quota exceeded (returns plan / used / limit)
413File exceeds 20 MB
422PDF could not be parsed (scanned image, malformed)
502LLM provider failed
GET/api/v1/health
Service liveness probe (no auth required)
200Service is up — returns { ok: true, version }

Errors

All non-2xx responses use a stable JSON envelope with an error machine code and a human-readable message. Many errors include an (id=…) correlation tag — quote it when contacting support.

{
  "error": "extraction_failed",
  "message": "AI extraction failed (id=ab12-3c4d-...). Please retry."
}

Rate limits & quota

Extractions are currently free and unlimited — billing is disabled on this deployment, so there is no per-call quota. The API and the web app share one counter that is not enforced while billing is off.

If a deployment re-enables billing, plan caps apply (Free 3 / Individual 50 / Team 300 / Enterprise unlimited, monthly) and hitting the cap returns HTTP 402 with the current usage in the body.

OpenAPI schema

Full OpenAPI 3.0 schema lives at /api/v1/openapi.json. Drop it into Postman, Stoplight, openapi-generator-cli, or any AI agent framework that consumes OpenAPI to scaffold a typed client in seconds.

Command palette

Navigate + run actions