Cache job type discovery with ETags
Send If-None-Match to /jobs/types and the schema endpoint and get a 304 when the contract has not changed, plus a new /account/capabilities for plan limits.
GET /jobs/types and GET /jobs/types/{type}/schema now return an ETag. Send it back as If-None-Match and you get a 304 with no body when the contract has not changed. The contract only changes when we deploy, so a connector that rebuilds a form on every render stops re-downloading a payload it already has.
Both endpoints stay public and edge cached for 300 seconds. Nothing about the request changes if you ignore the header.
/jobs/types also carries useCases and chainsWith for each type, which the MCP list_job_types tool has returned since it shipped. Same data, same names, now on the REST endpoint too.
Plan limits without reading billing
GET /account/capabilities is new. It returns the authenticated account’s plan limits and enabled features, so you can validate a file size or a duration before submitting a job rather than after a rejection.
import { createClient } from "@rendobar/sdk";
const client = createClient({ apiKey: process.env.RENDOBAR_API_KEY });const { limits } = await client.account.capabilities();
if (file.size > limits.maxInputFileSize) { throw new Error("This file is larger than your plan allows.");}The same call over HTTP, from the SDK docs:
curl https://api.rendobar.com/account/capabilities \ -H "Authorization: Bearer $RENDOBAR_API_KEY"It deliberately contains no balance, price or subscription data. Those stay on /billing/state, which an OAuth token cannot reach. Discovery is public and cacheable and cannot describe your plan, so this is the endpoint that can.
