Kennisbasis De ûntwikkelers
Fire oerflak
De modellen, generators en balans dy't jo brûke yn 'e app, út jo eigen koade. De API praat de OpenAI en Anthropic formaten, dus de measte tools en SDKs wurkje troch te feroarjen in basis URL en in sleutel.
Dizze side is masine-oerset foar it gemak. It Ingelske orizjineel is de ferzje dy't jildt.
Wat is it brûken fan
Yn de HTTP API nymbot.ai dat antwurdearje op itselde fragen dy't in OpenAI- of Anthropic-kliïnt al stjoert.
- Chat komplettenDe Antwurd brûkt en Anthropyske berichten, mei streaming, tools, foto's, redenering en web ûndersyk, foar elk model yn de De kataloge En foar Nymbot's eigen auto-routing.
- Foto's, De video, Ynspiraasje, Transkripsje en Ynbrekken.
- Dyn Balansje, Yn de top-ups, Automatyske top-ups út jo wallet Yn A Historyske De kosten fan elke fraach.
It wurdt betelle út de selde twa Balansje Der is gjin abonnemint en gjin frije tafoeging op de API: elke fraach wurdt betaald út credits dy't jo kocht hawwe.
Wat de API net docht, is alles fan Nymbot's eigen. Jo berichten gean nei it model as jo harren ferstjoerde: gjin Nymbot systeem prompt, gjin memory, gjin datum of taal hints. Wat komt werom is it model's antwurd en in notysje fan wat it kostet.
De basis URLs
| Gebrûk | De basis URL |
|---|---|
| OpenAI SDK's en OpenAI-kompatibele tools | https://nymbot.ai/api/v1 |
| Anthropyske SDK's en De koade | https://nymbot.ai/api (De SDK fertsjintwurdige /v1/messages It eigen |
Elk endpunt leeft ûnder /api/v1/In ûnbekende weg komt werom 404 En in bekend pad neamd mei de verkeerde metoade komt werom. 405Beide foar JSON.
De API antwurdt cross-origin fragen fan elke site, dus in browser-side kin it rjochtsjen. Alles dy't jo stjoere nei in browser kin lêzen wurde troch wie it iepen, mar doe dat allinich mei in sleutel dy't in lyts HjoedDe endpoints dy't tekene wurde mei jo nym (keys, de account summary, NWC auto-top-up en refund-redemption) binne de útsûndering: yn in browser antwurde se allinich Nymbot's eigen sites. Skriuw dy yn foar Account Requests.
Skriuw dy yn foar elke JSON-body mei Content-Type: application/jsonAlle oare soarten wurde weigerd. 415Yn de HTML-formulier of in text/plain Yn de ûndersyk fan 'e ûndersyk is der gjin sprake fan cURL.
-H "Content-Type: application/json" Ynklusyf -d.
Fire keys
Keys wurde makke yn de app. Open De fire yn de sidebar fan de web-app, of yn it menu op Android en iOS, en druk op Skriuw dy ynGeef it in namme en, as jo wolle, in cap en in vervaldatum.
De sleutel wurdt ien kear tafoege. Kopiearje it ergens sûnder foardat jo it blêde: Nymbot bewarret allinnich in fingerprint fan it, dus it kin jo net sjen.
De sleutel lykwols sk-nymbot- De app listet elke sleutel troch syn namme en in koarte hint lykas:
sk-nymbot-Qm7x…c2Lw.
- In sleutel belutsen oan jo nym. It spilet jo saldo, en allinich jo nimme kin it meitsje, feroarje of revoke. Ien dy't de sleutel hat kin spylje mei it, dus behandel it as in wachtwoord.
- De kappen binne yn sats. In sleutel kin in spending cap hawwe, en de cap kin elke dei, elke wike (Monday) of elke moanne (de earste), at 00:00 UTC. It telle beide saldi, in standert krediet as 10 sats en in Pro krediet as 100, dus it betsjut itselde wat de saldo in ferantwurdeling spilet.
403key_limit_reached, sels as it antwurd ûnder de cap komme soe; de fout betsjut hoeveel is ferliet en doe't de cap reset.max_tokensIn fraach wurdt belutsen wat it echt kostet en dat telt tsjin de cap, dus as de provider rapportearret mear tokens as wurde set oan 'e side, de lêste fraach dy't fit kin nimme de sleutel in lytse oer syn cap; de folgjende is dan ferwijd. - In útgeande cap stopt allinich út te spyljen. In sleutel by syn cap kin noch kontrolearje it saldo, lêze syn histoary, list modellen, telle tokens, top up en kontrolearje op in fideo dat it al begûn.
- Expiry is optional. Nei de datum dy't jo set, de sleutel stopt te wurkjen.
- De ferwidering is onmiddellik en finale. In revokearre sleutel mislearre syn folgjende fraach. It bliuwt yn 'e list, markearre revoke, dus syn útgongshistoryk hat noch sin.
- Jo kinne maksimaal 25 aktive sleutels hawwe, elk mei syn eigen namme.
Itselde sheet beskriuwt de útgong fan elke sleutel yn dizze perioade en yn totaal, doe't it foarst brûkt waard, beide fan jo balansen, en jo ferskate API-ferwêzen. It behear fan keys.
Authentication fan in fraach
Skriuw de sleutel yn ien fan dizze haadstikken. Ze binne ekwivalent, dus brûk wat jo kliïnt fertsjintwurdiget:
| Hjoed | Skriuw dy yn |
|---|---|
Authorization: Bearer sk-nymbot-… | OpenAI SDKs, de measte tools, Claude Code mei ANTHROPIC_AUTH_TOKEN |
x-api-key: sk-nymbot-… | Anthropyske SDKs |
api-key: sk-nymbot-… | Azure-styl kliïnten |
In missing, unknown, revoked of expired key returns 401Yn de koade
missing_api_key, invalid_api_key, revoked_api_key Of
expired_api_keyListing modellen, audio modellen en stimmen, en betalingsmetoaden nedich gjin sleutel.
Foto's, fideo's, spraak, transkripsje en ynbeddings kinne ek betelle wurde foar ien fraach op in tiid oer Lightning sûnder gjin sleutel yn alle gefallen: send de fraach sûnder ien en betelje de faktuer yn de 402 Reagearje op it Betelje per fraach sûnder sleutel.
Key management, de account summary en automatyske top-ups binne de útsûndering: se nimme in handtekening fan jo nym ynstee fan in sleutel, dus in lekke sleutel kin net mear sleutels meitsje. Skriuw dy yn foar Account Requests.
De earste fraach
Sette de sleutel yn in omjouwingsvariabele, dan freegje in model wat. De foarbylden yn dizze siden lêze it út NYMBOT_API_KEY.
cURL
export NYMBOT_API_KEY="sk-nymbot-..."
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nymbot/auto",
"messages": [{"role": "user", "content": "What is a Lightning invoice?"}]
}'
Python
import os
from openai import OpenAI
client = OpenAI(
base_url="https://nymbot.ai/api/v1",
api_key=os.environ["NYMBOT_API_KEY"],
)
reply = client.chat.completions.create(
model="nymbot/auto",
messages=[{"role": "user", "content": "What is a Lightning invoice?"}],
)
print(reply.choices[0].message.content)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://nymbot.ai/api/v1",
apiKey: process.env.NYMBOT_API_KEY,
});
const reply = await client.chat.completions.create({
model: "nymbot/auto",
messages: [{ role: "user", content: "What is a Lightning invoice?" }],
});
console.log(reply.choices[0].message.content);
nymbot/auto is Nymbot's eigen routing, betaald út 'e standert saldo. Set in katalogusmodel's id der ynsteld, lykas anthropic/claude-sonnet-5Yn dat model wurdt de Pro Balance brûkt. List fan modellen Yn elke id.
Wat kostet in fraach
De API billet krekt de manier hoe't de app doet.
- Wat in balans.
nymbot/autoHy spile de Standert Yn it foarbyld is it allegear yn it foarbyld. (Every other chat model Yn Pro balanse (100 sats in krediet). De standert image generator en de standert voice spande standert credits; elke oare generator spande Pro. Embeddings spande standert credits. Transcription spande standert credits doe't de standert saldo kin dekkje it, en Pro credits oanhâlde. De modellijst betsjut wat saldo elk model spande. - Hoeveel yn. In chatferwizing wurdt meterearre op de tokens dy't it model feitlik learde en skreaun hat, by de oanbieders publisearre tariven. Dat priis hat in 5% tafoeging tafoege en wurdt dan multiplisearre troch 1.5, dus jo betelje 1.575 kear de listpriis fan de oanbieder. It wurdt konvertearre nei sats oan de live Bitcoin priis en belest yn tûzende fan in krediet. Pro foto, fideo en spraak wurde prize per generaasje, per sekonde of per karakter, en transkripsje per sekonde fan audio, mei deselde tafoeging en marge. De standert ôfbylding is in flat 5 standert credits en de standert stem in flat 3.
- Yn it minimum. Elke meiere oanfolling dy't rûn kostet op syn minst 0.05 krediet: halve set op de standert saldo, 5 sats op Pro. Fraksjes fan in krediet wurde oerbrocht, net rûn op elke tiid.
- Hâld dan op en settle. Foardat in fraach rûn, de meast it kin kosten wurdt hâlden út jo saldo, basearre op wat jo ferstjoerde en de measte tokens it kin skriuwe. Tekst bûten de gewoane ASCII is grutte fan syn UTF-8 bytes, en ASCII-sifretten en punctuation telle as in token elk, dus tekst yn in skriuwer, koade en nûmer wurde hâlden yn folsleine. De hold is yn heule credits, op syn minst ien, dus elke fraach nedich minstens 10 sats frije op de standert saldo of 100 sats op Pro om te begjinnen. Alleen de echte kosten wurde laden; de rest wurdt ferliede doe't it ferliedt. In lange fraach behâldt syn hold foar as lang as it rûn; as de hielden credits op alle gefallen
402insufficient_balanceOer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(owed_satsYn denymbotWat is skuld betelle earst út de folgjende credits dy't berikke dat saldo. Totdat it is betelle, niks op dat saldo kin útbrekken wurde: net troch de API, antwurde yn de app, in oerdracht of in gift. - Ek gjin kredyt. As de balans de holding net dekt, wurdt it verzoek ferwijd mei
402De fergelykje beskriuwt wat saldo is koart, hoefolle sats de fraach nedich en hoefolle binne frije.max_tokensDat betsjut in kleinere hân. - De falen. In fraach dat kostet niks, om't de provider billed foar it wurk it makke foardat faak, of in web ûndersyk of de
nymbot/autoDe taakkontrôle wie al útfierd; dan is dat wat jo betelle, op syn minst 0.05 krediet. In stream dy't jo snijde út wurdt belutsen foar de tokens dy't de provider rapportearret: Nymbot keeps reading the provider's stream for up to 25 secondes after you leave to get that count. If it doesn't arrive, the charge is estimated from what you sent and what was written, and for a model that reasons it includes the entire output allowance of the hold. A request whose connection drops still ends and is charged. - Web ûndersyk It kostet $ 0,008 in ûndersyk, konvertearre nei sats, whenever in ûndersyk rûn, of it model dan antwurde of mislearre.
Elke antwurd beskriuwt wat it kostet. nymbot It foarwerp mei it saldo dat it is betelle út, de kosten yn credits en satsen, en wat is ferliet:
De kosten fan it objekt
"nymbot": {
"balance": "pro",
"charged_credits": 0.162,
"charged_sats": 16.2,
"balance_credits": 412.425,
"balance_sats": 41242.5
}
Betelle antwurden hawwe ek dizze haadstikken, dat is wêr't jo kinne sjoch foar de kosten fan in antwurd dat is net JSON, lykas speech:
| Hjoed | Betekenis |
|---|---|
X-Nymbot-Cost-Sats | Wat kostet dit foarbyld, yn sats. |
X-Nymbot-Balance-Sats | Wat is op 'e saldo dy't it is betelle út, yn sats. |
X-Request-Id | In id foar de fraach, op elke antwurd. Cite it as jo kontakt mei support. |
Rates per miljoen tokens, al ynklusyf de fee en marge, binne yn de
List fan modellen Yn dollars en sats, en op
De priisplakAs de Bitcoin-priis net lêst wurdt, komme de betelle fragen werom. 503 price_unavailable Yn
Retry-After: 60 Ynsteld yn it gokken.
De fouten
Elke fout hat itselde foarm, ien dy't OpenAI-kliïnten al begripe. code is in stabile namme dy't jo kinne match op; message It is foar de minsken en kin feroarjen.
Feroarjende lichem
{
"error": {
"message": "This request needs up to 200 sats (2 credits) on your Pro balance, and 40 sats are free. Catalog models spend the Pro balance. Top up in the Nymbot app or with POST /api/v1/topup/create/btc-lightning.",
"type": "insufficient_quota",
"code": "insufficient_balance",
"param": null,
"balance": "pro",
"required_sats": 200,
"balance_sats": 40
}
}
| Status fan | As |
|---|---|
400 invalid_request_error | Oer klasseboek en aktiviteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(invalid_jsonIt earste krantsje kaam út yn april (missing_required_parameter), in wearde is feilich, of de fraach vraagt om iets dat it model of endpoint net docht, lykas tools op nymbot/auto (unsupported_tool). param Namme de fjild. ek upstream_rejected As de leveransier de fraach weigerde. |
401 authentication_error | De sleutel is mislearre, ûnbekend, revokearre of ferleatst, of in tekene fraach is ongeldig of re-brûk. |
402 insufficient_quota | It saldo kin de fraach net dekke. insufficient_balanceYn balance, required_sats en balance_sats. |
403 permission_error | It earste krantsje kaam út yn april Nadere informatie (key_limit_reachedYn limit_sats, used_sats en reset_atIt earste krantsje kaam út yn april Nadere informatie (account_denied). |
404 not_found_error | It earste krantsje kaam út yn april (unknown_endpointIt earste krantsje kaam út yn april Nadere informatie (model_not_found), of in ûnbekende sleutel, faktuer of fideo. |
405 | It earste krantsje kaam út yn april (method_not_allowedDe Allow Header listet de metoaden dy't it brûkt. |
413 | It earste krantsje kaam út yn april Nadere informatie (payload_too_large, file_too_largeIt earste krantsje kaam út yn april Nadere informatie (audio_too_longYn Grinsjes. |
415 invalid_request_error | De organisaasje is no útfierd as application/json Of foar de ôfrûne tiid. multipart/form-data): unsupported_media_type. |
422 | Oer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(voice_language_mismatch, unsupported_language). |
429 rate_limit_error | Oer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(rate_limit_exceededOer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(upstream_rate_limitedWacht op de sekonden yn Retry-After. |
500 api_error | It earste krantsje kaam út yn april (internal_error). |
502 api_error | It earste krantsje kaam út yn april Nadere informatie (upstream_errorOer klasseboek en aktiviteiteplan, observaasje en registraasje yn 'e basisskoalle by Theun Meestringa(invoice_unavailable). |
503 api_error | It earste krantsje kaam út yn april (upstream_overloadedIt earste krantsje kaam út yn april Nadere informatie (price_unavailableOer klasseboek en aktiviteiteplan, observaasje yn 'e basisskoalle by Theun Meestringa(service_unavailable, media_hosting_unavailable). Retry-After Der is noch wat te meitsjen, dêr't it bekend is. |
Twa útsûnderings binne:
/api/v1/messagesantwurden yn Anthropic's foutformaat, sûnt dat is wat Anthropic kliïnten parse:{"type": "error", "error": {"type": "authentication_error", "message": "…"}}De type folgje de status:invalid_request_error,authentication_error,billing_error(402),permission_error,not_found_error,request_too_large,rate_limit_error,api_errorOfoverloaded_error(503).- In streamingferwizing dy't mislearre foar syn earste byte krije in gewoane JSON-fout mei de status hjirûnder, net in evenemintstroom.
Fertsjintwurdigings fertsjintwurdigings fertsjintwurdigings fertsjintwurdigings fertsjintwurdigings fertsjintwurdigings fertsjintwurdigings fertsjintwurdigings fertsjintwurdigings fertsjintwurdigings fertsjintwurdigings fertsjintwurdigings.
Grinsjes
| De grûn | Waarde |
|---|---|
| Skriuw dy yn foar Key | Yn 120 minuten is der noch mear. 429 Yn Retry-After. |
| Befoarderingen sûnder in sleutel | 120 per minuut per adres, foar de model, audio en betelling metoade listings, refund token checks, en betelle endpoints rjochte sûnder in sleutel of betelling. 429 Yn Retry-After. |
| Authentication fersoarge | 30 minuten per adres foar sleutels, tekens, betelling credentials en refund tokens dy't net verifiearje. Boppedat, elke fraach fan it adres dat draait in credential krije 429 Yn Retry-After De krêften binne kontrolearre foardat it lichem lêst wurdt. |
| Nieuwe sleutels | 60 oere per nym en 120 oere per adres. |
| Top-up faktuer | 60 oere per nym en 120 oere per adres. |
| NWC wallet ferbining | 10 in oere per nym en 30 in oere per adres. De wallet relay hat te brûken wss:// Yn de standert port. |
| De tokens binne | 60 fragen per minút per token. |
| Adressen | In IPv6-adres telt as syn helte /64 yn elke per-adresgrens, en in IPv4-mapped IPv6-adres as syn IPv4-adres. |
| JSON ferantwurdlikens body | 4 MB; 64 KB foar fragen tekene mei jo nym. |
| Multipart request body (uploads) is in foarbyld. | 32 MB. In ôfbylding om te editearjen kin maksimaal 20 MB, in audio-bestân maksimaal 25 MB. Op maksimaal 64 dielten, elk mei maksimaal 8 KB fan diel header, en in grûn fan 1 oant 70 karakters; anders 400 invalid_multipart. |
| Foto's yn ien chat foarbyld | Yn elk gefal is er in https:// Of http:// link nei in iepenbiere gast, of a data:image/… De url. |
| Foto's per generaasje | It earste krantsje kaam út yn april (n) |
| Ynstruksje Tokens | Hjoed op it eigen maksimum fan it model. max_tokens It is yn it ferbûn, no yn it ferbûn. |
| Speech ynlieding | 800 karakters foar de standert stem, 2000 foar Aura 2. |
| Transkripsje | 30 minuten audio, 25 MB. Lange opnammen wurdt ferwiderd mei 413 It is noch ûnbekend, mar it is ûnbekend, mar it is ûnbekend. |
| Ynbrekken | 100 ynputs per fraach. |
| Video wurkje | Yn de earste 24 oeren is der in oantal ynwenners dy't op 'e hûndert hûndert hûndert hûndert hûndert. |
| Wolle histoaryske | Yn 90 dagen. |
| Aktive keys per nym | Alleen de lêste 50 herrochte sleutels wurde bewarre. |
In link nei in ôfbylding moat op in iepenbiere hûs rjochtsje: in adres op in privee of lokale netwurk, of op Nymbot's eigen sites, wurdt ferwiderd.
Wat de fire kin sjen
De API is net privee yn 'e manier dy't de apps binne, en it is de moeite waard om krekt oer hoe.
- It is no end-to-end ynkriptearre. Yn de apps, in berjocht wurdt ferdield op jo apparaat oan keys allinich Nymbot hâldt en reis as in Skriuw dy ynIn API-ferbân is gewoan HTTPS: it wurdt encrypted op 'e manier nei Nymbot, en de server fan Nymbot lêst it yn de klar om it te behanneljen.
- Prompts en antwêzen wurde net opslaan. Wat wurdt hâlden is de bill: foar elke fraach de tiid, model, type, token tellen, kosten, balans, sleutel en of it gelyk is, foar 90 dagen, dat is wat Wolle histoaryske In brûkingsrekord fan itselde fraach (tiid, type, model, token tellen, kosten, duration en of it web ûndersyk brûkt of suksesfol wie) wurdt ek bewarre foar 90 dagen, tegearre mei de eigen app.
- Alles wat oaren hâldt foar in nim is klein en listet hjir. Fire keys is opslaan as in hash, nooit de sleutel, mei harren namme, in koarte hint, útgong cap, reset perioade, vervaldatum en doe't se wurde makke en de lêste brûkt; mar de lêste 50 revoked keys wurde bewarre. Automatyske top-up Video jobs wurde hâlden foar 24 oeren. Requests paid per call leave only a Lightning payment hash for 7 dagen en a hashed refund token for 30 dagen, linked to no nym. Charges a balance could not cover are kept as owed as until a top-up pays them.
- De app wurdt feroare. A Ynstrumint WIPE Revokearret en ferwideret elke API-sleutel, en ferwideret de query-history, gebrûkloggen, wallet-ferbining en fideo-jobs.
- De leveransier fan it model sjogge jo fraachCatalog modellen rjochtsje by harren makers; standert routes en embeddings rjochtsje op Cloudflare.
- De media wurde publisearre. Foto's en fideo's dy't leveret wurde as links wurde uploaden nei iepenbiere Blossom-bestjoerhosts, dêr't it adres fan in bestjoer syn hash is. Ienien mei de link kin it iepenjen, en Nymbot kin it net opnommen.
b64_jsonEn in generearre ôfbylding komt werom yn it antwurd en wurdt nooit uploadd. - Sa binne de foto's dy't jo gean in generator. In foto dy't jo upload
Edit ynOf skreaun as a
data:URL yn in generator'simage_url, is uploaded nei in iepenbiere Blossom hûs earst sa'n generator kin helle it, en itselde sil gelde foar it.https://De foto's yn in chatferwizing gean nei de provider fan it model, net nei Blossom. - In sleutel is ferbûn mei jo nym. Alles wat in sleutel spilet komt út jo nim-balans, dus API-gebrûk is net goed. AnonymeIf you want API use kept apart from your everyday nym, meitsje de sleutels út in separe nym mei syn eigen balans.
As jo de beskerming fan de apps nedich binne, brûke de apps. De API is foar doe't jo de modellen yn jo eigen tools nedich binne.
Yn elk eindpunt
| Endpoints | Wat it docht | Outsje |
|---|---|---|
GET /api/v1/models | List foarbyldenYn de priis | No yn |
POST /api/v1/chat/completions | Chat kompletten | De sleutel |
POST /api/v1/responses | Antwurd brûkt | De sleutel |
POST /api/v1/messages | Anthropyske berichten | De sleutel |
POST /api/v1/messages/count_tokens | Skatting fan input tokens | De sleutel |
POST /api/v1/images/generations | Skriuw dy yn | Key of Ljouwerter |
POST /api/v1/images/edits | Editearje in image | Key of Ljouwerter |
POST /api/v1/videos, GET /api/v1/videos, GET /api/v1/videos/{id} | Starts, lists en checks videos | De sleutel, of Ljouwerter It begjint 1 |
POST /api/v1/audio/speech | Tekst foar speech | Key of Ljouwerter |
GET /api/v1/audio/models, GET /api/v1/audio/voices | Audio modellen en stimmen | No yn |
POST /api/v1/audio/transcriptions, POST /api/v1/audio/translations | Speech nei tekst, en nei Ingelsk | Key of Ljouwerter |
POST /api/v1/embeddings | Ynbrekken | Key of Ljouwerter |
GET /api/v1/credits/balance (Of POST) | Beide balansjes | De sleutel |
GET /api/v1/topup/payment-methods | Wize om te beteljen | No yn |
POST /api/v1/topup/create/btc-lightning | Ynstrumint ynstrumint | De sleutel |
GET /api/v1/topup/status/{invoice_id} | Checks en credits it | De sleutel |
GET /api/v1/queries/history | Wat kostet elke fraach | Key of nym |
GET /api/v1/account | Konto sampling | Yn |
/api/v1/keys | Makken, feroarjen en revoke keys | Yn |
/api/v1/nwc-auto-topup | Automatyske top-ups | Yn |
GET /api/v1/l402/refunds, POST /api/v1/l402/refunds/redeem | Checks or redeems in refund token | Yn it ferbân is der in oersetting. |
“Nym” betsjut in fraach tekene troch jo Nostr sleutel, beskreaun yn Skriuw dy yn foar Account RequestsFoar tools dy't al dizze formaten praat, sjoch Tools en SDK's, en foar kodearjen aginten lykas Claude Code, Codex en Cline, sjoch De koade tools.