# Limits, safety, and cost

Makra accepts bounded public web work. The SDK validates request shape locally, while the API enforces URL admission, account capacity, request limits, page budgets, and credits.

## URL safety boundary

Submit public websites with ordinary domain names. The service rejects local hosts, IP literals, user information embedded in URLs, unsupported ports, malformed hosts, control characters, and other forms that can target internal networks.

Do not use Makra to probe private services. Do not place secrets in a URL. Target pages are untrusted input even when you own the calling application.

## Page access limits

Normal JavaScript rendering is supported. Arbitrary login flows, caller-supplied cookies, general click sequences, and form automation are outside the Python SDK contract.

CAPTCHAs, access-denied pages, site-generated error pages, navigation failures, and pages that never become ready can fail a URL. A proxy region can change egress location, but it does not grant permission or guarantee access.

Respect target-site terms, robots policies where applicable, copyright, privacy rules, and rate expectations. Technical reachability is not legal authorization.

## Request and schema limits

The deployment controls maximum body size, unique URLs, hosts, query leaves, browser capacity, page work, and model spend. Some limits reject a request. A query with too many leaves can be truncated and reported as a warning.

Avoid designing one giant schema as a substitute for product decisions. Request the fields your application owns, keep descriptions precise, and split unrelated jobs when they have different failure or freshness policies.

## Multi-URL execution

Concurrent mode is the default. Each unique URL has an isolated extraction pipeline, and failures remain scoped to that URL. Sequential mode is useful when your account or target should see one page at a time.

```python
from makra import ExecutionModes, Makra

with Makra() as client:
    response = client.extract(
        [
            "https://shop.example/products/atlas-lamp",
            "https://shop.example/products/harbor-lamp",
        ],
        {"price": "The current selling price"},
        execution_mode=ExecutionModes.SEQUENTIAL,
    )
```

## Pagination

Pagination is bounded by `additional_pages`. It is not an open-ended crawl.

```python
from makra import ExtractOptions, Makra

options = ExtractOptions(additional_pages=2)

with Makra() as client:
    response = client.extract(
        ["https://shop.example/search?q=lamp"],
        {"results": "Products listed on each result page"},
        config=options,
    )
```

Discovered follow pages can appear as separate URL keys. A failed follow page can remain present with `None` data.

## Credits and usage

Workflows are billable. The gateway can reject admission when available credits cannot cover the required hold, and a run can end in `budget_exhausted`. Responses and run metadata can include credits charged, usage categories, and billing state.

Do not hard-code prices from documentation into application logic. Read current account and product pricing from the appropriate product surface. At runtime, persist the run's reported usage and billing fields beside your own job record.

Next, use [Troubleshooting](/markdown/makra-sdk/v0.0.3-beta/production/troubleshooting) when a run does not behave as expected.
