# Perimeters

> Choose where your data may go when a Job runs, and the quality of each Operation.

You never pick a model. Each Job declares a **Perimeter**, each Operation an **Operation Tier**, and the platform runs Parsing and Operations on the models of that Perimeter.

***

## 🛡️ Local and External

* **`external`** (default): third-party providers are allowed (e.g. Mistral for OCR and language models).
* **`local`**: your documents never leave Axelered's infrastructure.

A Summarization that keeps the data local:

```json
{
  "length": "short",
  "parsing": { "tier": "accurate" },
  "perimeter": "local"
}
```

The Perimeter of an [Operation](https://docs.axelered.com/jobs_guide) holds for its Parsing and for its language model.

***

## 🎯 Operation Tiers

Each Operation chooses its quality with `tier`. The Perimeter decides which language model serves each tier.

| Tier       | Credits | Description                                                 |
| :--------- | :------ | :---------------------------------------------------------- |
| `fast`     | 1       | The default: quick and cheap, good for most documents.      |
| `accurate` | 3       | A stronger language model, for long or demanding documents. |

The tier is set per Operation, independently of its Parsing Tier. An Extraction:

```json
{
  "outputSchema": { "type": "object", "properties": { "total": { "type": "number" } } },
  "tier": "accurate",
  "parsing": { "tier": "fast" }
}
```

***

## 🔒 Compliance Guard

If your organization requires that data never leaves Axelered's infrastructure, ask us to enable the **Compliance Guard** on your workspace. The workspace then shows `allowExternal: false`, and every Job must declare `"perimeter": "local"`: a Job with `external`, or without `perimeter` (the default is `external`), is rejected at submit with `403 perimeter_not_allowed`, before anything is uploaded or created.

The guard is set by Axelered, by agreement with you: API keys can read it but not change it. It is checked when a Job is submitted, so Jobs already queued when it is enabled still run.

***

## 🚦 Availability

A Perimeter is used only for what it has: `accurate` Parsing needs its OCR backend, Operations need its language model for their `tier`. When the Perimeter of a Job cannot run it, the Job is rejected at submit with `503 perimeter_unavailable`. There is no fallback to the other Perimeter, nor from `accurate` to `fast`.
