Skip to main content

Developer SDKs

Official SDKs

Use the same organization-scoped FeatureJet API from Python or Node.js with typed clients, explicit pagination, and no automatic retries. Both clients default to https://api.featurejet.com.

Synchronous client

Python

Install the featurejet package, then create a FeatureJetClient with a live API key. The client can be used as a context manager and closes its HTTP session automatically.

Install
pip install featurejet
Quickstart
from featurejet import FeatureJetClient, FeatureJetClientConfig

with FeatureJetClient(
    FeatureJetClientConfig(api_key="fj_live_REPLACE_ME"),
) as client:
    posts = client.list_posts("feedback", limit=25, offset=0)
    for post in posts.posts:
        print(post.title, post.vote_count)
Live on PyPI since v0.1.0; the current published release is v0.2.0 check the versions yourself on PyPI, or see the shipped Python SDK request on our board.

Auth and limits

The client sends your key as an Authorization bearer token. The public API allows 120 requests per minute per API key; 429 responses include Retry-After when available, and requests are not retried automatically.

Errors

Handle FeatureJetApiError for API failures and the typed FeatureJetRateLimitError subclass for 429 responses. Rate-limit errors expose retry_after when supplied. Keep API keys out of application logs and user-facing error reports.

TypeScript-first client

Node.js

Install @featurejet/sdk on Node.js 22 or newer. The package has zero runtime dependencies and accepts an injectable fetch implementation for instrumentation or testing.

Install
npm install @featurejet/sdk
Quickstart
import { FeatureJetClient } from "@featurejet/sdk"

const featureJet = new FeatureJetClient({
  apiKey: process.env.FEATUREJET_API_KEY ?? "",
})

const { posts, total } = await featureJet.listPosts("feedback", {
  status: "planned",
  sort: "top",
  limit: 25,
})

console.log({ total, firstPost: posts[0] })
Live on npm since v0.1.0; the current published release is v0.2.0 check the versions yourself on npm, or see the shipped Node.js SDK request on our board.

Auth and limits

Keep the API key server-side. The SDK sends it as an Authorization bearer token. The same 120 requests per minute per API key limit applies, with no automatic retries or automatic page fetching.

Errors and response types

Typed configuration, API, rate-limit, and timeout errors redact the API key from errors. Responses preserve snake_case API fields and are typed at compile time, but are not validated at runtime.

Shared API surface

Both official SDKs cover the same 22 public API operations, with method names following each language's conventions. 15 of them are in the published v0.2.0 packages you get from pip and npm today. The 7 marked Unreleased below — the agent-workflow surface (queue, claims, evidence, and status proposals) plus agent-driven board publish and unpublish, which ships disabled on the server by default — are written and tested in the SDK repositories but are not in a published release yet.

Those operations are live on the REST API and the hosted MCP server right now, so nothing is blocked: call them over HTTP or MCP until the next SDK release lands. We would rather tell you which line of the table to distrust than have you find out from a missing method at runtime.

GET /api/v1/boards

Python

list_boards()

Node.js

listBoards()

GET /api/v1/boards/{slug}

Python

get_board(slug)

Node.js

getBoard(slug)

POST /api/v1/boards

Python

create_board(request)

Node.js

createBoard(request)

POST /api/v1/boards/{slug}/publish

Unreleased

Python

publish_board(slug)

Node.js

publishBoard(slug)

POST /api/v1/boards/{slug}/unpublish

Unreleased

Python

unpublish_board(slug)

Node.js

unpublishBoard(slug)

GET /api/v1/boards/{slug}/posts

Python

list_posts(slug, ...)

Node.js

listPosts(slug, options?)

POST /api/v1/boards/{slug}/posts

Python

create_post(slug, request)

Node.js

createPost(slug, request)

GET /api/v1/boards/{slug}/posts/{id}

Python

get_post(slug, post_id)

Node.js

getPost(slug, postId)

PATCH /api/v1/boards/{slug}/posts/{id}

Python

update_post(slug, post_id, request)

Node.js

updatePost(slug, postId, request)

DELETE /api/v1/boards/{slug}/posts/{id}

Python

delete_post(slug, post_id)

Node.js

deletePost(slug, postId)

GET /api/v1/boards/{slug}/posts/{id}/votes

Python

list_votes(slug, post_id)

Node.js

listVotes(slug, postId)

GET /api/v1/boards/{slug}/posts/{id}/comments

Python

list_comments(slug, post_id)

Node.js

listComments(slug, postId)

POST /api/v1/boards/{slug}/posts/{id}/comments

Python

create_comment(slug, post_id, request)

Node.js

createComment(slug, postId, request)

GET /api/v1/boards/{slug}/queue

Unreleased

Python

get_queue(slug, ...)

Node.js

getQueue(slug, options?)

POST /api/v1/boards/{slug}/posts/{id}/claim

Unreleased

Python

claim_post(slug, post_id, request?)

Node.js

claimPost(slug, postId, request?)

DELETE /api/v1/boards/{slug}/posts/{id}/claim

Unreleased

Python

release_post(slug, post_id)

Node.js

releasePost(slug, postId)

POST /api/v1/boards/{slug}/posts/{id}/evidence

Unreleased

Python

add_evidence(..., request[action_key])

Node.js

addEvidence(..., { actionKey })

POST /api/v1/boards/{slug}/posts/{id}/propose-status

Unreleased

Python

propose_status(..., request[action_key])

Node.js

proposeStatus(..., { actionKey })

GET /api/v1/boards/{slug}/roadmap

Python

get_roadmap(slug)

Node.js

getRoadmap(slug)

GET /api/v1/boards/{slug}/changelog

Python

get_changelog(slug, ...)

Node.js

getChangelog(slug, options?)

GET /api/v1/boards/{slug}/ship-stats

Python

get_ship_stats(slug, ...)

Node.js

getShipStats(slug, options?)

GET /api/v1/boards/{slug}/analytics

Python

get_analytics(slug, ...)

Node.js

getAnalytics(slug, options?)

Choose another integration

Read the API reference for the underlying HTTP contract, or use the hosted MCP setup to connect an AI assistant.

Python & Node.js SDKs — FeatureJet Docs