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.
pip install featurejetfrom 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.
npm install @featurejet/sdkimport { 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.