---
title: "Danny Keane SDKs and CLI"
description: "Official Danny Keane SDKs for TypeScript (npm) and Python (PyPI), and the dannykeane CLI: install, examples, every method and command, errors, and retries for the dannykeane.com REST API."
canonical: https://dannykeane.com/developers/sdk
last-updated: 2026-09-27
---

# Danny Keane SDKs and CLI

Official client libraries for the Danny Keane REST API, published as dannykeane on npm and PyPI. Both are zero-dependency and typed, and both install the dannykeane command-line tool. No API key: every endpoint is public.

## Install

### TypeScript (npm)

Install: npm i dannykeane -- Node 18.3+, ESM with bundled types. Run the CLI without installing: npx dannykeane work --limit 5

```ts
import { DannyKeane } from "dannykeane";
const dk = new DannyKeane();
for await (const role of dk.iterWork()) console.log(role.company, role.years);
```

### Python (PyPI)

Install: pip install dannykeane -- Python 3.9+, standard library only. Run the CLI without installing: pipx run dannykeane work --limit 5

```python
from dannykeane import DannyKeane
dk = DannyKeane()
for role in dk.iter_work(): print(role["company"], role["years"])
```

- [dannykeane on npm](https://www.npmjs.com/package/dannykeane)
- [dannykeane on PyPI](https://pypi.org/project/dannykeane/)

## Methods

One method per API operation, TypeScript first, then Python. Results are the API's own JSON, typed.

listWork() · list_work() -- GET /api/v1/work: Roles, paginated.

getStats() · get_stats() -- GET /api/v1/stats: Live visitor count.

getGithubContributions() · get_github_contributions() -- GET /api/v1/github-contributions: GitHub contribution calendar.

npcChat() · npc_chat() -- POST /api/v1/npc-chat: Chat with a Habbo room NPC.

npcChatHealth() · npc_chat_health() -- GET /api/v1/npc-chat: NPC chat health check.

runBatch() · run_batch() -- POST /api/v1/batch: Run several read-only operations in one request.

iterWork() · iter_work() -- every role, following next_cursor across pages for you.

- [Danny Keane REST API](/developers/api)

## Errors and retries

Every non-2xx response raises ApiError, parsed from the API's ErrorResponse: status, code, message, hint, and the full body.

On a 429 the client waits out Retry-After and retries, up to maxRetries (max_retries in Python, default 2). A Retry-After longer than maxRetryDelay (max_retry_delay, default 60 seconds) fails at once, with the wait on retryAfter (retry_after). Pass baseUrl (base_url) to point either client at a local or preview deploy.

## CLI

Both packages install the dannykeane command: one command per API operation, the API's JSON on stdout (indented on a terminal, or with --pretty), and failures on stderr as one line of ErrorResponse JSON. --base-url or DANNYKEANE_BASE_URL points it at another deploy.

dannykeane work [--limit <n>] [--cursor <token>] [--all] -- List roles from the /work tables, one page or all of them.

dannykeane stats -- Live visitor count on dannykeane.com.

dannykeane github-contributions -- GitHub contribution calendar: 52 weeks plus aggregate stats.

dannykeane npc-chat [--npc-id <id>] <message> -- Say something to Frank, the NPC in the /habbo room.

dannykeane npc-chat-health -- Liveness probe for the NPC chat service.

dannykeane batch <operationId>... -- Run several read operations in one request, by operationId.

Exit codes: 0 success, 1 the API returned an error, 2 usage error, 3 the API could not be reached.

## More developer docs

Everything dannykeane.com offers developers and agents is indexed at /developers.

- [Developer docs](/developers)
- [REST API](/developers/api)
- [MCP server](/developers/mcp)
- [developers/llms.txt](/developers/llms.txt)

## Elsewhere

- [Home](https://dannykeane.com/)
- [About](https://dannykeane.com/about)
- [Contact](https://dannykeane.com/contact)
- [Developers](https://dannykeane.com/developers)
- [Habbo](https://dannykeane.com/habbo)
- [Privacy](https://dannykeane.com/privacy)
- [llms.txt](https://dannykeane.com/llms.txt) -- machine-readable summary
- [llms-full.txt](https://dannykeane.com/llms-full.txt) -- the complete version
