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)

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] })

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 13 public API operations. Method names follow each language's conventions.

GET /api/v1/boards

Python

list_boards()

Node.js

listBoards()

GET /api/v1/boards/{slug}

Python

get_board(slug)

Node.js

getBoard(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)

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.