Features / Files and redaction
PDFs into any model, secrets kept out.
Attach a PDF, a spreadsheet or a Word file to any uncensored model. Turn on redaction and keys, tokens and personal data are swapped for placeholders before the prompt leaves, then put back in the answer.
File reading
- Models
- 172 of 172 listedevery listed model reads documents
- Price
- Free
- Per file
- 20 MB, 50 pages
- Formats
- 23 typesbmp, csv, docx, et, gif, htm, html, jpeg, jpg, md, numbers, ods, odt, pdf, png, svg, txt, webp, xls, xlsb, xlsm, xlsx, xml
Redaction
- secrets
- API keys, tokens, private keys
- secrets_pii
- plus emails, phones, cardsalso US SSNs and IBANs
- Per request
- x-uplink-redact header
- Per key
- redact on the keyconsole key settings or PATCH /v1/keys
- Price
- Free
Send a PDF to an uncensored model
A file part in the message, by URL or as base64. Models that read files natively get it as sent; the rest get the document as text, converted inside the request. The answer is billed at the model’s price per token.
curl https://api.uncensoredllm.ai/v1/chat/completions \ -H "Authorization: Bearer sk-ullm-live-…" \ -H "Content-Type: application/json" \ -d '{ "model": "glm-5.3-uncensored", "messages": [{"role": "user", "content": [ {"type": "text", "text": "List every deadline in this contract."}, {"type": "file", "file": {"filename": "contract.pdf", "file_url": "https://example.com/contract.pdf"}} ]}] }'import base64from openai import OpenAI client = OpenAI(base_url="https://api.uncensoredllm.ai/v1", api_key="sk-ullm-live-…")data = base64.b64encode(open("notes.pdf", "rb").read()).decode()reply = client.chat.completions.create( model="glm-5.3-uncensored", messages=[{"role": "user", "content": [ {"type": "text", "text": "Turn these notes into a scene outline."}, {"type": "file", "file": {"filename": "notes.pdf", "file_data": f"data:application/pdf;base64,{data}"}}, ]}],)print(reply.choices[0].message.content)Keep secrets out of the prompt
With x-uplink-redact: secrets_pii the model receives [[EMAIL_1]] and [[SECRET_1]] in place of the address and the key; your answer comes back with the originals. x-uplink-redactions says how many values were replaced. Retained request bodies, when a key keeps them, hold the redacted text.
curl -i https://api.uncensoredllm.ai/v1/chat/completions \ -H "Authorization: Bearer sk-ullm-live-…" \ -H "Content-Type: application/json" \ -H "x-uplink-redact: secrets_pii" \ -d '{ "model": "glm-5.3-uncensored", "messages": [{"role": "user", "content": "Write a welcome email to jane@example.com and include her API key sk-test-4f9a8b7c6d5e4f3a2b1c."}] }'Make it the key’s default with an admin key, or in the key’s settings in the console:
curl -X PATCH https://api.uncensoredllm.ai/v1/keys/KEY_ID \ -H "Authorization: Bearer $ULLM_ADMIN_KEY" \ -H "Content-Type: application/json" \ -d '{"redact": "secrets"}'Guardrails for your own app
Building an app for other people? You can switch on checks for your own users’ traffic, per key or as an organization default: blocked regex patterns, a local prompt-injection check, and allow or deny lists for tool calls. All of them are off unless you set them.
curl -X PATCH https://api.uncensoredllm.ai/v1/keys/KEY_ID \ -H "Authorization: Bearer $ULLM_ADMIN_KEY" \ -H "Content-Type: application/json" \ -d '{"guardrails": {"prompt_injection": "flag", "tool_policy": {"deny": ["delete_*"]}}}'Request bodies are not stored by default; what is kept is on the billing page and in the privacy policy. Every SDK snippet is in the console docs.
Questions
Yes, every listed model. A model that cannot read files gets the document converted to text first, inside the request, so the same file part works on any of the 172 listed models. Reading is free.
BMP, CSV, DOCX, ET, GIF, HTM, HTML, JPEG, JPG, MD, NUMBERS, ODS, ODT, PDF, PNG, SVG, TXT, WEBP, XLS, XLSB, XLSM, XLSX, XML. Up to 20 MB a file and the first 50 pages.
As an OpenAI chat file part: {"type": "file", "file": {"filename", "file_data"}} with base64 data, or "file_url" with an http(s) link. The Messages API takes a document block and the Responses API an input_file the same way.
secrets replaces API keys, tokens and private keys; secrets_pii also replaces emails, phone numbers, card numbers, US SSNs and IBANs. Each becomes a placeholder such as [[SECRET_1]] or [[EMAIL_1]] before the request is forwarded, and the answer gets the originals back.
Yes. Placeholders are restored in streamed answers as they arrive, and tool results fed back to the model in a server-tool loop are redacted the same way.
No. Guardrails are off unless you switch them on, per key or for your organization, for your own app: blocked patterns, a prompt-injection check, and allow or deny lists for tools. A blocked request reaches no model and costs nothing.