API Overview

Kibot's Historical Data API is a plain-HTTP service for downloading tick, intraday, and end-of-day data for stocks, ETFs, futures, and forex from api.kibot.com. Because every command is expressed as a URL with query parameters, any HTTP client, a web browser, curl, a Python requests script, or an Excel WEBSERVICE cell, can drive it without an SDK or auth header. This article covers what the API does, who can call it, how access is gated, and what changed in the v2 release that introduced tick, snapshot, NinjaTrader, and split-only adjustment support.

What the API is

Kibot describes the API as "a standard interface that can be implemented on any platform using any programming language to download historical data" (per the API SDK page). It follows the standard web-services model: the client issues an HTTP request, the server returns a formatted text stream, comma-separated for history, tab-separated for adjustments. There is no JSON or XML envelope; the body is the data. That choice keeps the API trivial to call from non-programmers (you can paste a URL into the address bar) and trivial to parse from any language.

The same data is delivered through three other channels, direct download links, FTP archives, and the Kibot Agent desktop tool, and Agent itself is just a GUI wrapper around these API endpoints. Anything Agent can do is reproducible programmatically through the API, including scheduled updates.

So easy, your web browser can do it

The API is callable without an account, without an SDK, and without writing any code. Three browser-only examples demonstrate the model:

http://api.kibot.com/?action=login&user=guest&password=guest
http://api.kibot.com/?action=history&symbol=MSFT&interval=daily&period=10
http://api.kibot.com/?action=history&symbol=MSFT&interval=daily&startdate=1/1/2014&attach=1

The first logs in as the public guest account. The second returns ten calendar days of MSFT daily bars as plain CSV in the response body. The third adds &attach=1, which sets the Content-Disposition header so the browser pops a file-save dialog instead of rendering the data inline, the simplest possible "click to download" workflow.

How to get access

Two access tiers exist. The free guest account (user=guest, password=guest) lets anyone test the API with a hard limit: only daily (end-of-day) data is downloadable, and the volume is capped at "a certain amount" without a published number (per the Access page). Guest access is intended for evaluation, not production.

A Premium subscription unlocks the full API surface, including tick, intraday, snapshot, and adjusted/unadjusted variants. Other subscription tiers (Professional, Standard, Basic, EOD) include API access but restrict it to end-of-day data, the breakdown by tier and the monthly pricing live in Data updates. Authorization is per-symbol: a Premium account can only download history for symbols that are part of one of its previous purchases or that are offered for free.

Endpoints at a glance

The API exposes six commands. Three are session housekeeping, three return data:

Command Purpose Article
login Authenticate; returns 200 OK plus authorization list API authentication
logout Invalidate the current session API authentication
status Server health check; also keeps a session alive API authentication
history Download tick, intraday, or daily bars for a symbol History request
adjustments Splits and dividends for one symbol or all symbols Adjustments request
snapshot Current-day quotes for up to 100 symbols in one call Snapshot request

Every command takes the same shape: http://api.kibot.com/?action=<command>&<param>=<value>.... There is no separate "v2" host or path; the v2 features below are additive parameters on the existing endpoints.

What changed in API v2

Kibot rolled out a v2 of the API that left the URL surface unchanged but added several new parameters and one new command:

Aggregate bid/ask intervals. tickbidask1, tickbidask5, tickbidask15, and tickbidask30 return 1-, 5-, 15-, and 30-minute aggregated bid/ask bars. The format is documented in Data format reference.

Split-adjusted data. Setting &splitadjusted=1 returns prices adjusted for splits but not dividends, the same convention used by Yahoo Finance and Google Finance charts. Combined with the existing &unadjusted=1 flag, every symbol can now be fetched in three forms: fully adjusted (default), split-only, and unadjusted.

Snapshot endpoint. A single ?action=snapshot&symbol=SYM1,SYM2,... call returns current-day data for up to 100 instruments, eliminating the need for a per-symbol HTTP round trip during the trading day. See Snapshot request.

NinjaTrader format. Adding &ninjatrader=1 to any history URL emits the response in NinjaTrader's expected minute, daily, or tick layout.

30-minute delay during market hours. US stocks and ETFs minute and daily data is delayed by 30 minutes during the regular session and becomes immediately available after the close. This applies whether the data is fetched via API, Agent, or direct download, Kibot does not sell a real-time feed.

Tick data via API. All of Kibot's tick history, including the experimental millisecond variant, can now be downloaded over the API. The new interval values are tick, tickbidask, tick1sec, tick5sec, tick10sec, tick15sec, tick30sec, plus the experimental millisecond variants tickms and tickbidaskms.

Futures and forex. The &type= parameter selects the instrument class: stocks (default), etfs, forex, or futures. Without it, the server assumes US stocks. Futures and forex use the same URL structure but require the type qualifier, e.g. &symbol=BO&interval=tickbidask&period=10&type=futures for soybean oil tick data.

Unadjusted data. &unadjusted=1 returns prices as they originally printed at the exchange, with no back-adjustment for splits or dividends. Applies only to US stocks and ETFs.

Distributed server fleet. api.kibot.com is the single entry point but routes to multiple physical servers across geographies. From a caller's perspective the address never changes; from a rate-limit perspective the per-server ceilings discussed in Data updates still apply, and a misbehaving client can find itself pinned to a single back-end if it sends requests too fast.

Why HTTP, not a binary protocol

The HTTP-plus-CSV design has a few practical consequences worth understanding before building against the API.

Compression matters. Tick and intraday responses can be tens or hundreds of megabytes. The server honours Accept-Encoding: gzip,deflate and returns gzipped responses by default; calling code that does not decompress will see opaque bytes. See Server responses for the negotiation details and the sample code in API client examples for how to enable automatic decompression on HttpWebRequest.

Errors are HTTP responses, not exceptions. Authentication failures, missing symbols, and rate-limit trips all return one of a small set of status codes (401, 402, 404, 405, etc.). Robust callers parse the response body, every error includes a human-readable message, and key off the code rather than treating any non-200 as fatal. See Server responses for the full list.

Sessions are server-side. Login establishes a session keyed to the source IP; subsequent history/adjustments/snapshot calls require it to be active. Sessions auto-expire after 20 minutes of inactivity. The "skip login" shortcut documented in API authentication sidesteps this entirely by appending credentials to every data URL, useful for stateless callers, slightly more wire traffic for chatty ones.

Open-source reference client. Kibot publishes a .NET sample application (source plus binaries) demonstrating the full login-and-fetch flow. Walkthrough and code live in API client examples.

Key Takeaways

  • The API is plain HTTP, any client that can issue a GET request can drive it; no SDK, header, or token is required beyond the per-request URL.
  • A free guest/guest account exposes daily data only; full tick/intraday/snapshot access is gated behind the Premium subscription tier.
  • Six commands cover the entire surface: login, logout, status for sessions, and history, adjustments, snapshot for data.
  • v2 added tick, snapshot, NinjaTrader, split-only adjustment, the &type= instrument switch, and a multi-server back end behind the unchanged api.kibot.com address.
  • Authorization is per-symbol: a paid account can only download history for symbols inside one of its purchased packages.
  • Responses are gzip-compressed by default when the client advertises Accept-Encoding; decompression is the caller's responsibility.