Features / Files and redaction

PDFs for every model. Secrets and PII out before the model reads them.

Send PDFs, Word, Excel and HTML to any chat model: models without file input get the text. Per-key redaction swaps secrets and PII for placeholders.

What it does

Files for every chat model
37 models read documents natively and get them as sent; the other 302 get the document as text.
Three request shapes
Chat file parts, Anthropic document blocks (tool results included) and Responses input_file parts, as base64 or a URL.
Fallbacks keep working
With a models list, a document passes through as sent only when every model on the list reads files; otherwise it is read to text once.
Secrets out before the model
API keys, tokens and private keys become [[SECRET_n]] placeholders; with secrets_pii, emails, phones, cards, SSNs and IBANs too.
Originals back in the answer
Placeholders the model repeats are swapped back to the real values, in whole and streamed answers.
Per key or per request
Set redact on the key, or send x-uplink-redact on one request. A redacted request skips the response cache.

Pricing · live catalog, 2026-11-04

WhatModelsPrice
Documents, models that read files37 modelsSent as is; tokens at the model price
Documents, every other model302 models$0.00 per page read, then $0.06 in · $0.18 out per 1M tokens on deepseek-v4.1-flash
Secret and PII redactionEvery keyNo fee

Request example

curl · Responses, file URL
curl https://api.uplinkswitch.com/v1/responses \
  -H "Authorization: Bearer $UPLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4.1-flash",
    "input": [{
      "role": "user",
      "content": [
        {"type": "input_text", "text": "List every payment date in this contract."},
        {"type": "input_file", "file_url": "https://example.com/contract.pdf"}
      ]
    }]
  }'
Python · local PDF
import base64
from openai import OpenAI

client = OpenAI(base_url="https://api.uplinkswitch.com/v1", api_key="sk-uplink-live-...")

with open("invoice.pdf", "rb") as f:
    data = base64.b64encode(f.read()).decode()

res = client.chat.completions.create(
    model="deepseek-v4.1-flash",
    messages=[{"role": "user", "content": [
        {"type": "text", "text": "What is the total due?"},
        {"type": "file", "file": {"filename": "invoice.pdf",
                                  "file_data": f"data:application/pdf;base64,{data}"}},
    ]}],
)
curl · redact one request
curl https://api.uplinkswitch.com/v1/chat/completions \
  -H "Authorization: Bearer $UPLINK_API_KEY" \
  -H "x-uplink-redact: secrets_pii" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-5-5",
    "messages": [{"role": "user", "content": "Email jane@example.com that her key sk-test-51Hx... was rotated."}]
  }'
curl · redact by default on a key
curl -X PATCH https://api.uplinkswitch.com/v1/keys/KEY_ID \
  -H "Authorization: Bearer $UPLINK_ADMIN_KEY" \
  -H "Content-Type: application/json" \
  -d '{"redact": "secrets"}'
  • Each model row in GET /v1/catalog says file_input: native or parsed.
  • The key route takes an admin key, created in the console; the same setting is under API keys in the console.

Questions

Yes. A chat file part, a Messages document block or a Responses input_file sent to a model without file input is read to text first and reaches the model as [document: name] followed by the text. Up to 20 MB a file, the first 50 pages and 200,000 characters, at $0.00 a page.

bmp, csv, docx, et, gif, htm, html, jpeg, jpg, md, numbers, ods, odt, pdf, png, svg, txt, webp, xls, xlsb, xlsm, xlsx, xml. A file can come as base64 data or an http(s) URL; private and internal URLs are refused.

secrets replaces API keys, tokens and private keys in the message text with placeholders such as [[SECRET_1]] before the request leaves the gateway. secrets_pii also replaces emails, phone numbers, card numbers, US SSNs and IBANs. The answer gets the originals back, in whole and in streamed responses.

Per key, with redact on POST or PATCH /v1/keys (off, secrets or secrets_pii) or the Redact setting in the console’s key dialog. The x-uplink-redact header overrides the key for one request; x-uplink-redactions on the answer says how many values were replaced.

Yes. When server tools run, every tool round inherits the setting, so search results or fetched pages that go back to the model are redacted too.