Knowledge LabAPI docs
Your dashboard

Developer docs

Kaspa answers in your own app

The Kaspa News Knowledge Lab answers questions about Kaspa. With an account you get the same answers in your own app, bot or website: send a question, get back the answer, its request id and its exact price.

POSThttps://lab-api.kaspa.news/v1/ask
Kaspa onlyWritten from Kaspa's own sources: talks, the Kaspa Core R&D chat, code, docs, KIPs and research papers. Anything else gets one short line, free.
CheckedSilverScript in an answer is compiled with silverc, Python that uses the Kaspa SDK is checked against it, and timestamps become dates. The results come with the answer.
Exact pricesEach answer costs exactly what it used, to 7 decimal places in US dollars, and says so. A failed answer costs nothing.
A chat box tooPut the lab's chat on your website with one line of code, in your own design. No key needed.

Every answer comes as three fields: id, answer and price_usd. The answer is Markdown with its links in the text. The API does not send the numbered source list that the chat on lab.kaspa.news shows.

WhatAddress
The APIhttps://lab-api.kaspa.news/v1/ask
Your dashboard: keys, questions, bill and chat boxlab-dashboard.kaspa.news
The chat box code, and these docshttps://lab.kaspa.news
The API spec filelab.kaspa.news/docs/openapi.json

Quick start

  1. Get an accountThe lab owner opens accounts, each with a name and the email its holder signs in with. To ask for one, write to [email protected].
  2. Sign in to your dashboardAt lab-dashboard.kaspa.news, with that email. You get a one-time code by email.
  3. Add money, if your account is prepaidIn Billing, top up with KAS. Card payments are coming. If the lab pays for your account, Billing says so and you skip this step.
  4. Make a keyIn Keys. Copy it at once: it is shown only once. Keep it on your server, for example in an environment variable named KASPA_LAB_KEY.
  5. Ask your first questionCopy the curl, JavaScript or Python example below and run it.
curl https://lab-api.kaspa.news/v1/ask \
  -H "Authorization: Bearer $KASPA_LAB_KEY" \
  -H "Content-Type: application/json" \
  -d '{"question": "What is GHOSTDAG?"}'

The answer comes back as JSON (the id and price here are examples):

200 OK
{
  "id": "req_9f2c4e1a7b3d5c60",
  "answer": "**GHOSTDAG** is the rule Kaspa nodes use to put all blocks into one agreed order, including blocks that were made at the same time. Blocks made in parallel are kept instead of thrown away, which lets Kaspa make many blocks every second.",
  "price_usd": 0.0251
}

Next: show the words as they are written, ask follow-up questions, or add the chat box to your website.

Authentication

Send your key in the Authorization header of every request:

HTTP
POST /v1/ask HTTP/1.1
Host: lab-api.kaspa.news
Authorization: Bearer klab_...
Content-Type: application/json

{"question": "What is GHOSTDAG?"}
  • A key is klab_ and 43 more letters, digits, - or _.
  • It is shown once, when you make it. The lab keeps only a fingerprint of it, so a lost key cannot be shown again: make a new one.
  • All keys of an account share its limits and its bill. An account can have up to 10 active keys; give each one a name of up to 60 characters, such as the app that uses it.
  • Keys in your dashboard show their first 12 and last 4 characters, when they were made and when they were last used.
Keep keys on your server. Never put a key in a web page, an app people download or a public repository. The API does not answer cross-origin requests from browsers, so a key in a web page would not work anyway. For a website, use the chat box: it needs no key.

Rotate and revoke

Revoke stops a key at once: its next request gets 401 invalid_key. Rotate makes a new key with the same name and stops the old one at the same moment. To change keys with no gap, make a second key, put it on your server, then revoke the old one. If a key leaks, revoke it in Keys straight away.

POST /v1/ask

Ask one question about Kaspa. The body is one JSON object of at most 128,000 bytes, sent with a Content-Length header (every common HTTP client does this for you).

Request body

questionstringrequired

Your question, 1 to 12,000 characters once spaces at both ends are removed. Paste a link to an X post and the lab explains that post from its own copy of Kaspa posts; if it does not have the post, you get one fixed line, free.

historyarray of {"q", "a"}default []

Earlier turns of the conversation, oldest first, for a follow-up. The lab reads the last 3, and of each the first 1,500 characters of q and 4,000 of a. See Conversations.

streambooleandefault false

true sends the answer piece by piece while it is written. See Streaming.

simplebooleandefault false

true asks for very simple words, like the ELI5 button on lab.kaspa.news: the short version first, then one everyday comparison, with every important fact kept exact. Live network numbers and fixed lines stay as they are.

Only true turns stream and simple on. Fields the lab does not know are ignored.

A request with every field
{
  "question": "How is DAGKnight different?",
  "history": [
    {
      "q": "What is GHOSTDAG?",
      "a": "GHOSTDAG is the rule Kaspa nodes use to put all blocks into one agreed order, including blocks that were made at the same time."
    }
  ],
  "stream": false,
  "simple": false
}

Response

200 with a JSON object of exactly these three fields:

idstring

The request id: req_ and 16 letters or digits. The same id is in your dashboard's Questions list and in your monthly statement. Give it when you report a problem.

answerstring

The answer in Markdown: paragraphs, bold, lists, headings, links in the text and code blocks. No source numbers and no source list.

price_usdnumber

What this answer cost in US dollars, exact to 7 decimal places. 0 for fixed lines and live network numbers.

Checked code and dates

When an answer has code or a Unix timestamp in milliseconds, the lab checks it before you get it, as the chat on lab.kaspa.news does:

  • Every SilverScript contract is compiled with silverc 1.0.0. One that does not compile is fixed automatically when that works, and the answer then carries the fixed contract.
  • Python that uses the Kaspa SDK is checked against the SDK's real names, arguments and fields, and fixed the same way.
  • Every timestamp is turned back into its date, so a wrong date is caught.
  • A contract you paste into your question is compiled too, exactly as you wrote it, and its result comes first.

The results follow the answer as a short Checks list. An answer without code or timestamps has no such list.

The end of an answer with code
...the end of the answer.

**Checks**
- Contract `Vault` compiles with silverc 1.0.0.
- The Python code uses only names, arguments and fields that exist in kaspa 2.1.0.
- `1798761600000` = 1 January 2027 00:00 UTC.
A contract that compiles is not a promise that it is safe or audited. Test it yourself before it holds real funds.

Kinds of answers

You askYou getPriceCounts toward a monthly question limit
A question about KaspaAn answer the lab writesWhat it usedYes
A short question about one live number: the hashrate, the supply, fees, the next reward reduction, or a pasted address, transaction or blockA short answer from live network data, straight away$0Yes
Something that is not about Kaspa, the price of KAS, or a greetingOne fixed line$0No
A link to an X post the lab does not haveOne fixed line that asks for the post's text$0No
A fixed line
{
  "id": "req_95fea651e10a6010",
  "answer": "I only answer questions about Kaspa. Ask me anything about Kaspa: how it works, wallets, mining or building on it.",
  "price_usd": 0.0
}

How long an answer takes

Fixed lines and live numbers come straight away. An answer the lab writes takes longer, and a long, detailed answer longer still. Give your HTTP client a generous timeout (the examples here use 180 seconds), or stream: the words show as they are written, and the lab sends a keep-alive line about every 15 seconds while it works.

Streaming

Add "stream": true to show the answer while it is written. The response is 200 with Content-Type: text/event-stream (server-sent events).

A request refused before the answer starts (a wrong key, a limit, a bad request) gets a normal JSON error with its status, not a stream. Check the status first.

Events

Each event is an event: line, a data: line with JSON, and an empty line.

token

data is a JSON string: the next piece of the answer. A piece can end in the middle of a word.

done

data is the same object as a normal response: id, answer and price_usd. It is the last event. Its answer is the complete, checked answer, so use it as the final text: the pieces can stop a few characters short of the end, and the checks can change the text (a fixed contract, the Checks list).

error

data is an object with message and code, which is lab_error. The answer stopped and costs nothing; try again in a moment.

Lines that start with a colon, such as : still working, keep the connection open while the lab works. Skip them, and skip any event name you do not know.

A short stream, as it arrives
event: token
data: "GHOSTDAG is the rule Kaspa nodes use"

event: token
data: " to put all blocks into one agreed order"

: still working

event: token
data: ", including blocks made at the sa"

event: done
data: {"id": "req_9f2c4e1a7b3d5c60", "answer": "GHOSTDAG is the rule Kaspa nodes use to put all blocks into one agreed order, including blocks made at the same time.", "price_usd": 0.0251}

Read the stream with curl, JavaScript or Python

curl -N https://lab-api.kaspa.news/v1/ask \
  -H "Authorization: Bearer $KASPA_LAB_KEY" \
  -H "Content-Type: application/json" \
  -d '{"question": "How fast is Kaspa?", "stream": true}'

In a page or an app, show the pieces as they come, then put done.answer in their place. If you close the connection before done, the question shows as stopped in your dashboard and costs nothing.

An error after the stream started
event: error
data: {"message": "Something went wrong on the lab side. Please try again in a moment.", "code": "lab_error"}

Conversations

The API remembers nothing between requests. For a follow-up, send the earlier turns in history: each turn is the question (q) and the answer the lab gave (a), oldest first. The lab reads the last 3 turns.

// chat.mjs, for Node 18 or newer: a question and a follow-up
const API_URL = 'https://lab-api.kaspa.news/v1/ask';
let history = []; // earlier turns, oldest first

for (const question of ['What is GHOSTDAG?', 'How is DAGKnight different?']) {
  const res = await fetch(API_URL, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.KASPA_LAB_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ question, history }),
  });
  const data = await res.json();
  if (!res.ok) throw new Error(`${data.code}: ${data.error}`);
  console.log(`> ${question}\n${data.answer}\n`);
  history.push({ q: question, a: data.answer });
  history = history.slice(-3); // the lab reads the last 3 turns
}
  • A follow-up answer gives only the new part; it does not repeat what the earlier answers said.
  • Send each answer back exactly as you received it.
  • Every question is billed on its own. A longer history gives the lab more to read, so a follow-up can cost a little more.

Errors

Every error is JSON with error, a sentence for people, and code, a short word for your program. Check code, not the sentence: sentences can change.

429 Too Many Requests
{
  "error": "Too many requests: this account allows 30 per minute. Try again in 12 seconds.",
  "code": "rate_limited",
  "retry_after": 12
}
StatusCodeWhenWhat to do
400bad_requestThe body is empty, over 128,000 bytes or not one JSON object; the question is missing, not text, empty or over 12,000 characters; or history is not a list.Fix the request. The message says what is wrong.
401invalid_keyThe key is missing, wrong, revoked or replaced by Rotate.Check the Authorization header and your keys.
402balance_emptyYour prepaid balance is at $0.Top up in Billing; questions work again at once.
402monthly_spend_limitThis month's spending limit is reached.It starts again on the 1st (UTC), or ask for a higher limit.
402monthly_question_limitThis month's question limit is reached.It starts again on the 1st (UTC), or ask for a higher limit.
403pausedThe lab owner paused the account.Write to [email protected].
403no_accountThe key belongs to no account.Ask for a new key.
404not_foundAny address or method other than POST /v1/ask.Use POST /v1/ask.
429rate_limitedMore requests in the last minute than your account allows.Wait retry_after seconds, then try again.
500lab_errorSomething went wrong on the lab side, or the lab is starting up.Try again in a moment. It costs nothing.

When to try again

  • 429: wait retry_after seconds (the Retry-After header says the same), then send the request again.
  • 500, or any other status from 500 up: try again after a short wait, for example 2 and then 4 seconds, a few times at most.
  • 400, 401, 402, 403: trying again does not help until something changes: the request, the key, your balance, a limit or the account.

The client code below does exactly this. Refused requests are not saved and do not show in your Questions list; failed and stopped questions do, at no charge.

Limits and quotas

Limits belong to your account: all its keys and its chat box share them. The lab owner sets them, and your dashboard shows them with what is left, on Overview and in Help.

LimitWhat it countsWhen it is reached
Requests per minute30, unless the lab owner set another number (1 to 600), over the last 60 seconds429 rate_limited with retry_after
Questions per monthOptional. Answered questions this calendar month; fixed lines do not count402 monthly_question_limit
Spending per monthOptional. What your answered questions cost this calendar month402 monthly_spend_limit
Prepaid balancePrepaid accounts only. Each answered question takes its price from it402 balance_empty at $0
  • Monthly limits start again on the 1st of every month at 00:00 UTC.
  • Limits are checked when a question arrives. So the question that crosses a limit, or takes the last of a balance, is still answered and billed, and the next one is refused. A balance can go a little below $0 this way; the next top-up covers that first.
  • The per-minute count includes every request that gets past these checks, bad requests (400) too.
  • Each request: a question of up to 12,000 characters, the last 3 turns of history, a body of up to 128,000 bytes.
  • Up to 10 active keys per account.

To ask for other limits, write to [email protected].

Pricing and billing

The API is paid per answered question. Each answer's price is exactly what it used, worked out to 7 decimal places in US dollars. It comes back in price_usd, and your dashboard lists it with every question.

There is no fixed price list: a long, detailed answer costs more than a short one. Your dashboard shows this month's average price per question, and about how many questions your balance buys at that price.

What costs nothing

  • Questions that fail, and questions you stop by closing the connection.
  • Fixed lines: questions that are not about Kaspa, and links to X posts the lab does not have.
  • Short questions about one live network number.
  • Refused requests: 400, 401, 402, 403 and 429.

Prepaid or free

An account is either prepaid or free. Billing says which.

  • Prepaid: you top up a balance, and each answered question takes its exact price from it. At $0 new questions stop with 402 balance_empty and your chat box rests; a top-up starts them again at once. Money you do not use stays on the balance, and the dashboard tells you when the balance runs low.
  • Free: the lab pays for your questions. Your account's limits still apply.

The lab can also add credit to a prepaid balance, for example as a gift or a correction. It shows in your payments as "From the lab".

Top up with KAS

  1. In Billing, pick an amount in dollars (a button, or another amount between the smallest and largest top-up shown there) and press Pay with KAS.
  2. Billing shows the exact KAS amount and the address, each with a copy button. Send exactly that amount in one payment: the exact amount tells the lab the payment is yours.
  3. The page looks for your payment every 15 seconds (or press I have paid: check now), and the lab also checks on its own. The money is on your balance as soon as the payment is seen.

An amount is offered for 6 hours. A payment that arrives later still counts for 30 days, at the lower of the dollars you picked and what the KAS sent is worth when it arrives. Up to 3 amounts can wait at once, and up to 10 can be made in a day. Not now puts an amount aside; it still counts if you pay it later. The receipt is the transaction on kaspa.stream.

Card payments are coming. Until then, KAS is the way to top up.

The chat box without the kaspa.news mark

Your chat box shows a small kaspa.news mark. The plan without it is in Billing, with its price. With KAS, one payment buys a number of days, shown there, and new days are added after the ones already paid. Paying monthly by card comes with card payments.

Bills and statements

  • Overview shows what you spent today, this week (from Monday), this month and in all, and spending per day for 30 days. Days and months follow UTC.
  • Questions lists every question, from the API and from your chat box, with its answer, time, status (answered, failed or stopped), price and request id.
  • Billing lists your payments with their receipts, and a statement for each month as a CSV file:
kaspa-lab-2026-10.csv
time (UTC),request id,channel,question,status,price (USD)
2026-10-16T09:12:40+00:00,req_9f2c4e1a7b3d5c60,api,What is GHOSTDAG?,answered,0.0251000
2026-10-16T09:20:03+00:00,req_3b7d0c5e2a9f4410,embed,How do I run a Kaspa node?,answered,0.0313000
2026-10-16T09:31:55+00:00,req_77a1e0c9d4b2f356,api,What is DAGKnight?,failed,0.0000000
,,,Total for 2026-10,3 requests,0.0564000

The website chat box

The chat box puts the lab's own chat on your website: answers with talks that play inside them, sources with their icons, the question cards (you can hide them) and ELI5. It needs no key and no code on your server. Its answers go on your account's bill and show in your Questions list as "Chat box".

Add it to your site

  1. In your dashboard, open Chat box, switch it on and list your websites.
  2. Pick a design, then copy your code: a round button in the corner, or a box inside a page.
  3. Paste it into your site.

A round button in the corner. Put this line before </body>. It adds one button in the corner (round, or with your words next to its icon) that opens the chat. The chat loads on the first tap, opens full screen on screens under 520 pixels wide, and nothing else on your page is touched.

HTML
<script src="https://lab.kaspa.news/embed.js" data-lab="emb_0123456789abcdef" defer></script>

A box inside a page. Put this where the chat should be. Keep referrerpolicy="strict-origin": from it the lab knows which website the box is on.

HTML
<iframe src="https://lab.kaspa.news/embed/emb_0123456789abcdef" title="Ask about Kaspa" referrerpolicy="strict-origin"
  style="width:100%;height:640px;border:0;border-radius:16px" loading="lazy" allow="clipboard-write"></iframe>

Copy the code from your dashboard: it has your own chat box id in place of emb_0123456789abcdef. The id is not a secret; it works only on your websites.

If your site sets a Content-Security-Policy, allow the lab in it. The round button needs these three:

Content-Security-Policy
script-src https://lab.kaspa.news; frame-src https://lab.kaspa.news; connect-src https://lab.kaspa.news

If your policy also limits styles (a style-src, or a default-src without one), the round button needs 'unsafe-inline' in style-src as well, because its look is a small style the script adds. The box inside a page needs only frame-src https://lab.kaspa.news; under such a policy the browser ignores its style attribute, so give the frame its size in your own stylesheet.

Your websites

  • List up to 20, one per line, as plain names: example.com, shop.example.com, or *.example.org for every name under it (not example.org itself).
  • A two-part name such as example.com also covers www.example.com.
  • The box works only on https pages of these websites. A browser will not show it on any other website, and opened on its own it says it works inside a website.
  • Change the list at any time; your code stays the same.

Design

Set the look in Chat box, with a live preview. Your code reads the design from the lab each time, so a new design needs no new code. Every style keeps the lab's own chat, with its talks and sources with their icons, and the kaspa.news mark.

OptionChoices
StyleKaspa News, the lab's own bold paper look and the default; Clean, calm and white for any website; or Minimal, flat with no lines or shadows, so the chat blends into your page. A style also sets the font, corners and background, and you can change each of them after.
ColourAny colour, dark brand colours too, or one of 11 quick colours. The text on it is chosen so it stays easy to read.
FontSystem, Rounded, Serif or Mono. Only fonts already on the visitor's device: nothing is downloaded.
CornersSquare, Soft or Round.
BackgroundWhite, Off-white or Paper. In dark mode the style brings its own dark background.
Title in the top barUp to 40 characters. Default: "Ask about Kaspa".
Welcome lineUp to 80 characters. Default: "Ask anything about Kaspa".
Question cardsShown or hidden.
Your logoIn the top bar: a PNG, JPEG or WebP of up to 1 MB. The lab cleans it and shows only its own copy.
Round buttonIts icon (a question mark, a chat bubble or a sparkle), up to 30 characters of words next to it, its size (52, 60 or 68 pixels) and its corner (bottom right or bottom left).
Size when openSmall (360 × 560 pixels), Standard (400 × 640) or Large (460 × 720).
Light or darkLight, dark, or the visitor's own setting. A visitor who picks light or dark in the chat keeps that choice.

The kaspa.news mark

The box shows a small "Answers by kaspa.news" mark at the bottom, in every style. The lab draws it inside its own frame, so your site cannot remove or restyle it, and your logo and design never hide it. In browsers that can tell (Chrome, Edge and other Chromium browsers), a mark that your page covers pauses questions until it shows again. The plan without the mark is in Billing: see Pricing and billing.

What your visitors get

  • The same answers and protections as on lab.kaspa.news: a quick check that they are a person, and at most 30 questions in 10 minutes and 300 a day each, two at a time. Past that they see a calm note with a countdown, never an error.
  • When your account cannot answer (paused, a monthly limit reached, a prepaid balance at $0), the box says it is resting for now. Too many questions in a minute for your account shows the same calm countdown.
  • No Google Analytics, no Share button and no screenshot reading inside the box. A line under the question box tells visitors that questions are saved.

Client code

There is no package to install yet. These small clients, one file each, do what most apps need: ask, stream, follow-ups, and waiting and trying again when the lab says so (429, and 500 or above). Copy one into your project.

// kaspa-lab.mjs: a small client for the Kaspa News Knowledge Lab API
// (Node 18 or newer, no packages)
const API_URL = 'https://lab-api.kaspa.news/v1/ask';

export class LabError extends Error {
  constructor(status, code, message, retryAfter) {
    super(`${status} ${code}: ${message}`);
    Object.assign(this, { status, code, retryAfter });
  }
}

// waits and tries again when told to slow down (429), or when the lab had a
// problem (500 and up)
async function post(body, { key = process.env.KASPA_LAB_KEY, tries = 3 } = {}) {
  for (let attempt = 1; ; attempt++) {
    const res = await fetch(API_URL, {
      method: 'POST',
      headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
      body: JSON.stringify(body),
    });
    if (res.ok) return res;
    const data = await res.json().catch(() => ({}));
    const error = new LabError(res.status, data.code || 'http_error',
      data.error || res.statusText, data.retry_after);
    const retry = res.status === 429 || res.status >= 500;
    if (attempt >= tries || !retry) throw error;
    const seconds = data.retry_after || 2 ** attempt;
    await new Promise(done => setTimeout(done, seconds * 1000));
  }
}

// the answer: { id, answer, price_usd }
export async function ask(question, options = {}) {
  const { history = [], simple = false, ...rest } = options;
  return (await post({ question, history, simple }, rest)).json();
}

// yields { event: 'token', data: text } while the answer is written,
// then { event: 'done', data: the answer }
export async function* stream(question, options = {}) {
  const { history = [], simple = false, ...rest } = options;
  const res = await post({ question, history, simple, stream: true }, rest);
  const decoder = new TextDecoder();
  let buffer = '';
  for await (const chunk of res.body) {
    buffer += decoder.decode(chunk, { stream: true });
    let end;
    while ((end = buffer.indexOf('\n\n')) >= 0) {
      const block = buffer.slice(0, end);
      buffer = buffer.slice(end + 2);
      const event = block.match(/^event: (.*)$/m)?.[1];
      const data = block.match(/^data: (.*)$/m)?.[1];
      if (!event || data === undefined) continue;
      const value = JSON.parse(data);
      if (event === 'error') throw new LabError(200, value.code, value.message);
      if (event === 'token' || event === 'done') yield { event, data: value };
    }
  }
}

Use it like this:

// app.mjs, next to kaspa-lab.mjs: node app.mjs
import { ask, stream, LabError } from './kaspa-lab.mjs';

try {
  const first = await ask('What is GHOSTDAG?');
  console.log(first.answer, `\n($${first.price_usd}, ${first.id})\n`);

  const history = [{ q: 'What is GHOSTDAG?', a: first.answer }];
  let shown = '';
  const next = stream('How is DAGKnight different?', { history });
  for await (const { event, data } of next) {
    if (event === 'token') {
      shown += data;
      process.stdout.write(data);
    } else {
      // done: the complete, checked answer
      const same = data.answer.startsWith(shown);
      console.log(same ? data.answer.slice(shown.length) : `\n\n${data.answer}`);
      console.log(`($${data.price_usd}, ${data.id})`);
    }
  }
} catch (error) {
  if (error instanceof LabError && error.code === 'balance_empty') {
    console.log('Top up in the dashboard, then ask again.');
  }
  throw error;
}

API spec file

The API is described in a standard OpenAPI 3.1 file: lab.kaspa.news/docs/openapi.json. Import it into Postman or Insomnia, or make a client in your programming language with an OpenAPI generator. It has every field, response and error code on this page.

Help and support

  • Report a problem in your dashboard, under Help: say what it is about, add the request id if it is about one question, and tell us what happened. Or open the question in your Questions list and press "Report a problem with this answer", which fills in its id. Reports go to [email protected], and the answer comes by email to the address you sign in with. You can send up to 5 an hour.
  • Or write to [email protected].
Never send your API key, in a report or an email. The request id is enough to find a question.

Changelog

16 October 2026

  • These docs and the API spec file.
  • Every refusal says why with a code: balance_empty, monthly_spend_limit, monthly_question_limit, paused, rate_limited with retry_after, and the rest in Errors.
  • Monthly question limits, next to spending limits, and Rotate for keys.
  • Prepaid balances, topped up with KAS. Card payments are coming.
  • API answers are checked like the chat's: SilverScript compiled with silverc, Python checked against the Kaspa SDK, timestamps turned into dates, and links to X posts looked up.
  • The chat box in your own design: three styles (Kaspa News, Clean and Minimal), any colour, font, corners, background, your logo and the round button's icon, words and size. The kaspa.news mark stays in every style, and there is a plan without it.
  • A question that is missing or not text, and a history that is not a list, now get 400 bad_request. Any other address on the API answers 404 not_found.

Terms of use

In plain words: how the lab works today.

  • Kaspa only. The lab answers questions about Kaspa, including everything built on it. Other questions get one fixed line.
  • No financial advice. Answers never predict prices or give trading or investment advice.
  • Check before you rely on it. Answers come from real sources and code is checked, but an answer can still be wrong or out of date. Test code yourself, and never treat a contract as safe because it compiles.
  • Your keys, your bill. Every question asked with your keys or in your chat box goes on your account's bill. Keep keys secret, and revoke a key that leaks.
  • Limits. Your account's limits apply. The lab owner can change them, or pause an account; a paused account's keys and chat box do not answer.
  • The mark stays. The chat box shows the kaspa.news mark unless your account has the plan without it. Do not cover or hide it.

Questions about these terms: [email protected].

Privacy

  • Questions and answers are saved. Every question asked through the API, your chat box or lab.kaspa.news is kept with its answer, to improve the lab. This cannot be turned off, so keep secrets and personal details out of questions.
  • Who sees them. You see your own account's questions and answers, from your keys and from your chat box. A visitor of your chat box sees only their own chat. The lab owner sees all of them. They are not published: a page with an answer exists only when someone on lab.kaspa.news presses Share, which the API and the chat box do not have.
  • What is kept with them. For an API question: the time, the key, the status and the price, and technical details of how it was answered that only the lab owner sees. For the chat box and lab.kaspa.news, also a visitor code that changes every day, the country and whether it came from a phone, tablet or computer, for the lab's own statistics. IP addresses are never stored.
  • Keys. The lab keeps only a fingerprint of each key, never the key itself.
  • Analytics. The API, the chat box on your website and these docs send nothing to Google. The chat at lab.kaspa.news uses Google Analytics as kaspa.news does: page views, and the first 100 characters of each question with emails, Kaspa addresses, keys and long numbers taken out.
  • Your account. The lab keeps your name, the email you sign in with, your payments and your problem reports. Reports are emailed to [email protected] so we can answer you. A KAS payment is a public transaction on the Kaspa network, like any other.

Questions about your data: [email protected].