Get API key

OpenRouter NSFW: Uncensored LLM API Quickstart

Start building with our dedicated uncensored LLM API in minutes. Use standard OpenAI-compatible endpoints to send text and receive unfiltered responses without model-hopping or hidden filters.

Authentication

Authentication relies on a single API key passed in the Authorization header. This key is generated immediately after you sign up with an email and password on the Get API key page. You can regenerate the key at any time, which instantly revokes the old one. The API does not require a credit card for the initial trial, and prompts are not used for training your data. Ensure you store your key securely, as it provides direct access to your prepaid credit.

Chat Completions Endpoint

Send requests to the base URL https://api.nsfwllmrouter.com/v1 using the standard POST /v1/chat/completions endpoint. This is a text-only interface; we do not support embeddings, images, audio, or video generation. Specify the model as uncensored to ensure you are using our dedicated open-weight model optimized for adult content. The model runs on our own GPU servers and does not refuse lawful adult, fictional, or controversial topics. It is not GPT, Claude, or any other vendor's model.

curl https://api.nsfwllmrouter.com/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [{"role": "user", "content": "Write a blunt product review of a cheap VPN."}]
  }'

The request body must not exceed 8 MB. You can define system, user, and assistant messages just as you would with any OpenAI-compatible client. The model will return text output directly in the response stream.

Python SDK

Use the official OpenAI Python library to integrate quickly. Point the client to our base URL and provide your API key. This approach works for any OpenAI-compatible SDK, allowing you to swap the base URL without changing your application logic. The uncensored model ID ensures you are interacting with our specific uncensored LLM.

from openai import OpenAI

client = OpenAI(base_url="https://api.nsfwllmrouter.com/v1", api_key="YOUR_KEY")

resp = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "Summarise this thread without softening it."}],
)
print(resp.choices[0].message.content)

Remember that this is a dedicated uncensored api, so you do not need to manage complex routing or select between multiple models. The system handles the inference on our infrastructure. If you need multi-model routing, you would need to build that yourself, but here the choice is fixed to our single optimized model.

Node SDK

For Node.js environments, initialize the OpenAI client with the custom base URL and your API key. This allows you to use standard JavaScript/TypeScript patterns for building AI applications. The client will communicate with our endpoints exactly as expected by the OpenAI specification.

import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://api.nsfwllmrouter.com/v1", apiKey: process.env.API_KEY });

const resp = await client.chat.completions.create({
  model: "uncensored",
  messages: [{ role: "user", content: "Draft a villain monologue for my game." }],
});
console.log(resp.choices[0].message.content);

Ensure your environment supports the required fetch or http libraries. The response object will contain the standard choices array with the generated text. This method is ideal for server-side rendering or API backends where you need reliable, unfiltered text generation.

Streaming Responses

Enable streaming by setting stream: true in your request. The API returns Server-Sent Events (SSE) containing partial chunks of the response. This is useful for real-time interfaces where you want to display text as it is generated. The model supports standard streaming protocols, so you can use existing SSE parsers.

stream = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "Tell the story in second person."}],
    stream=True,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Each chunk contains the incremental text. Aggregate these chunks in your application to construct the full response. Streaming does not affect the token billing; you are charged for the total input and output tokens processed. This feature is supported on the chat/completions endpoint.

Rate Limits and Constraints

Each API key is limited to 300 requests per minute. If you exceed this, you will receive a 429 rate limit error. The maximum request body size is 8 MB. If your key is invalid, you will get a 401 error. If you have no prepaid credit, you will receive a 402 error. The context window is 64,000 tokens, covering both prompt and completion. There is no SLA guarantee, and we do not offer on-prem deployment or model routing. Use this uncensored api for applications that require high volume and unfiltered output.

What the API supports

Use this table to decide whether the API fits your project before you buy credit.

FeatureSupport
CompatibilityOpenAI Chat Completions schema; official openai SDKs work unchanged
EndpointsPOST /v1/chat/completions · GET /v1/models
Base URLhttps://api.nsfwllmrouter.com/v1
API keyAuthorization: Bearer YOUR_KEY
Model IDuncensored
Completion length16,000 tokens max; 2,048 if max_tokens is not set
Structured outputresponse_format: {"type": "json_object"}
SSE streamingYes — server-sent events; the last chunk carries token usage
Sampling parameterstemperature, top_p, stop, seed and the two penalties are passed through
Context window64,000 tokens (prompt + completion together)
Function callingSupported: tools + tool_choice, tool_calls in the reply (streamed too), tool results as role: tool messages
Response headersX-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests, X-RateLimit-Limit-Concurrency
Request size8 MB request body
Requests per minute300/min per key
Concurrency8 requests at the same time per key
Credit expiryno monthly fee; paid credit does not expire
Paymentcrypto: USDT on TRON or USDC on Base, $10–$500, any whole sum
Volume bonus+5% on $50+, +10% on $100+
Priceinput $0.25 / 1M tokens, output $1.00 / 1M tokens
Trial credit$0.50 of credit valid 7 days, no card needed
Billingpay as you go from prepaid credit; nothing is charged for failed or refused requests
Sign-insign in with Google or with e-mail + password
Keysone key per account, regenerate any time (the old one stops working)
Contentadult content allowed; sexual content involving minors is refused

HTTP errors

Every error is JSON with a type you can switch on. You are never charged for an error.

CodeTypeMeaning
400bad_requestmalformed request or too long for the context window
401missing_key · invalid_key · key_revokedno key, wrong key, or a key replaced by a newer one
402no_creditout of credit; add credit and retry
403content_blockedsexual content involving minors — refused, not billed
404not_foundunknown endpoint
413request_too_largebody over 8 MB
429rate_limited · concurrencyover 300/min or 8 parallel — back off and retry
503upstream_busytemporary overload, retry shortly

Questions and answers

Is this an OpenRouter reseller?

No, we are an independent service running our own uncensored model on our own GPU servers. We are not an official partner or reseller of OpenRouter, though our API is OpenAI-compatible. We do not route between other vendors' models.

What is the context window size?

The context window is 64,000 tokens, which includes both the input prompt and the output completion. This allows for long conversations or large document processing within a single request.

Do you support JSON mode?

The fact sheet does not explicitly list JSON mode as a distinct feature, though the model can output JSON if prompted correctly. For specific formatting guarantees, check the model's documentation or test with your use case. We focus on providing the uncensored text generation capability.

Your key is one form away

Create an account, copy the key, change the base URL. That is the whole setup.

Get API key