API Versioning Changelog
This page records changes to Hubbl's two customer-facing API surfaces, the REST API at api.hubbl.com and the MCP server at mcp.hubbl.com, per the API Versioning Policy.
Entries are reverse-chronological. Each entry carries a surface (API or MCP), an optional version, and a tag:
- breaking requires a new major version per the policy.
- additive adds new behavior in place, so existing integrations are unaffected.
- description-update is MCP only. A tool's description changed, so LLM behavior may shift even though the contract is unchanged.
- deprecated marks a version that entered its deprecation window. Includes the planned sunset date.
Customers with active integrations should subscribe at minimum to breaking and deprecated entries.
No endpoint or tool queries Salesforce directly. Everything reads Hubbl's own data, and org-scoped resources reflect the org's most recent scan.
July 30, 2026
API + MCP
- Custom Code endpoints
Read access to the code-quality and metadata-inventory data captured in an org's Hubbl scan: per-file line counts, Apex class-type classifications, PMD violations against Apex, ESLint findings against LWC and Aura JavaScript, and the scanned metadata items themselves.
- API:
GET /v1/orgs/{orgId}/{codeCounts,classTypes,esLints,pmds,items}, each with a single-record companion exceptclassTypes. - MCP:
list_org_code_counts/get_org_code_count,list_org_class_types,list_org_es_lints/get_org_es_lint,list_org_pmd_violations/get_org_pmd_violation, andlist_org_items/get_org_item.
- API:
- Org Limits endpoints
Read access to each Salesforce and Hubbl limit recorded for an org, with its cap, remaining headroom, and derived percent used (
DailyApiRequests,PermissionSets,DailyBulkApiBatches, and the rest). This is one row per limit, so the list returns every limit in a single page.- API:
GET /v1/orgs/{orgId}/orgLimitsandGET /v1/orgs/{orgId}/orgLimits/{name}. The by-name record is identical in shape to the list record. - MCP:
list_org_limitsandget_org_limit.
- API:
- Cloud Usage and object usage endpoints
Read access to the adoption data behind the dashboard's Cloud tab: a per-cloud adoption breakdown with an overall usage summary, plus per-object metrics covering record counts, active users, automations, field counts, and last-used dates.
- API:
GET /v1/orgs/{orgId}/cloudUsage(a singleton, so no filter, sort, or pagination) andGET /v1/orgs/{orgId}/objectUsages. - MCP:
get_org_cloud_usageandlist_org_object_usages.
- API:
- Connected App Assignments endpoint
Read access to the junction rows that link a connected app to the profile or permission set it is granted through, completing the picture alongside the existing Connected Apps and Profiles and Permission Sets resources. Each row targets exactly one of the two:
profileIdorpermissionSetIdis set, and the other is null.- API:
GET /v1/orgs/{orgId}/connectedAppAssignments. - MCP:
list_org_connected_app_assignments.
- API:
- Stable error codes for filter and server failures
Server errors are no longer reported as malformed filters. Previously a 500 came back with the "poorly formatted RQL filter" message, which sent agents into retry loops against a failing backend.
- MCP: every list and get tool now returns a stable code in
structuredContent.error, one ofbad_filter,rate_limited,not_found,access_denied, orserver_error. Genuine 400s keep the filter elicitation and itsresource://links. - API: filter failures now split three ways. A parse error returns 400 with the reason, a value that is only rejected later in processing returns 400 with a safe classification hint (previously a 500), and everything else returns 500.
- MCP: every list and get tool now returns a stable code in
MCP
- Stricter validation on the sign-in flow
Sign-in requests are validated more strictly, and errors are now returned directly to the caller instead of being redirected. Supported clients (Claude Desktop, Cursor, and the rest) need no changes.
- An
/authorizerequest that omits PKCE, or sends acode_challenge_methodother thanS256, now returns400withinvalid_requestin the response body. Previously the error was delivered to the client'sredirect_uri. Custom integrations that read OAuth errors off their redirect URI need to read the response body instead. - A
/callbackrequest that does not correspond to a sign-in Hubbl started returns400. - Sign-in flows already in progress when this ships fail once with a
400; retrying completes normally.
- An
- Server version
1.0.0The initialization handshake now reports
serverInfo.versionas1.0.0. This is Hubbl's server software version, not the API contract version — the contract staysv1, addressed by the endpoint path. No client action is needed. GET /v1/mcpreturns 405The MCP endpoint now answers unsupported methods with
405 Method Not Allowedand anAllow: POST, DELETEheader, where it previously fell through to a generic 404. Hubbl's server offers no SSE stream onGET, which the MCP specification requires be signalled this way.POSTandDELETEare unchanged.- Retryable flag on server errors
Server-error responses now carry
retryable: trueinstructuredContent, so a caller can tell a transient backend failure from a permanent one without reading the message. The stableerrorcodes are unchanged.- Messages for
not_found,access_denied, andserver_errornow name a next step: whichlist_*tool verifies an id, when to re-authenticate, and that a retry is safe after a short wait. Message text is not part of the versioned contract, so clients matching onstructuredContent.errorare unaffected.
- Messages for
- RQL reference link in
list_*filter descriptionsThe
filterparameter description on all 22list_*tools now links to the public RQL reference at https://docs.hubbl.com/rql. The filter contract itself is unchanged. get_org_issuesremovedThe deprecated
get_org_issuesalias has been removed at the end of its closed-beta deprecation window. Uselist_org_issues, which takes the same parameters and returns the same response shape.- OAuth and transport security hardening
The OAuth client behind MCP sign-in now rejects any authorization-code request that arrives without a PKCE
code_challengeandcode_challenge_method=S256, returninginvalid_request. The MCP specification already requires PKCE of all clients, so supported clients (Claude Desktop, Cursor, and the rest) need no changes. Custom OAuth integrations that skipped PKCE have to add it.- API keys are unaffected, as are refresh-token exchanges and token-exchange flows.
- The MCP endpoint's TLS policy now enforces TLS 1.2 or higher using FIPS-validated ciphers. Clients still negotiating TLS 1.0 or 1.1 can no longer connect.
v1is unchanged — this is an enforcement change, not a contract change.
July 23, 2026
API + MCP
- Orgs list
List and search the Salesforce orgs you can access, the first endpoint in the public surface that is not scoped to a single org. It returns a compact record per org (
salesforceId, name, edition, instance URL, sandbox flag, last scan date and status, scan count, and Hubbl score); fetch the single org for the full record. You see only the orgs you already have access to in the dashboard.- API:
GET /v1/orgs. - MCP:
list_orgs, the entry point for resolving anorgIdbefore calling any per-org tool.
- API:
- License Usage endpoints
Read access to the license usage captured in an org's Hubbl scan: total, used, and remaining counts per license, with type, status, and expiration date.
- API:
GET /v1/orgs/{orgId}/licenseUsagesandGET /v1/orgs/{orgId}/licenseUsages/{apiName}. - MCP:
list_org_license_usagesandget_org_license_usage.
- API:
- Profiles and Permission Sets endpoints
Read access to the Salesforce profiles and permission sets captured in an org's Hubbl scan, including the risky-permission flags surfaced on the dashboard's Profiles and Permission Sets tab (
modifyAllData,viewAllData,manageUsers,dataExport,authorApex, and the rest).- API:
GET /v1/orgs/{orgId}/sfProfilesand/sfProfiles/{sfProfileId}, plusGET /v1/orgs/{orgId}/permissionSetsand/permissionSets/{permissionSetId}. - MCP:
list_org_sf_profiles/get_org_sf_profileandlist_org_permission_sets/get_org_permission_set.
- API:
- Login Activity endpoints
Read access to Salesforce login activity for an org: a per-user table carrying 30, 90, and 365 day login counts, plus an adoption rollup of licensed users, how many logged in, how many did not, and login adoption percentage over the same trailing windows.
- API:
GET /v1/orgs/{orgId}/loginActivityandGET /v1/orgs/{orgId}/loginActivity/overview. The overview is a singleton with no pagination, and takes an optional repeatablelicenseparameter that scopes every count in the response to the selected Salesforce license types. - MCP:
list_org_login_activityandget_org_login_activity_overview.
- API:
July 17, 2026
API
- Public list page size capped at 200, default 50
Every public list endpoint now caps
limitat 200 (was 1000) and lowers the default page size to 50 where it was higher. Requests above 200 are clamped to 200, not rejected (no new 400s). This keeps a single response from overwhelming a consumer's context window and reduces token/inference cost for agent callers.- Max lowered 1000 → 200 on
GET /v1/orgsandGET /v1/orgs/{orgId}/{connectedApps,fields,objects,objects/{objectId}/fields,installedPackages,issues,flows,triggers,workflows}. - Default lowered on
GET /v1/orgs(100 → 50),/v1/orgs/{orgId}/fields(200 → 50),/v1/orgs/{orgId}/objects/{objectId}/fields(200 → 50), and/v1/orgs/{orgId}/issues(100 → 50). Callers relying on the old default now get fewer items per page; paginate for more. GET /v1/orgs/{orgId}/issuesnow defaults to sort-priority,effortwhen none is supplied, and drops the never-populatedupdatedAtproperty from the response schema.
- Max lowered 1000 → 200 on
MCP
list_org_*tools capped at 200, default 50Every
list_org_*tool now capslimitat 200 (was 1000) in its input schema and defaults to 50. Unlike REST (which clamps), MCP rejects alimitabove 200, matching the tool's stated schema.- List-tool descriptions reconciled with the API
A consistency pass aligned every
list_org_*tool's advertised fields, filter/sort fields, and enum values with what the API actually accepts and returns, so tool descriptions no longer over-promise fields or reference renamed tools. LLM behavior may shift slightly even though the underlying contract is unchanged.
July 9, 2026
API + MCP
- Triggers endpoints
Read access to the Apex triggers captured in an org's Hubbl scan, completing the automation trio alongside Workflows and Flows.
- API: list and filter triggers, or fetch a single trigger's full record.
- MCP:
list_org_triggersandget_org_trigger.
MCP
- Ready-made prompts
The MCP server now offers five one-click prompts for common tasks: top priority fixes, security risk audit, legacy automation cleanup, connected app review, and unused field cleanup.
- Tool annotations
Every MCP tool now carries standard annotations (read-only, destructive, idempotent, and open-world hints) and a display title, so clients no longer treat read-only tools as potential writes. Annotations are hints, not security guarantees.
- One-click connect for remote clients
OAuth-based remote MCP clients can now connect in one click, with no API key or manual client setup.
- Filter validation fixes
list_org_fieldsnow accepts all the documented filter field names it previously rejected. No contract change; behavior now matches the docs.
June 25, 2026
API + MCP
- Workflows and Flows endpoints
Read access to the workflow rules and flows captured in an org's Hubbl scan, the first two of the automation trio.
- API: list/filter and single-record fetch for each.
- MCP:
list_org_workflows/get_org_workflowandlist_org_flows/get_org_flow.
API
- Rate limits and quota endpoint
Per-account rate limiting is now enforced, with daily and monthly windows. API-key and OAuth usage share one account quota, and requests over the limit receive a standard rate-limit response.
- New
GET /v1/orgs/{orgId}/quotareturns your current usage against the daily and monthly limits so you can pace your requests.
- New
MCP
- Resource links on filter errors
When a filter value is rejected, the error now points to the
resource://lookup of valid values for that field, so agents can self-correct without a separate docs lookup.
June 12, 2026
API + MCP
- OAuth2 sign-in
Any user, not just admins, can now connect to the REST API or MCP server by signing in with a Hubbl account, with no API key required. You see only the orgs and scans you already have access to, and existing API keys keep working unchanged.
- Fields and Objects endpoints
Programmatic read access to the field-level and object-level data captured in an org's Hubbl scan.
- Fields: list and filter scanned fields, or fetch a single field's full record.
- Objects: list an org's objects, fetch a single object, or list the fields on a given object.
- Cleaner response payloads
MCP responses now carry the full payload in
structuredContent, withcontent[0].textreduced to a pointer, removing duplicated JSON. Redundant scan timestamps were dropped fromconnectedApps,installedPackages, andfieldsresponses.
MCP
get_org_issuesrenamed tolist_org_issuesRenamed to match the
list_*/get_*convention. The oldget_org_issuesname still works as an alias and emits a deprecation notice when called; it will be removed at the end of the closed-beta window.
June 11, 2026
API
- Unversioned URLs removed
The pre-versioning REST endpoints at
api.hubbl.com/orgs/...(and adjacent paths) are no longer reachable. All customer-facing REST traffic is now served fromapi.hubbl.com/v1/....- Beta-program customers were notified directly ahead of the cutover and migrated to the versioned URLs.
- This is a one-time cutover; future version retirements will follow the standard 3-month deprecation process described in the policy.
v1launchedInitial release of the versioned public REST API at
api.hubbl.com/v1/. Customer-facing endpoints under/v1/orgs/are reachable on the new public gateway.- Discovery endpoint at
GET https://api.hubbl.com/(unauthenticated) returns the list of supported versions and their status. - Version header on every versioned response:
X-Hubbl-API-Version: 1. TheDeprecationandSunsetheaders will appear here when a future major version retiresv1.
- Discovery endpoint at
MCP
v1launchedInitial release of the versioned MCP server at
mcp.hubbl.com/v1/mcp(Streamable HTTP transport).- In-protocol discovery via the
server_infotool — callable from any MCP session, returns the list of supported MCP versions and their status. - HTTP discovery at
GET https://mcp.hubbl.com/(unauthenticated) returns the same payload, intended for operators and monitoring tools that want to check version state without running an MCP handshake.
- In-protocol discovery via the
- Unversioned endpoint deprecated
The unversioned endpoint at
mcp.hubbl.com/mcpis deprecated and will be removed on 2026-06-25. Update your MCP client configuration (Claude Desktop, Cursor, etc.) to point atmcp.hubbl.com/v1/mcp.- During the transition window, the unversioned endpoint serves the same responses as
/v1/mcpso existing clients continue to work. - Responses on the unversioned path carry
Deprecation: trueandSunsetHTTP headers per RFC 9745 and RFC 8594. These are visible to operators monitoring HTTP traffic; end-user MCP clients generally don't surface them, so direct config updates are still required. - Unlike REST (which was hard-cut at the same launch), MCP retains this 3-month transition because client config updates require manual user action, which adds lag risk.
- During the transition window, the unversioned endpoint serves the same responses as