-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocs.html
More file actions
239 lines (219 loc) · 13 KB
/
Copy pathdocs.html
File metadata and controls
239 lines (219 loc) · 13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Getting Started — Stormfire Docs (OpenAI-compatible, 5-minute setup)</title>
<meta name="description" content="Start using Stormfire in 5 minutes. Get your API key, point any OpenAI-compatible tool at https://api.stormfire.io/v1, and call gpt-4o, claude-3-5-sonnet, deepseek-chat, gemini and more with your free $5 signup credit. Works with Cursor, NextChat, ChatBox, and the OpenAI SDK in every language." />
<link rel="canonical" href="https://stormfire.io/docs" />
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; max-width: 880px; margin: 0 auto; padding: 24px 20px 64px; color: #1a1a1a; line-height: 1.65; background: #fefefe; }
h1 { font-size: 2.1rem; line-height: 1.25; margin-top: 8px; }
h2 { font-size: 1.5rem; margin-top: 2.2em; border-bottom: 1px solid #eee; padding-bottom: 6px; }
h3 { font-size: 1.15rem; margin-top: 1.6em; }
p, li { font-size: 1rem; }
ul, ol { padding-left: 22px; }
table { border-collapse: collapse; width: 100%; margin: 16px 0; font-size: 0.94rem; }
th, td { border: 1px solid #ddd; padding: 8px 10px; text-align: left; vertical-align: top; }
th { background: #f5f5f5; }
code { background: #f4f4f4; padding: 1px 5px; border-radius: 3px; font-size: 0.92em; }
pre { background: #1e1e1e; color: #f8f8f2; padding: 14px; border-radius: 6px; overflow-x: auto; font-size: 0.88rem; }
pre code { background: none; color: inherit; padding: 0; }
.tagline { font-size: 1.15rem; color: #444; }
.cta { display: inline-block; background: #ff5500; color: #fff; padding: 10px 18px; border-radius: 5px; text-decoration: none; margin: 12px 8px 12px 0; font-weight: 600; }
.cta.secondary { background: #fff; color: #ff5500; border: 1px solid #ff5500; }
nav.top { font-size: 0.92rem; margin-bottom: 12px; color: #666; }
nav.top a { color: #ff5500; text-decoration: none; margin-right: 14px; }
footer { margin-top: 60px; padding-top: 20px; border-top: 1px solid #ddd; font-size: 0.9rem; color: #666; }
footer a { color: #ff5500; text-decoration: none; margin-right: 14px; }
.badges span { display: inline-block; background: #fff3e8; color: #b04400; padding: 3px 10px; border-radius: 12px; margin-right: 6px; font-size: 0.85rem; }
.step { background: #fafafa; border: 1px solid #eee; border-left: 3px solid #ff5500; border-radius: 5px; padding: 4px 18px; margin: 14px 0; }
.note { background: #fff8f0; border: 1px solid #ffe0c2; border-radius: 5px; padding: 10px 14px; margin: 16px 0; font-size: 0.95rem; }
/* First-visit welcome modal */
.sf-modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.55); display: none; align-items: center; justify-content: center; z-index: 9999; padding: 16px; }
.sf-modal-overlay.show { display: flex; }
.sf-modal { background: #fff; max-width: 440px; width: 100%; border-radius: 12px; padding: 26px 26px 22px; box-shadow: 0 20px 60px rgba(0,0,0,0.3); position: relative; animation: sfpop .18s ease-out; }
@keyframes sfpop { from { transform: translateY(12px); opacity: 0 } to { transform: translateY(0); opacity: 1 } }
.sf-modal h2 { margin: 0 0 4px; font-size: 1.35rem; border: none; padding: 0; }
.sf-modal .sub { color: #666; font-size: 0.95rem; margin: 0 0 16px; }
.sf-modal ol { padding-left: 20px; margin: 0 0 14px; }
.sf-modal li { margin: 7px 0; font-size: 0.97rem; }
.sf-modal .url { background: #f4f4f4; padding: 1px 6px; border-radius: 3px; font-family: monospace; font-size: 0.88em; }
.sf-modal .actions { display: flex; gap: 10px; margin-top: 6px; flex-wrap: wrap; }
.sf-modal .actions a, .sf-modal .actions button { flex: 1; min-width: 130px; text-align: center; padding: 10px 14px; border-radius: 6px; font-weight: 600; font-size: 0.95rem; cursor: pointer; border: none; text-decoration: none; }
.sf-modal .primary { background: #ff5500; color: #fff; }
.sf-modal .ghost { background: #fff; color: #ff5500; border: 1px solid #ff5500; }
.sf-modal .close { position: absolute; top: 12px; right: 14px; background: none; border: none; font-size: 1.5rem; color: #999; cursor: pointer; line-height: 1; padding: 0; }
</style>
</head>
<body>
<div class="sf-modal-overlay" id="sfWelcome">
<div class="sf-modal" role="dialog" aria-modal="true" aria-labelledby="sfWelcomeTitle">
<button class="close" id="sfClose" aria-label="Close">×</button>
<h2 id="sfWelcomeTitle">Welcome to Stormfire 👋</h2>
<p class="sub">Your first <strong>$5 is free</strong>. Here's the whole setup in 3 steps:</p>
<ol>
<li><strong>Sign up</strong> & claim your free $5 credit.</li>
<li><strong>Create an API key</strong> in your dashboard.</li>
<li>Set base URL <span class="url">https://api.stormfire.io/v1</span> and call <span class="url">gpt-4o</span>, <span class="url">claude-3-5-sonnet</span>, <span class="url">deepseek-chat</span> — no code changes.</li>
</ol>
<div class="actions">
<a class="primary" href="https://stormfire.io/register">Get my API key</a>
<button class="ghost" id="sfStart">Read the guide</button>
</div>
</div>
</div>
<script>
(function(){
try {
var KEY = 'sf_docs_welcome_seen';
var seen = localStorage.getItem(KEY);
var ov = document.getElementById('sfWelcome');
if (!seen) { ov.classList.add('show'); }
function dismiss(){ ov.classList.remove('show'); try{ localStorage.setItem(KEY,'1'); }catch(e){} }
document.getElementById('sfClose').addEventListener('click', dismiss);
document.getElementById('sfStart').addEventListener('click', dismiss);
ov.addEventListener('click', function(e){ if(e.target===ov) dismiss(); });
document.addEventListener('keydown', function(e){ if(e.key==='Escape') dismiss(); });
} catch(e){}
})();
</script>
<nav class="top">
<a href="/">Stormfire</a>
<a href="/pricing">Pricing</a>
<a href="/vs/openrouter">vs OpenRouter</a>
<a href="/pay-ai-api-with-crypto">Pay with Crypto</a>
<a href="/faq">FAQ</a>
<a href="/docs">Docs</a>
</nav>
<header>
<h1>Getting started with Stormfire</h1>
<p class="tagline">One OpenAI-compatible key for GPT, Claude, Gemini, DeepSeek and 30+ more models. From sign-up to your first response in about five minutes — and your first <strong>$5 is on us</strong>.</p>
<div class="badges"><span>Free $5 signup credit</span><span>OpenAI SDK drop-in</span><span>No KYC</span><span>USDT top-up</span></div>
<p>
<a class="cta" href="https://stormfire.io/register">Create your account</a>
<a class="cta secondary" href="/pricing">See pricing</a>
</p>
</header>
<section>
<h2>The 3-step setup</h2>
<div class="step">
<h3>1. Sign up and claim your free $5</h3>
<p>Register with an email at <a href="https://stormfire.io/register">stormfire.io/register</a>. Early adopters get <strong>$5 in free credit</strong> applied automatically — no top-up required to start testing.</p>
</div>
<div class="step">
<h3>2. Create an API key</h3>
<p>Open your dashboard, go to <strong>API Keys / Tokens</strong>, and click <strong>Create</strong>. Copy the key — it looks like <code>sk-xxxxxxxx</code>. Treat it like a password.</p>
</div>
<div class="step">
<h3>3. Point your tool at Stormfire</h3>
<p>Set two values in any OpenAI-compatible app or SDK:</p>
<ul>
<li><strong>Base URL:</strong> <code>https://api.stormfire.io/v1</code></li>
<li><strong>API Key:</strong> your <code>sk-...</code> key</li>
</ul>
<p>Then call any model by its standard name — <code>gpt-4o</code>, <code>claude-3-5-sonnet</code>, <code>deepseek-chat</code>, <code>gemini-1.5-pro</code>. That's it.</p>
</div>
<div class="note"><strong>Good news:</strong> you don't need to learn any custom model names. Stormfire accepts the same model IDs you already use with OpenAI, Anthropic, Google and DeepSeek, so most tools work with zero code changes.</div>
</section>
<section>
<h2>Quick test with curl</h2>
<p>Paste this into a terminal (swap in your key) to confirm everything works:</p>
<pre><code>curl https://api.stormfire.io/v1/chat/completions \
-H "Authorization: Bearer sk-YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Say hello in three words"}]
}'</code></pre>
<p>A JSON response with a <code>choices</code> array means you're live.</p>
</section>
<section>
<h2>Use it from the OpenAI SDK</h2>
<h3>Python</h3>
<pre><code>from openai import OpenAI
client = OpenAI(
api_key="sk-YOUR_KEY",
base_url="https://api.stormfire.io/v1",
)
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello!"}],
)
print(resp.choices[0].message.content)</code></pre>
<h3>Node.js</h3>
<pre><code>import OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk-YOUR_KEY",
baseURL: "https://api.stormfire.io/v1",
});
const resp = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(resp.choices[0].message.content);</code></pre>
<h3>Environment variables</h3>
<p>If your code already reads the standard OpenAI env vars, just set them — no code change needed:</p>
<pre><code>export OPENAI_API_KEY="sk-YOUR_KEY"
export OPENAI_BASE_URL="https://api.stormfire.io/v1"</code></pre>
</section>
<section>
<h2>Popular apps — where to paste the settings</h2>
<table>
<thead><tr><th>App</th><th>Where</th><th>What to enter</th></tr></thead>
<tbody>
<tr><td><strong>Cursor</strong></td><td>Settings → Models → OpenAI API Key → "Override Base URL"</td><td>Key + <code>https://api.stormfire.io/v1</code>, then add model <code>gpt-4o</code></td></tr>
<tr><td><strong>ChatBox</strong></td><td>Settings → Model Provider → OpenAI API</td><td>API Host <code>https://api.stormfire.io/v1</code> + your key</td></tr>
<tr><td><strong>NextChat</strong></td><td>Settings → Custom Endpoint</td><td>Endpoint <code>https://api.stormfire.io</code> + key</td></tr>
<tr><td><strong>Open WebUI</strong></td><td>Admin → Connections → OpenAI API</td><td>Base URL <code>https://api.stormfire.io/v1</code> + key</td></tr>
<tr><td><strong>LangChain / LlamaIndex</strong></td><td>OpenAI client config</td><td><code>base_url</code> + <code>api_key</code> as above</td></tr>
</tbody>
</table>
<div class="note">Rule of thumb: anywhere a tool asks for an "OpenAI API key" and lets you override the base URL or host, Stormfire drops right in.</div>
</section>
<section>
<h2>Which models can I call?</h2>
<p>Use the standard IDs below. You can also use Stormfire's <code>wf-</code> tier names (see <a href="/pricing">pricing</a>) if you prefer to pin a specific service tier.</p>
<table>
<thead><tr><th>Family</th><th>Standard model IDs you can call</th></tr></thead>
<tbody>
<tr><td>OpenAI GPT</td><td><code>gpt-4o</code>, <code>gpt-4o-mini</code>, <code>gpt-4-turbo</code>, <code>gpt-4</code>, <code>gpt-4.1</code>, <code>gpt-4.1-mini</code>, <code>gpt-3.5-turbo</code>, <code>o1</code>, <code>o1-mini</code></td></tr>
<tr><td>Anthropic Claude</td><td><code>claude-3-5-sonnet</code>, <code>claude-3-7-sonnet</code>, <code>claude-3-5-haiku</code>, <code>claude-3-opus</code>, <code>claude-sonnet-4</code>, <code>claude-opus-4</code></td></tr>
<tr><td>Google Gemini</td><td><code>gemini-1.5-pro</code>, <code>gemini-1.5-flash</code>, <code>gemini-2.0-flash</code>, <code>gemini-2.5-pro</code></td></tr>
<tr><td>DeepSeek</td><td><code>deepseek-chat</code>, <code>deepseek-reasoner</code></td></tr>
</tbody>
</table>
<p>Call <code>GET https://api.stormfire.io/v1/models</code> with your key for the full live list.</p>
</section>
<section>
<h2>Topping up with USDT</h2>
<p>When your free credit runs low, add funds with USDT on TRC20, ERC20, BEP20, or Polygon. Minimum top-up is $15, there's no KYC, and you're billed at pass-through rates — 0% platform markup. See <a href="/pay-ai-api-with-crypto">how crypto top-up works</a>.</p>
</section>
<section>
<h2>Troubleshooting</h2>
<h3><code>model_not_found</code> / "no available channel"</h3>
<p>Check the model ID spelling against the table above, and confirm your Base URL ends in <code>/v1</code>. Calling <code>GET /v1/models</code> shows exactly what your key can access.</p>
<h3><code>401 Unauthorized</code></h3>
<p>The key is wrong or was revoked. Generate a fresh key in the dashboard and make sure it's sent as <code>Authorization: Bearer sk-...</code>.</p>
<h3><code>insufficient quota</code></h3>
<p>Your balance hit zero. Top up with USDT, then retry.</p>
<h3>Still stuck?</h3>
<p>Ask in our <a href="https://discord.gg/stormfire">Discord</a> or check the <a href="/faq">FAQ</a>.</p>
</section>
<footer>
<p>
<a href="/">Home</a>
<a href="/pricing">Pricing</a>
<a href="/vs/openrouter">vs OpenRouter</a>
<a href="/pay-ai-api-with-crypto">Pay with Crypto</a>
<a href="/openai-alternative">OpenAI Alternatives</a>
<a href="/faq">FAQ</a>
<a href="/docs">Docs</a>
<a href="https://github.com/stormfire-io">GitHub</a>
<a href="https://twitter.com/stormfire_io">Twitter</a>
<a href="https://discord.gg/stormfire">Discord</a>
</p>
<p>© 2026 Stormfire. Tokyo. Built by developers who got tired of paying 5.5% to use their own crypto.</p>
</footer>
</body>
</html>