OpenRouter API: Base URL, API Key, Free Models and Pricing, Plus a Twitter (X) Agent That Swaps Models
![Diagram of an X agent built on the OpenRouter API. Box 1, X data: api.twitterapi.io /twitter/tweet/advanced_search with the X-API-Key header at $0.15 per 1,000 tweets. Arrow labeled tweets[] to box 2, your agent: batch 50 tweets, build a prompt, model from an environment variable, a models array of fallbacks, log usage.cost. Arrow labeled chat request to box 3, OpenRouter: openrouter.ai/api/v1, Bearer sk-or key, 5.5% fee on credit buys. OpenRouter fans out to six model groups: anthropic/claude, openai/gpt, google/gemini, deepseek, x-ai/grok and :free variants. Footer: catalog snapshot collected in 2026 with 452 model IDs, 14 ending in :free; free variants 20 requests per minute and 50 or 1,000 requests per day; sample of 899 public posts about OpenRouter plus 200 @OpenRouter posts.](/blog/openrouter-api/hero.png)
This guide is about OpenRouter's own API: the router that puts one key and one base URL in front of models from Anthropic, OpenAI, Google, DeepSeek, xAI and many smaller labs. If you want a key straight from one lab instead, our Grok API key guide covers xAI's console, and the OpenAI Agents SDK guide covers building on OpenAI directly; this page is for people who want to switch models without switching SDKs, keys or billing accounts.
Most results for "openrouter api" are OpenRouter's own docs and a handful of quick-start posts. They answer "how do I make the first call" well, and leave three questions mostly open: what the free tier really allows in a working day, what the 5.5% fee does to a real bill, and how much of an agent's cost is the model versus the data it reads. We answer those with numbers: the limits and fees quoted from OpenRouter's docs and pricing page as read this session, a pull of OpenRouter's public model catalog, and a real-data study of 1,099 X posts (899 public posts that mention OpenRouter plus 200 posts from the official @OpenRouter account), collected in 2026.
The worked example is an X research agent: it pulls recent tweets from TwitterAPI.io, batches them, and sends one OpenAI-style request to OpenRouter with a primary model and two fallbacks, logging the model that answered and the cost OpenRouter reports in the response.
What OpenRouter is (and what the API actually exposes)
OpenRouter describes itself in its FAQ as "a unified API to access all the major LLM models on the market" that also aggregates billing and usage analytics in one place. Practically, that means three things for a developer: one account and one balance, one API key format (sk-or-...), and one request schema. The API reference says OpenRouter "normalizes the schema across models and providers" and supports two request shapes, the Responses API (POST {base}/responses) and Chat Completions (POST {base}/chat/completions), where {base} is https://openrouter.ai/api/v1.
Each model has a string ID of the form <lab>/<model>, for example anthropic/claude-haiku-5.5 or deepseek/deepseek-v4.1-flash. Suffixes change behavior: the FAQ calls them variants, and :free is the one most people search for, a separate catalog entry with its own price (zero), context length and limits. A few IDs are routers rather than models: openrouter/auto picks a model for your prompt based on what OpenRouter users spend on for that kind of task, and openrouter/free picks a free model for you.
Behind each model ID there can be several providers serving the same weights. OpenRouter's docs say it pools their uptime and retries other providers for the same model when one is rate limiting or at capacity, before an error reaches you. That provider-level failover is automatic; model-level failover (try a different model) is something you opt into with the models array, covered below.
How big is the catalog? It depends on which surface you read. OpenRouter's pricing page advertises 600+ models and 25+ free models; the @OpenRouter bio on X said "400+ models (incl. 50+ free)" when we collected; and the public catalog endpoint (GET {base}/models, no key needed), pulled once in 2026, returned 452 model IDs, 14 of them ending in :free (plus the openrouter/free router and two zero-priced preview models). Treat any count, ours included, as a snapshot and query the catalog in code before you hard-code a model ID.
OpenRouter base URL, API key and your first call
The base URL is https://openrouter.ai/api/v1. The authentication docs say: if you call the API directly, set the Authorization header to a Bearer token with your key; if you use the OpenAI SDK, point its base URL at https://openrouter.ai/api/v1 and pass the OpenRouter key as the API key. Two optional headers, HTTP-Referer and X-OpenRouter-Title, identify your app for OpenRouter's public rankings; requests work without them. Business and Enterprise accounts that need EU in-region processing use https://eu.openrouter.ai/api/v1 instead.
The three requests below are the fastest way to check a new key: what the key is allowed to spend (and its free-model daily counter), what the catalog currently contains (no key needed), and one chat completion through the free router.
Responses API or Chat Completions? Both work. OpenRouter's newer docs lead with the Responses API, but Chat Completions is the shape most existing code, agent frameworks and the OpenAI SDK's chat.completions.create already speak, so the X agent in this guide uses it. Usage accounting is returned on both without extra parameters; the docs mark the old usage: {include: true} flag on Chat Completions as deprecated and without effect.
Getting the key. Create the key at openrouter.ai/keys after signing in. The authentication docs say you give it a name and a credit limit (or no limit); once a key has used its limit, requests with it are rejected until you raise the limit or, for a daily, weekly or monthly limit, until it resets. Keys created for you during onboarding get a $100 credit limit and expire after 180 days, so a key that suddenly stops working months later may simply have expired.
Use one key per app. Per-key credit limits are the simplest insurance an agent can have: an X digest bot that should spend a few dollars a month gets a key with a small monthly cap, so a runaway loop returns a 403 budget error instead of draining the account. GET {base}/key reports limit, limit_remaining and the budgets that apply, so a long job can check before it starts.
Leaked keys. OpenRouter's docs say it is a GitHub secret scanning partner and emails you when it determines a key was exposed; the fix is to delete the key at openrouter.ai/settings/keys and create a new one. Keep keys in environment variables, never in a repository, and never in client-side JavaScript.
Bring your own key (BYOK). You can also attach your own provider keys and still use OpenRouter's single interface. The FAQ says pay-as-you-go accounts get $25,000 a month of list-price inference through BYOK with no fee, then 5% of what the same model would cost on OpenRouter, deducted from your OpenRouter credits.
OR=https://openrouter.ai/api/v1 # base URL
# 1) What does this key allow? (credit limit, free-model daily counter)
curl "$OR/key" \
-H "Authorization: Bearer $OPENROUTER_API_KEY"
# 2) Public model catalog: IDs, per-token prices, context length (no key needed)
curl "$OR/models" | python3 -c "import json,sys; d=json.load(sys.stdin)['data']; print(len(d), sum(m['id'].endswith(':free') for m in d))"
# 3) First chat completion
curl "$OR/chat/completions" \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "openrouter/free", "messages": [{"role": "user", "content": "Say hi in five words."}]}' OpenRouter free models and their usage limits
Free models are catalog entries whose ID ends in :free. OpenRouter's limits page sets the rules, and they depend only on how many credits you have ever purchased:
The limits page adds that the higher daily ceiling is granted from one credit below the threshold (currently 9 credits) to absorb rounding and top-up fees, that the free_model_daily_requests field of GET {base}/key reports the daily counter, and that the per-minute limit is not reported there. A negative balance can return 402 even on free models; topping up above zero clears it. The FAQ is blunt about the use case: free models "have low rate limits" and "are usually not suitable for production use".
What that means for an X agent. With 50 tweets per request (the batch size we priced below), 50 requests a day is about 2,500 tweets summarized per day; after a 10-credit purchase, 1,000 requests a day is about 50,000. The per-minute cap of 20 is what bites first in a bursty job, so space calls about three seconds apart or back off on 429 as in the snippet below.
The free list moves. In our 2026 catalog pull, the 14 :free IDs were dominated by NVIDIA Nemotron variants (five) and Google Gemma 4 (two), with context windows from 65,536 tokens up to about 1M. Free entries come and go with lab promotions, which is one more reason to keep the model ID in configuration and add openrouter/free as a last fallback. The fallback docs warn that if a :free model is followed by a paid model in models and the request falls through, you are billed at the paid price; to keep a request free, list only :free models.
import os, time, requests
OR_KEY = os.environ["OPENROUTER_API_KEY"]
OR_BASE = "https://openrouter.ai/api/v1"
def call_free(messages, model="openrouter/free", retries=4):
"""Stay inside :free limits: 20 requests/min, 50 or 1,000 requests/day."""
for attempt in range(retries):
r = requests.post(
f"{OR_BASE}/chat/completions",
headers={"Authorization": f"Bearer {OR_KEY}"},
json={"model": model, "messages": messages},
timeout=120,
)
if r.status_code == 429:
wait = float(r.headers.get("Retry-After", 2 ** attempt * 3))
time.sleep(wait) # per-minute cap: back off, then retry
continue
if r.status_code == 402:
raise SystemExit("402: balance below zero or key credit limit hit")
r.raise_for_status()
return r.json()
raise SystemExit("still rate-limited: daily free cap likely reached, try tomorrow or use a paid ID")OpenRouter pricing: pass-through tokens, a fee on credits
OpenRouter bills in prepaid credits denominated in US dollars. The FAQ says each model's price is shown per million tokens, usually different for prompt and completion tokens, that some models also charge per request, per image or for reasoning tokens, and that OpenRouter deducts the cost from your credits using the token counts the provider reports. The headline rule is: "there is no markup on inference pricing", but there is a fee when you buy credits.
What the fee does to a real bill. The fee is charged on top-up, not per request, so its effect is a flat 5.5% on whatever you spend on paid models, with an $0.80 floor that makes very small top-ups relatively expensive: a $5 top-up pays the $0.80 minimum (16%), while the 5.5% rate takes over from about $14.55. In the cost table below we multiply model spend by 1.055 to show the effective price.
Plans. The pricing page lists Free (25+ free models, 50 requests a day, no platform fee because nothing is bought), Standard pay-as-you-go (5.5%, rate limits passed through from providers, budgets and prompt caching included), Business pay-as-you-go (8%, adds EU and US in-region routing, workload identity federation and up to 1,000 workspaces) and Enterprise (custom fees, SSO/SAML, contractual SLAs, invoicing).
Reading the real cost of each call. Every response carries a usage object with token counts measured by the model's own tokenizer and a cost in credits, plus cost_details.upstream_inference_cost with what the upstream provider charged. Logging usage.cost per call is the simplest way to reconcile an agent's bill without a second API request.
Model fallbacks, routing and the 402/429 errors you will meet
Set model to your first choice and pass models as an ordered list of fallbacks. OpenRouter's fallback docs say the next model is tried when the current one's providers are down, rate-limited or refuse to reply due to content moderation, and that the request is priced at the model that ultimately answered, returned in the response's model field. With the OpenAI SDK the list goes in extra_body, as in the snippet below.
The three limit families. OpenRouter's limits page separates them by status code. 402 is credits: account balance, a per-key credit cap, or the in-flight spending budget, a temporary hold on the estimated cost of paid requests that are still running, which can reject a request on smaller or newer prepaid accounts even with a positive balance (the error's metadata.limit_source says which, and a Retry-After header appears when waiting helps). 403 is a budget an admin set on the key or workspace, with resets_at telling you when it rolls over. 429 is rate limiting, either OpenRouter's own (free-model caps, DDoS protection) or the upstream provider's, in which case error.metadata.provider_code carries the provider's code.
What to do in code. Retry 429 with exponential backoff and honor Retry-After; treat 403 as "stop until resets_at"; for 402, branch on limit_source rather than the human-readable remedy_hint. If a rate limit hits after a stream has started, the docs say it arrives as an SSE event with finish_reason: "error" instead of an HTTP 429, so streaming agents need to check the last event too.
Aliases. Some docs examples use moving aliases such as ~anthropic/claude-sonnet-latest, which follow the newest model in a family. They are convenient for chat apps and risky for agents whose prompts were tuned on one model; pin a dated ID for anything scheduled and change it deliberately.
from openai import OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="<OPENROUTER_API_KEY>",
)
resp = client.chat.completions.create(
model="google/gemma-4-31b-it:free", # any catalog ID; ":free" = zero-price variant
messages=[{"role": "user", "content": "Summarize: OpenRouter routes one request to many models."}],
extra_body={"models": ["openrouter/free"]}, # fallback list goes in extra_body with the OpenAI SDK
)
print(resp.model, resp.choices[0].message.content)
print(resp.usage)What 899 X posts say about the OpenRouter API
To see what builders actually run into, we pulled a de-identified sample of recent public posts that mention OpenRouter (search openrouter -filter:retweets, Latest) and classified them with keyword rules. The sample covered 899 posts from 737 distinct authors over about 46 hours, roughly 19.6 posts an hour; 44.6% were replies, the median post had 1 like and 48.9% had none, so this is everyday developer chatter rather than viral content.
Pricing, credits or cost came up in 27.1% of posts, more than any single model family. Coding agents (Claude Code, Cline, Kilo Code, Roo Code, Cursor, OpenCode, Codex) appeared in 9.8%, routing and fallback talk in 12.7%, API keys in 6.9%, free models in 6.7% and rate limits or errors in 5.9%. Only 1.4% mentioned the base URL or OpenAI compatibility explicitly, which fits the docs' pitch: once the base URL is set, people stop talking about it.
Languages. English was 68.9% of the sample, Chinese 15.6% and Japanese 4.2%, then Portuguese (2.1%) and Spanish (1.1%); 2.9% had no detectable language (links or media only).
What the official account talks about. The 200 most recent posts from @OpenRouter (157,138 followers at collection) spanned 52.9 days, 3.78 posts a day, a third of them reposts. Of its 134 original posts, half (50.0%) announced a model going live on OpenRouter, 20.9% were about routing or platform features (security center, caching, routers), and 9.7% shared usage data such as spend rankings. Only 11.9% of originals mentioned free models at all, yet the two posts our rules classed primarily as free-model news drew a median of 546,110 views, against 18,138 for a typical original post. Free models are what the audience clicks on; launches are what the account mostly posts.
Limits of the sample. Keyword rules miss sarcasm and over-match short words, a 46-hour Latest window reflects the week's launches, and posts that mention OpenRouter are not the same as OpenRouter's user base. The shares are directional; the catalog and limits figures are quoted from OpenRouter's own pages.

Worked example: an X agent that swaps models through OpenRouter
The full script is in the code block at the end of this page; here is what it does and why. Step one reads X: GET https://api.twitterapi.io/twitter/tweet/advanced_search with the X-API-Key header, query in X's search syntax and queryType=Latest, following next_cursor while has_next_page is true. Each page holds up to 20 tweets with fields such as text, likeCount, createdAt and author.userName. No X account or X developer app is needed for reads.
Step two builds one prompt per batch of up to 50 tweets and sends it to chat/completions under the OpenRouter base URL with model read from an environment variable and models holding two fallbacks. Changing the model is a config change, not a code change, which is the main reason to put OpenRouter in front of an agent: you can A/B a cheap model against a strong one on the same tweets and compare the outputs and usage.cost side by side.
Step three logs the response's model (which model actually answered, important once fallbacks exist), token counts and cost. A 402 or 429 stops the run with OpenRouter's error object so a scheduler can retry later instead of looping.
Scheduling it. Run the script from cron or a CI schedule. If it polls a query every 5 minutes and usually finds nothing, the X side costs the $0.00015 minimum per empty check, about $1.30 a month; every 60 seconds is 43,200 checks, about $6.48. Only send a batch to the model when new tweets arrived, so the LLM bill tracks volume rather than the clock.
Posting the summary back to X. If the agent should reply or post, TwitterAPI.io's write actions run through an authenticated session: one /twitter/user_login_v2 login ($0.10, with a proxy you supply) returns login_cookies, and each post via /twitter/create_tweet_v2 is then 60 credits ($0.0006), billed per HTTP 200 call. The call acts as that account, so X can rate-limit, lock or suspend it; keep a human pace, and expect the session to need a re-login now and then.
What a 1,000-tweet summary costs: model vs data
We priced one concrete job, summarizing 1,000 real tweets in batches of 50, using the tweets in our sample. Token counts are an estimate (characters divided by 4 on the real post texts, not a tokenizer run): the median post was 219 characters or about 55 tokens, the mean about 105 tokens. Adding 15 tokens of metadata per tweet, a 200-token instruction per call and 150 output tokens per call gives about 124,214 input and 3,000 output tokens per 1,000 tweets. Prices are the per-token prices in OpenRouter's public catalog at collection, multiplied by 1.055 for the credit fee.
Takeaway. For a summarize-and-report agent, input tokens dominate, and the small fast models make the LLM a rounding error next to the data: on DeepSeek V4.1 Flash or Claude Haiku 5.5 the model added 5 to 10% to the $0.15 data cost. Only frontier-class models (Sonnet 5.5, Grok 4.7) cost more than the tweets themselves. A free variant takes the model cost to zero, within the 50 or 1,000 requests a day described above.
The data side, compared. TwitterAPI.io charges 15 credits per tweet returned, $0.15 per 1,000 tweets, with a 15-credit minimum per request. The official X API's pay-per-usage rate card at docs.x.com/x-api/getting-started/pricing lists $0.005 per post read, $5.00 per 1,000, about 33 times more, with pay-per-usage capped at 3 million post reads a month before Enterprise. Either way, the biggest cost lever in this pipeline is choosing which tweets to fetch, not which model reads them.

How we collected this
Question. What do public posts about OpenRouter talk about, what does the official account post, and what would an X agent spend on the model versus the data?
Accounts and query. The official @OpenRouter timeline (200 most recent posts via /twitter/user/last_tweets; the handle @OpenRouterAI returned "user not found") and a Latest search for openrouter -filter:retweets via /twitter/tweet/advanced_search (899 posts after removing the official account's own posts). OpenRouter's public model catalog (GET {base}/models on https://openrouter.ai/api/v1) was fetched once, without a key, for per-token prices and the :free list.
Window and size. The most recent posts at collection time, collected in 2026: 52.9 days for the account, about 46 hours for the search. 58 API requests in total, about 1,100 tweets, roughly $0.17 of credits.
What it cannot show. Who OpenRouter's users are or how much they spend; keyword shares are approximate; token counts are a characters/4 estimate, and real counts vary by each model's tokenizer; catalog prices change often.
Privacy. Aggregates only. Only the organization account is named; individual authors in the search sample are not profiled, and the published sample rows carry no IDs, handles, URLs or post text.
import os
import requests
TW_BASE = "https://api.twitterapi.io"
OR_BASE = "https://openrouter.ai/api/v1" # OpenRouter base URL (OpenAI-compatible)
TW_KEY = os.environ["TWITTERAPI_IO_KEY"] # TwitterAPI.io key, no X account needed
OR_KEY = os.environ["OPENROUTER_API_KEY"] # sk-or-... from openrouter.ai/keys
# Swap models without touching code: a primary plus fallbacks, tried in order.
PRIMARY = os.environ.get("OR_MODEL", "deepseek/deepseek-v4.1-flash")
FALLBACKS = ["google/gemini-3.8-flash", "anthropic/claude-haiku-5.5"]
def fetch_tweets(query, max_pages=3):
"""Pull recent tweets for a query; 20 per page, $0.15 per 1,000 returned."""
tweets, cursor = [], ""
for _ in range(max_pages):
r = requests.get(
f"{TW_BASE}/twitter/tweet/advanced_search",
headers={"X-API-Key": TW_KEY},
params={"query": query, "queryType": "Latest", "cursor": cursor},
timeout=30,
)
r.raise_for_status()
body = r.json()
tweets.extend(body.get("tweets", []))
if not body.get("has_next_page"):
break
cursor = body.get("next_cursor", "")
return tweets
def summarize(tweets):
lines = [
f"- @{t['author']['userName']} ({t['likeCount']} likes): {t['text'][:280]}"
for t in tweets
]
r = requests.post(
f"{OR_BASE}/chat/completions",
headers={
"Authorization": f"Bearer {OR_KEY}",
"HTTP-Referer": "https://example.com", # optional, for openrouter.ai rankings
"X-OpenRouter-Title": "x-digest-agent", # optional
},
json={
"model": PRIMARY,
"models": FALLBACKS, # used only if the primary errors or is rate-limited
"messages": [
{"role": "system", "content": "You summarize X posts for a developer. 5 bullets, cite @handles."},
{"role": "user", "content": "\n".join(lines)},
],
"max_tokens": 400,
},
timeout=120,
)
if r.status_code in (402, 429):
raise SystemExit(f"OpenRouter {r.status_code}: {r.text[:300]}")
r.raise_for_status()
data = r.json()
usage = data.get("usage", {})
print(f"model used: {data.get('model')} | tokens in/out: "
f"{usage.get('prompt_tokens')}/{usage.get('completion_tokens')} | cost (credits): {usage.get('cost')}")
return data["choices"][0]["message"]["content"]
if __name__ == "__main__":
batch = fetch_tweets('"openrouter" lang:en -filter:retweets min_faves:5', max_pages=3)
print(f"{len(batch)} tweets fetched")
if batch:
print(summarize(batch[:50]))
Questions readers ask
What is the OpenRouter API base URL?
https://openrouter.ai/api/v1. Chat Completions is POST to chat/completions under that base and the Responses API is POST to responses. With the OpenAI SDK, set base_url to that URL and api_key to your OpenRouter key. Business and Enterprise accounts that need EU in-region processing use https://eu.openrouter.ai/api/v1.
Is the OpenRouter API free?
Partly. Model IDs ending in :free cost nothing per token, but OpenRouter caps them at 20 requests a minute and 50 requests a day until you have purchased at least 10 credits, then 1,000 a day. Paid models are billed at the provider's price from prepaid credits, and the FAQ describes a small free allowance for new users to test with. OpenRouter itself says free models are usually not suitable for production use.
How do I get an OpenRouter API key?
Sign in, open openrouter.ai/keys, create a key, give it a name and optionally a credit limit. Use it as Authorization: Bearer <key>. Keys created during onboarding get a $100 credit limit and expire after 180 days. Use separate keys per app so you can cap and revoke them independently.
Does OpenRouter mark up model prices?
OpenRouter's FAQ says no: inference is passed through at the provider's price. It charges a 5.5% fee ($0.80 minimum) when you buy credits on the Standard plan, 8% on Business, and 5% on crypto payments. Using your own provider keys (BYOK) is free up to $25,000 a month of list-price inference, then 5%.
Why am I getting a 429 or 402 from OpenRouter?
429 means a rate limit: the free-model caps (20 per minute, 50 or 1,000 per day), DDoS protection, or the upstream provider being at capacity. Back off and honor Retry-After, or add fallback models. 402 is about credits: a negative balance (which can block even free models), a per-key credit limit, or the in-flight spending budget on smaller prepaid accounts; check error.metadata.limit_source.
Can I use the OpenAI SDK with OpenRouter?
Yes. OpenRouter's authentication docs show the OpenAI SDK with the base URL set to https://openrouter.ai/api/v1 and the OpenRouter key. OpenRouter-specific parameters such as the models fallback list go in extra_body in the Python SDK.
Do OpenRouter credits expire?
OpenRouter's FAQ says that, per its terms, it reserves the right to expire unused credits one year after purchase. Refunds of unused credits can be requested within 24 hours of purchase; platform fees are not refunded and crypto payments are never refundable.
Can an OpenRouter model read Twitter (X) by itself?
No. A model only sees what you send it. To work on X data, fetch the posts first, for example with TwitterAPI.io's /twitter/tweet/advanced_search at $0.15 per 1,000 tweets returned and no X account needed, then pass the text to the model through OpenRouter as in the example above.
Continue
- OpenRouter docs: Quickstart (base URL, Bearer auth, optional HTTP-Referer and X-OpenRouter-Title headers, OpenAI SDK setup)
- OpenRouter docs: API credit and rate limits (402/403/429, free-model limits table, in-flight spending budget)
- OpenRouter docs: FAQ (no inference markup, 5.5% credit fee with $0.80 minimum, crypto 5%, BYOK, credit expiry, refunds)
- OpenRouter docs: Model fallbacks (models array, billing at the model that answered, :free followed by paid)
- X developer docs: X API pricing (pay-per-usage rate card, $0.005 per post read, 3M monthly post-read cap)
- TwitterAPI.io docs: advanced search endpoint (query, queryType, cursor, tweets[], has_next_page)
- X (Twitter) API hub: every endpoint, price and guide
- Grok API key: getting a key straight from xAI
- Building a Twitter (X) agent with the OpenAI Agents SDK
- How to use Claude with the Twitter (X) API
- Claude API key: Console steps and the first call
- OpenAI API key: project keys and billing
- How to build an AI agent that reads X data
- Twitter (X) rate limit calculator
- TwitterAPI.io pricing: $0.15 per 1,000 tweets
- TwitterAPI.io API documentation
- 01Twitter (X) API License: The Developer Agreement in Plain English
- 02Claude Agent SDK: Build a Twitter (X) Research Agent in Python
- 03Codex vs Claude Code: Setup, MCP, Headless Runs and Pricing Compared for Twitter (X) Data Agents
- 04Open AI API Key: How to Get One, Pay for It, Keep It Safe and Feed It Live Twitter (X) Data
- 05How to Get a Claude API Key: Console Steps, Billing, First Call and Live X (Twitter) Data
- 06Twitter (X) Profile Analytics — How to Pull User Metrics via API
- 07How to Scrape Twitter (X) Without the Official API
- 08Twitter (X) Scraper Comparison — A 2026 Developer Guide
Stop reading. Start building.
Starter credits cover real testing on real data. Google sign-in, no card, no application queue.
Get an API keyAlready building with TwitterAPI.io? Publish an honest tutorial or build log about it and earn up to $200 a month in API credits.