KO ▾
https://api.unrestrictedaiapi.com/v1uncensored2026-10-06
API 키 받기

Unrestricted AI API 시작하기: Python, JavaScript, Go, PHP, Ruby

Unrestricted AI API 사용에 SDK가 필요하지 않습니다. 일반 HTTP와 JSON을 사용하므로 HTTP 클라이언트가 있는 모든 언어에서 작동합니다. 이 페이지에서는 Python, JavaScript, Go, PHP, Ruby 각각에 대한 테스트된 요청 하나와 처리해야 할 상태 코드, 스크립트가 중단되지 않도록 하는 재시도 규칙을 제공합니다.

업데이트됨

주요 포인트

  1. 하나의 엔드포인트, 하나의 모델 ID(무검열), 하나의 Bearer 토큰: 모든 언어에서 동일한 요청 본문이 작동합니다.
  2. 명시적인 시간 제한을 설정하세요. 긴 생성은 대부분의 기본 클라이언트 시간 제한보다 오래 걸릴 수 있습니다.
  3. 파싱하기 전에 상태 코드를 확인하세요. 402 및 403 본문은 choices 배열 없이 유효한 JSON입니다.
  4. 429 및 503만 짧은 지수 백오프로 재시도하세요.

curl 하나로 API 전체

잠시 SDK는 잊으세요. 아래 예제는 모두 동일합니다: bearer token과 함께 POST /v1/chat/completions로 JSON body를 전송합니다. 이것이 가능하면 완료된 것입니다. 가입 페이지에서 키를 가져오고(무료 체험 크레딧에는 결제 정보가 필요 없음), API_KEY로 내보낸 후 이를 실행하세요.

curl https://api.unrestrictedaiapi.com/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [{"role": "user", "content": "Write a two-line noir opening set in a laundromat."}],
    "max_tokens": 120
  }'

응답은 OpenAI 스타일 객체입니다. 텍스트는 choices[0].message.content에 있으며, usage 블록은 호출 토큰 비용을 알려줍니다. 단일 모델 uncensored이므로 model 필드는 변경되지 않습니다. GET /v1/models로 확인할 수 있습니다.

curl https://api.unrestrictedaiapi.com/v1/models -H "Authorization: Bearer $API_KEY"

코드 작성 전 암기할 만한 두 가지 제한 사항: 프롬프트와 응답 간에 공유되는 컨텍스트 창은 100,000 토큰이며, max_tokens은 기본값이 2048입니다(32,000까지 높일 수 있음). 출력 문장이 중간에 끊긴다면, 이 기본값이 주된 원인입니다.

httpx로 Python

httpx는 합리적인 시간 제한을 가진 동기식 클라이언트와 필요할 때 비동기 쌍을 제공합니다. 시간 제한을 명시적으로 설정하세요. 긴 생성은 시간이 오래 걸릴 수 있으며 기본 5초 제한은 이를 차단합니다.

import os
import httpx

resp = httpx.post(
    "https://api.unrestrictedaiapi.com/v1/chat/completions",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    json={
        "model": "uncensored",
        "messages": [
            {"role": "system", "content": "You are a blunt, vivid fiction writer."},
            {"role": "user", "content": "Pitch a heist where the vault is a night market."},
        ],
        "temperature": 0.9,
        "max_tokens": 300,
    },
    timeout=60.0,
)
resp.raise_for_status()
print(resp.json()["choices"][0]["message"]["content"])

raise_for_status()은 4xx 또는 5xx를 예외로 변환하며 스크립트에는 적합합니다. 장기 실행 작업의 경우 호출을 감싸서 두 가지 상태 코드가 재시도할 수 있도록 하세요: 429(분당 300개 요청의 키별 한도에 도달함) 및 503(upstream_busy, 몇 초 후 해결됨). 401, 402, 403을 포함한 나머지는 재시도 시 자동으로 해결되지 않습니다.

import os
import time
import httpx

def chat(messages, retries=3):
    for attempt in range(retries + 1):
        r = httpx.post(
            "https://api.unrestrictedaiapi.com/v1/chat/completions",
            headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
            json={"model": "uncensored", "messages": messages, "max_tokens": 400},
            timeout=60.0,
        )
        if r.status_code in (429, 503) and attempt < retries:
            time.sleep(2 ** attempt)
            continue
        r.raise_for_status()
        return r.json()["choices"][0]["message"]["content"]

print(chat([{"role": "user", "content": "Name five cursed objects found in a thrift store."}]))

httpx.post를 httpx.AsyncClient().post로 바꾸고 async def 안에 넣으면 동일한 페이로드의 비동기 버전을 얻습니다.

fetch로 JavaScript

Node 18 이상에는 fetch이 포함되어 있으므로 설치할 것이 없습니다. 파일을 .mjs로 저장하거나(또는 "type": "module" 설정) 최상위 await이 작동하도록 하세요. 브라우저에도 동일한 API가 있지만 키를 프론트엔드 코드에 넣지 마세요. 호출을 자체 백엔드를 통해 프록시 처리하세요.

const res = await fetch("https://api.unrestrictedaiapi.com/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "uncensored",
    messages: [{ role: "user", content: "Describe a villain's morning routine in four bullets." }],
    max_tokens: 250,
  }),
});

if (!res.ok) {
  const err = await res.json().catch(() => ({}));
  throw new Error(`HTTP ${res.status}: ${err?.error?.message ?? "unknown error"}`);
}

const data = await res.json();
console.log(data.choices[0].message.content);

확인 순서에 주목하세요. fetch는 네트워크 실패 시에만 거부하므로 402 또는 403은 일반 응답으로 도착합니다. res.ok을 직접 테스트하고 오류 JSON을 읽으세요. 이 JSON은 항상 {"error":{"code":...,"message":...}} 형태를 가집니다.

net/http로 Go

Go는 더 많은 줄이 필요하지만 종속성은 필요하지 않습니다. 읽는 구조체 필드만 정의하세요. encoding/json은 나머지를 무시합니다. 상태 코드를 확인하기 전에 본문을 바이트로 읽으면 오류 발생 시 서버 오류 메시지를 인쇄할 수 있습니다.

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
)

type reply struct {
	Choices []struct {
		Message struct {
			Content string `json:"content"`
		} `json:"message"`
	} `json:"choices"`
}

func main() {
	payload, _ := json.Marshal(map[string]any{
		"model": "uncensored",
		"messages": []map[string]string{
			{"role": "user", "content": "Give me a ghost story in exactly three sentences."},
		},
		"max_tokens": 200,
	})

	req, _ := http.NewRequest("POST", "https://api.unrestrictedaiapi.com/v1/chat/completions", bytes.NewReader(payload))
	req.Header.Set("Authorization", "Bearer "+os.Getenv("API_KEY"))
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	if resp.StatusCode != http.StatusOK {
		panic(fmt.Sprintf("HTTP %d: %s", resp.StatusCode, body))
	}

	var out reply
	if err := json.Unmarshal(body, &out); err != nil {
		panic(err)
	}
	fmt.Println(out.Choices[0].Message.Content)
}

프로덕션에서는 http.Client{Timeout: 60 * time.Second}를 빌드하고 재사용하세요. 기본 클라이언트에는 시간 제한이 없으므로, 걸린 요청이 걸린 고루틴이 됩니다.

cURL로 PHP 및 Net::HTTP로 Ruby

PHP의 cURL 확장은 대부분의 호스트에 이미 있습니다. json_encode로 본문을 빌드하고, 전송을 문자열로 반환한 다음 curl_getinfo로 상태를 읽으세요. 상태 확인을 건너뛰는 것은 고전적인 실수입니다. 402 본문은 JSON로 성공적으로 디코딩되지만 코드에서 누락된 choices 키로 실패합니다.

<?php
$payload = json_encode([
    "model" => "uncensored",
    "messages" => [
        ["role" => "user", "content" => "Write a villanelle opening about a broken vending machine."],
    ],
    "max_tokens" => 200,
]);

$ch = curl_init("https://api.unrestrictedaiapi.com/v1/chat/completions");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 60,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer " . getenv("API_KEY"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => $payload,
]);

$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($body === false || $status !== 200) {
    fwrite(STDERR, "HTTP $status: $body\n");
    exit(1);
}

$data = json_decode($body, true);
echo $data["choices"][0]["message"]["content"], "\n";

낮은 max_execution_time을 가진 공유 호스트에서는 max_tokens을 적절히 유지하거나 호출을 큐 작업자로 이동하세요.

여기에도 표준 라이브러리로 충분합니다. ENV.fetch은 변수가 누락되면 즉시 오류를 발생시키며, 이는 빈 Bearer 토큰을 보내고 10분 동안 401 오류를 디버깅하는 것보다 낫습니다.

require "net/http"
require "json"
require "uri"

uri = URI("https://api.unrestrictedaiapi.com/v1/chat/completions")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch('API_KEY')}"
req["Content-Type"] = "application/json"
req.body = JSON.generate(
  model: "uncensored",
  messages: [{ role: "user", content: "Invent a tavern rumor that sounds too specific to be fake." }],
  max_tokens: 200
)

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true, read_timeout: 60) { |http| http.request(req) }
abort("HTTP #{res.code}: #{res.body}") unless res.is_a?(Net::HTTPSuccess)

puts JSON.parse(res.body).dig("choices", 0, "message", "content")

나중에 Rails로 이동하면 동일한 본문이 백그라운드 작업에서 작동합니다. 요청 주기에서 호출을 유지하세요. 생성은 데이터베이스 쿼리보다 느립니다.

두 코드 조각 모두 Python이 보내는 것과 정확히 동일한 본문을 보냅니다. 이것이 핵심입니다. 한 언어가 작동하고 다른 언어가 작동하지 않으면 클라이언트가 아닌 JSON을 비교하세요. 원본 요청 본문을 한 번 인쇄하고 바이트 단위로 비교하세요. 아홉 번 중 아홉 번의 원인은 누락된 Content-Type 헤더나 대문자로 입력된 모델 이름입니다.

라이브러리 없이 스트리밍

스트리밍은 일반 HTTP가 조금 더 요구하는 유일한 장소입니다. stream: true로 서버는 서버 전송 이벤트로 응답합니다: 각 줄은 data: 로 시작하고 JSON 청크를 운반하며, 스트림은 data: [DONE]로 끝납니다. 최종 사용 청크는 자동으로 추가되므로 스트리밍 중에도 토큰 카운트를 얻을 수 있습니다. 이 청크에는 choices 항목이 없으므로 아래 루프는 인덱싱 전에 확인합니다.

import json
import os
import httpx

body = {
    "model": "uncensored",
    "messages": [{"role": "user", "content": "Tell a campfire story about a lighthouse keeper."}],
    "stream": True,
    "max_tokens": 400,
}
headers = {"Authorization": f"Bearer {os.environ['API_KEY']}"}

with httpx.stream("POST", "https://api.unrestrictedaiapi.com/v1/chat/completions",
                  headers=headers, json=body, timeout=60.0) as r:
    r.raise_for_status()
    for line in r.iter_lines():
        if not line.startswith("data: "):
            continue
        data = line[6:]
        if data == "[DONE]":
            break
        chunk = json.loads(data)
        if chunk.get("choices"):
            print(chunk["choices"][0]["delta"].get("content") or "", end="", flush=True)
print()

동일한 패턴이 직접 적용됩니다. JavaScript에서는 res.body을 리더로 읽고 줄바꿈 기준으로 분할하세요. Go에서는 resp.Body를 bufio.Scanner로 감싸세요. Ruby에서는 http.request에 블록을 전달하고 read_body를 사용하세요. PHP에서는 CURLOPT_WRITEFUNCTION 콜백을 설정하세요. 로직은 변하지 않습니다: 접두어를 제거하고, 신호에 도달하면 중단하고, JSON을 파싱하고, 차이를 출력합니다.

5분 연소 테스트 및 예산 확인

이 코드 조각 중 하나를 빌드하기 전에 빠른 검사를 실행하세요. 먼저 키로 /v1/models을 호출하세요. 200은 키와 네트워크 경로를 증명합니다. 둘째, max_tokens을 20으로 설정하여 가능한 가장 작은 채팅 요청을 보내세요. 셋째, 빈 Bearer 토큰과 같은 의도적인 오류를 발생시키고 누락된 필드로 인해 충돌하는 대신 401이 명확하게 표시되는지 확인하세요.

그런 다음 한 번 계산하여 놀라움을 방지하세요. 가격은 입력 토큰 100만 개당 $0.25, 출력 토큰 100만 개당 $1.00입니다. 예시를 위한 가정으로, 요청이 600 프롬프트 토큰을 전송하고 400 토큰을 받는다고 가정해 봅시다. 이는 600 x $0.25 / 1,000,000 = $0.00015 입력, 400 x $1.00 / 1,000,000 = $0.0004 출력이며, 호출당 약 $0.00055입니다. $0.50의 무료 체험 크레딧은 이 크기의 약 900회 호출을 커버할 수 있습니다. 실제 프롬프트는 다르므로, 몇 가지 응답의 usage 블록을 읽고 거기서부터 곱하세요.

무료 체험 크레딧은 7일 동안 유효하며 결제 정보가 필요 없으므로, 다섯 가지 언어 모두 테스트하기에 충분합니다. 목표로 할 사용 사례가 있다면 NSFW 콘텐츠 가이드에 완전한 예시가 있습니다. 하나의 키는 하나의 계정에 속한다는 것을 기억하세요. 키를 재생성하면 이전 키는 즉시 작동하지 않으므로 모든 스크립트를 동시에 업데이트해야 합니다.

모든 언어에서 동일해 보이는 오류

API가 일반 HTTP이므로 실패 처리는 선택한 언어에 따라 동일합니다. 이 표를 암기하면 위의 모든 코드 조각을 포트할 수 있습니다.

상태의미조치
400잘못된 요청, 예: 프롬프트 plus max_tokens이 100k를 초과함프롬프트를 줄이거나 max_tokens을 낮추세요
401누락되거나 유효하지 않은 키API_KEY을 확인하세요. 키를 재생성하면 기존 키는 즉시 무효화됩니다.
402no_credit: 잔액이 소진되었거나 무료 체험 크레딧이 만료되었습니다.선불 크레딧을 충전하세요.
403content_blocked재시도하지 마세요. 미성년자가 포함된 성적인 콘텐츠는 항상 차단됩니다.
429분당 300개 이상의 요청잠시 후 재시도하세요.
503upstream_busy몇 초 후 재시도하세요.

기본 사항이 작동하면 토큰별 출력을 위해 stream: true을 설정하고 서버 전송 이벤트를 줄별로 읽으세요. 프롬프팅 가이드로 더 나은 프롬프트를 작성하거나, 봇 안내서를 사용하여 채팅 플랫폼에 동일한 호출을 연결하세요. 요금은 가격 페이지에서 확인할 수 있습니다.

질문과 답변

이 API를 호출하려면 OpenAI SDK가 필요합니까?

아니요. 여기의 예제는 각 언어의 표준 HTTP 도구만 사용합니다. Base URL을 https://api.unrestrictedaiapi.com/v1.으로 설정하면 OpenAI SDK도 사용할 수 있습니다.

어떤 모델 ID를 보내야 합니까?

항상 "uncensored"입니다. 단일 모델만 제공되며, GET /v1/models 엔드포인트에서 이를 확인할 수 있습니다.

왜 응답이 문장 중간에 중단되었습니까?

기본 max_tokens는 2048입니다. 요청별로 높일 수 있으며, 프롬프트와 완성의 합계가 100,000-토큰 컨텍스트 창 내에 있는 한 최대 32,000까지 설정할 수 있습니다.

어떤 오류에 대해 코드가 재시도해야 합니까?

짧은 지연 후 429(속도 제한) 및 503(upstream_busy)을 재시도하세요. 400, 401, 402 및 403은 사용자 측의 변경이 필요하므로 재시도하면 호출이 낭비됩니다.

키는 양식 하나만 작성하면 받을 수 있습니다

계정을 생성하고 키를 복사한 후 Base URL을 변경하세요. 이것이 전체 설정입니다.

API 키 받기