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 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.