> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nativeport.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nativeport.ai/_mcp/server.

# Changelog

## September 27, 2026

## MCP — `call_endpoint` sends form fields

<ChangelogTags>mcp</ChangelogTags>

`call_endpoint` takes a `form` argument: text fields sent as `multipart/form-data`, for routes that take a form instead of JSON. ElevenLabs speech-to-text is one; until now it answered a JSON body from MCP with `422`, so an agent could not transcribe through MCP. Pass `model_id` and `cloud_storage_url` in `form`. `body` and `form` cannot be combined, and uploading a file still needs a direct HTTP call. Guides: [MCP](/mcp), [ElevenLabs](/elevenlabs).

## MCP — a JSON object over 512 KB is cut to fit

<ChangelogTags>mcp</ChangelogTags>

`call_endpoint` used to return a JSON object over the 512 KB cap as text cut mid-way, which no agent could parse. Now it is cut down to fit and comes back as JSON when it can be: a list keeps its first items, a string keeps its start, and each cut is listed in `omitted` with its path and size. An object over 8 MB, or one that cannot be cut down, still comes back as cut text. The case that exposed it: Scrapfly pages that `asp` renders in a browser carry every XHR in `result.browser_data`; add `proxified_response=true` to receive only the content or the extraction. Guides: [MCP](/mcp), [Scrapfly](/scrapfly).

## MCP — sign in with your NativePort account

<ChangelogTags>mcp</ChangelogTags>

An agent can connect to the MCP server by signing in with your NativePort account instead of sending a key: add `https://api.nativeport.ai/mcp` with no `Authorization` header and approve the connection in the browser. Claude, Claude Code, ChatGPT and Codex already sign in this way. Approved apps appear under Connected apps in the panel, where you can revoke them; for now, a revoked app cannot sign in to the same account again. An account that was never opened in the panel now gets a message saying so, instead of a sign-in loop. A key remains the way to connect without a browser. Guide: [MCP](/mcp).

## September 25, 2026

## Apify — `run-sync` retired; runs billed from their settled cost

<ChangelogTags>apify</ChangelogTags>

The synchronous `run-sync` and `run-sync-get-dataset-items` actions, for actors and saved tasks, now answer `404`. Their responses carried no cost, so they were billed a flat rate that fell short of what most runs cost. Start the run with `POST /apify/v2/acts/{actorId}/runs?waitForFinish=60` instead: a run that finishes within 60 seconds comes back finished in the same response. Then read its dataset with `GET /apify/v2/datasets/{defaultDatasetId}/items`, paging with `limit` and `offset`. A finished run is now billed from its cost read about 15 seconds after it ends, since Apify's first read of a finished run can still carry preliminary figures. Guide: [Apify](/apify).

## September 23, 2026

## Billing — no fee to add credits, 5.5% included in every debit

<ChangelogTags>billing</ChangelogTags>

Adding credits no longer carries a fee. Instead, every debit — each call, batch, reservation, daily storage charge and flat rate — includes a 5.5% fee on the provider's cost, and every price the gateway serves already includes it: the catalog's `price`, `priceLabel` and `expectedMicro`, SKILL.md, the MCP tools, and the per-token `pricing` on `GET /inference/v1/models` and `GET /huggingface/v1/models`. `GET /v1/catalog` and `GET /v1/catalog/{id}` now carry a top-level `callFeeBps` (`550` = 5.5%). Calls billed to your own provider key are not debited, so they carry no fee. New accounts get $1 of credit. Guide: [Agent API](/agent-api).

## September 7, 2026

## `nativeport` CLI — the Agent API from any shell

<ChangelogTags>cli</ChangelogTags>

`@nativeport/cli`, also published under the alias `nativeport`, is a zero-dependency Node 20+ command over the Agent API: `npx nativeport@latest login` stores the key once, then `find`, `inspect`, `call`, `account`, `catalog`, `skill [--install]` and `mcp [--client claude|cursor|json]` do the rest. Every command accepts `--json`, and the exit codes separate a missing key (2), insufficient credits (3), a restricted key (4) and a provider error (5) so an agent can branch on them. Guide: [Set up with CLI](/cli).

## September 6, 2026

## Agent API — find an endpoint, read its price, verify your key

<ChangelogTags>agent-api</ChangelogTags>

Three public, read-only routes and one account route let an agent choose and price a call before it spends anything. `GET /v1/catalog` lists every endpoint family with the price the ledger debits (`?q=` ranks entries by fit, then price), `GET /v1/catalog/{id}` returns one entry plus a ready native request and its `curl`, `GET /SKILL.md` is a skill file an agent installs with one line, and `GET /v1/account` returns the key's balance. All four are generated from the same code that mounts and bills every proxy. Guide: [Agent API](/agent-api).

## Remote MCP server at /mcp

<ChangelogTags>mcp</ChangelogTags>

NativePort speaks the Model Context Protocol over Streamable HTTP at `https://api.nativeport.ai/mcp`, authenticated with your API key in the `Authorization` header. Four tools mirror the Agent API — `find_endpoints`, `inspect_endpoint`, `call_endpoint` (debits the balance and runs the ordinary gateway route, so billing, logging and every restriction apply exactly as for a direct call) and `account` — plus the skill as the `nativeport://skill` resource. Client configuration for Claude Code, Cursor, Codex and OpenCode: [Set up with MCP](/mcp).

## August 8, 2026

## LlamaParse v2 — document parsing as tracked async jobs

<ChangelogTags>llamaparse</ChangelogTags>

`POST /llamaparse/v2/parse` starts a parse and `GET /llamaparse/v2/parse/{job_id}` reads it, returning page text or markdown at the tier you pick (`fast`, `cost_effective`, `agentic`, `agentic_plus`) with a `version` pin for output that stays stable across parser updates. `page_ranges` is required so the job can be priced up front: the create-time price is a reservation that settles to the usage LlamaCloud reports when the job finishes. Jobs belong to the account that created them; a job id presented by any other account answers `404`. Guide: [LlamaParse](/llamaparse).

## Apify — async runs alongside the inline routes

<ChangelogTags>apify</ChangelogTags>

Besides `run-sync` and `run-sync-get-dataset-items`, `/apify` now relays Apify's asynchronous style: `POST /apify/v2/acts/{actorId}/runs` or `POST /apify/v2/actor-tasks/{actorTaskId}/runs` to start a run, `GET /apify/v2/actor-runs/{runId}` for its status and usage, `GET /apify/v2/datasets/{datasetId}/items` for what it produced, and `POST /apify/v2/actor-runs/{runId}/abort` to stop it. Runs are ownership-gated to the account that started them; polling is free, and the run's own compute cost is debited once, when it finishes. Guide: [Apify](/apify).

## August 5, 2026

## Mistral Document AI — OCR and structured extraction, priced per page

<ChangelogTags>mistral</ChangelogTags>

`POST /mistral/v1/ocr` is live: PDFs and images in, per-page markdown out, and — on the same call — structured fields pulled out with a JSON schema you supply. The route is policed: a closed body policy runs before Mistral is called, `pages` is required because cost scales with the document, and the price of the selection is checked against your balance before the upstream call, so a job that does not fit answers `402` instead of being forwarded. Guide: [Mistral](/mistral).

## July 25, 2026

## Unified Inference API — production

<ChangelogTags>inference-api</ChangelogTags>

`POST /inference/v1/chat/completions` and `GET /inference/v1/models[/{id}]` are live in production: one OpenAI Chat Completions-shaped contract, JSON and SSE, over [OpenAI](/openai), [Anthropic](/anthropic), [Grok](/grok), and [Hugging Face](/huggingface) at once. Address any admitted model with a canonical id (`openai/<id>`, `anthropic/<id>`, `xai/<id>`, `huggingface/<owner>/<model>[:provider]`) and the same request schema works unchanged across providers — including full request/response translation for Anthropic's Messages API. Image input is honored only for the models `GET /inference/v1/models` reports `capabilities.vision: true` for.

It's a translation layer over the four existing model-inference routes, not a fifth upstream: no new credential, no separate catalog, no separate rate-limit pool. Read the full guide at [Inference API](/inference).