Skip to main content

dino-markets

Official Python client for the dino.markets API: related Kalshi and Polymarket prediction markets across sports, crypto, weather, and economics, plus confirmed cross-venue arbitrage and a real-time stream.

Zero runtime dependencies. Requires Python 3.9 or later.

Install

pip install dino-markets

Authentication

Create a key at dino.markets. The dashboard issues a Free-plan key immediately with no card required. Free includes one real-time sample connection; paid plans add the full market stream and higher limits.

Pass the key directly, or set it once in the environment:

export DINO_API_KEY=sk_live_...
from dino_markets import Dino

client = Dino()                       # reads DINO_API_KEY
client = Dino(api_key="sk_live_...")  # or pass it explicitly

Quickstart

from dino_markets import Dino

client = Dino()

# The matched catalog, open and live markets by default
markets = client.markets(sport="baseball")

# A non-sports market family
crypto_thresholds = client.markets(market_type="crypto_above")

# Confirmed cross-venue arbitrage
arbs = client.find_arbitrage(sport="baseball", limit=20)
for m in arbs["markets"]:
    print(m["title"], m["potential_arb_pct"])

# One market by id, and its price history
market = client.market("dino_8f3a1c92-47e8-4c3f-b9d2-f1a8e6c4d5f2")
history = client.history("dino_8f3a1c92-47e8-4c3f-b9d2-f1a8e6c4d5f2")

# Sports and leagues currently in season
leagues = client.leagues()

# Flag an opportunity that looks wrong
client.report_bad_arb(opp_id=market["id"], reason="legs settle on different terms")

REST reads are priced roughly two minutes behind live on every plan. That delay is not a paywall. If you need the current price when it changes, use the WebSocket stream below.

Streaming

The WebSocket stream pushes market updates as they happen and needs the stream extra. Every active plan can mint a ticket. Free receives the curated sample channel; Basic, Premium, and Pro receive the full market stream.

pip install "dino-markets[stream]"
import asyncio
from dino_markets import Dino
from dino_markets.stream import watch

client = Dino()

def on_publication(channel, data):
    print(channel, data)

asyncio.run(watch(client, on_publication))

The server reads your plan from the connect ticket and subscribes the connection to exactly the channels it grants. There is no client-side channel selection to configure. Treat the ticket response's allowed.channels and allowed.max_conns as the source of truth.

Error handling

Every non-2xx response raises a subclass of DinoError, carrying the HTTP status and the parsed response body:

from dino_markets import Dino, AuthenticationError, PlanError, RateLimitError, ServerError

client = Dino()

try:
    client.markets()
except AuthenticationError:
    print("bad or revoked key")
except PlanError:
    print("subscription inactive or plan not recognized")
except RateLimitError as e:
    print("over the rate limit, retry after", e.retry_after, "seconds")
except ServerError:
    print("dino.markets is having a bad moment, try again shortly")

A 429 or 5xx response is retried automatically, honoring a Retry-After header when the API sends one and backing off otherwise. A 400 or other client error is never retried. Tune this with Dino(max_retries=...).

Rate limits

REST requests are metered per key:

Plan Requests/month Requests/sec WebSocket
Free 10,000 10 Curated sample, 1 connection
Basic ($30/month) 1,000,000 10 Full market stream, 3 connections
Premium ($100/month) 5,000,000 25 Full market stream, 10 connections
Pro ($200/month) 5,000,000 25 Full stream plus raw quotes and early candidates, 10 connections

Support

Questions or a key that needs attention: support@dino.markets

Disclaimer

Informational data. Not investment advice. You trade on your own venue accounts at your own risk.

License

MIT, copyright Nusantara Ventures LLC. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dino_markets-0.1.2.tar.gz (14.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dino_markets-0.1.2-py3-none-any.whl (11.6 kB view details)

Uploaded Python 3

File details

Details for the file dino_markets-0.1.2.tar.gz.

File metadata

  • Download URL: dino_markets-0.1.2.tar.gz
  • Upload date:
  • Size: 14.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for dino_markets-0.1.2.tar.gz
Algorithm Hash digest
SHA256 7addf4d53e4193e93ed8ff095c3d5071cbe93595a832db8aaea27c044adbe9b5
MD5 62dff996a10aac1d8075fc23cf89180f
BLAKE2b-256 24ca76771d4b3f4579650d22f9849cbfa95eb5b1d8fedc6e23478cea908bdf7d

See more details on using hashes here.

File details

Details for the file dino_markets-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: dino_markets-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 11.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for dino_markets-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f4b159334c937ba0e9a3e88d993cc499b873844d46757640d852c326443e2e84
MD5 ee8dd4fe4ee1b8740fb2dc9653a32e73
BLAKE2b-256 e484754267a15eb16b8f2fa8477c1baf1f6746c982bed7004dcb7b6c422d2a3a

See more details on using hashes here.

Release history Release notifications | RSS feed

0.2.0

2 files

This release

0.1.2 This release

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page