From 30f009bef19473712a8ce381ae548c4999b66797 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Thu, 12 Mar 2026 15:25:26 -0700 Subject: [PATCH 01/10] feat: Remove experimental and early access tags from API keys --- packages/clerk-js/src/core/clerk.ts | 10 ++-------- .../clerk-js/src/core/modules/apiKeys/index.ts | 8 ++++---- packages/react/src/experimental.ts | 1 - packages/react/src/hooks/index.ts | 1 + packages/shared/src/react/hooks/index.ts | 2 +- packages/shared/src/react/hooks/useAPIKeys.tsx | 8 -------- packages/shared/src/types/apiKeys.ts | 6 ------ packages/shared/src/types/clerk.ts | 17 +++-------------- packages/ui/src/components/APIKeys/APIKeys.tsx | 7 +------ 9 files changed, 12 insertions(+), 48 deletions(-) diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 1a362b2edac..c845eb2c9eb 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -1332,15 +1332,11 @@ export class Clerk implements ClerkInterface { }; /** - * @experimental This API is in early access and may change in future releases. - * - * Mount a API keys component at the target element. + * Mount an API keys component at the target element. * @param targetNode Target to mount the APIKeys component. * @param props Configuration parameters. */ public mountAPIKeys = (node: HTMLDivElement, props?: APIKeysProps) => { - logger.warnOnce('Clerk: component is in early access and not yet recommended for production use.'); - if (disabledAllAPIKeysFeatures(this, this.environment)) { if (this.#instanceType === 'development') { throw new ClerkRuntimeError(warnings.cannotRenderAPIKeysComponent, { @@ -1385,9 +1381,7 @@ export class Clerk implements ClerkInterface { }; /** - * @experimental This API is in early access and may change in future releases. - * - * Unmount a API keys component from the target element. + * Unmount an API keys component from the target element. * If there is no component mounted at the target node, results in a noop. * * @param targetNode Target node to unmount the APIKeys component from. diff --git a/packages/clerk-js/src/core/modules/apiKeys/index.ts b/packages/clerk-js/src/core/modules/apiKeys/index.ts index 2c8a05a49aa..de47ca9db91 100644 --- a/packages/clerk-js/src/core/modules/apiKeys/index.ts +++ b/packages/clerk-js/src/core/modules/apiKeys/index.ts @@ -18,7 +18,7 @@ export class APIKeys implements APIKeysNamespace { /** * Returns the base options for the FAPI proxy requests. */ - private async getBaseFapiProxyOptions(): Promise { + async #getBaseFapiProxyOptions(): Promise { const token = await BaseResource.clerk.session?.getToken(); if (!token) { throw new ClerkRuntimeError('No valid session token available', { code: 'no_session_token' }); @@ -39,7 +39,7 @@ export class APIKeys implements APIKeysNamespace { async getAll(params?: GetAPIKeysParams): Promise> { return BaseResource._fetch({ - ...(await this.getBaseFapiProxyOptions()), + ...(await this.#getBaseFapiProxyOptions()), method: 'GET', path: '/api_keys', search: convertPageToOffsetSearchParams({ @@ -59,7 +59,7 @@ export class APIKeys implements APIKeysNamespace { async create(params: CreateAPIKeyParams): Promise { const json = (await BaseResource._fetch({ - ...(await this.getBaseFapiProxyOptions()), + ...(await this.#getBaseFapiProxyOptions()), path: '/api_keys', method: 'POST', body: JSON.stringify({ @@ -76,7 +76,7 @@ export class APIKeys implements APIKeysNamespace { async revoke(params: RevokeAPIKeyParams): Promise { const json = (await BaseResource._fetch({ - ...(await this.getBaseFapiProxyOptions()), + ...(await this.#getBaseFapiProxyOptions()), method: 'POST', path: `/api_keys/${params.apiKeyID}/revoke`, body: JSON.stringify({ diff --git a/packages/react/src/experimental.ts b/packages/react/src/experimental.ts index 348bdfd274a..001206478e7 100644 --- a/packages/react/src/experimental.ts +++ b/packages/react/src/experimental.ts @@ -9,7 +9,6 @@ export type { } from '@clerk/shared/types'; export { - __experimental_useAPIKeys as useAPIKeys, __experimental_PaymentElementProvider as PaymentElementProvider, __experimental_usePaymentElement as usePaymentElement, __experimental_PaymentElement as PaymentElement, diff --git a/packages/react/src/hooks/index.ts b/packages/react/src/hooks/index.ts index ddd62c4fdb4..0db65cab7f7 100644 --- a/packages/react/src/hooks/index.ts +++ b/packages/react/src/hooks/index.ts @@ -10,6 +10,7 @@ export { useUser, useSession, useReverification, + useAPIKeys, __experimental_useCheckout, __experimental_CheckoutProvider, __experimental_usePaymentElement, diff --git a/packages/shared/src/react/hooks/index.ts b/packages/shared/src/react/hooks/index.ts index 9935f6b9440..69cd73e01b0 100644 --- a/packages/shared/src/react/hooks/index.ts +++ b/packages/shared/src/react/hooks/index.ts @@ -1,5 +1,5 @@ export { assertContextExists, createContextAndHook } from './createContextAndHook'; -export { useAPIKeys as __experimental_useAPIKeys } from './useAPIKeys'; +export { useAPIKeys, useAPIKeys as __experimental_useAPIKeys } from './useAPIKeys'; export { useOrganization } from './useOrganization'; export { useOrganizationCreationDefaults } from './useOrganizationCreationDefaults'; export type { diff --git a/packages/shared/src/react/hooks/useAPIKeys.tsx b/packages/shared/src/react/hooks/useAPIKeys.tsx index cff886d12c8..bbbe704d19f 100644 --- a/packages/shared/src/react/hooks/useAPIKeys.tsx +++ b/packages/shared/src/react/hooks/useAPIKeys.tsx @@ -6,9 +6,6 @@ import type { PaginatedHookConfig, PaginatedResources } from '../types'; import { createCacheKeys } from './createCacheKeys'; import { usePagesOrInfinite, useWithSafeValues } from './usePagesOrInfinite'; -/** - * @internal - */ export type UseAPIKeysParams = PaginatedHookConfig< GetAPIKeysParams & { /** @@ -20,17 +17,12 @@ export type UseAPIKeysParams = PaginatedHookConfig< } >; -/** - * @internal - */ export type UseAPIKeysReturn = PaginatedResources< APIKeyResource, T extends { infinite: true } ? true : false >; /** - * @internal - * * The `useAPIKeys()` hook provides access to paginated API keys for the current user or organization. * * @example diff --git a/packages/shared/src/types/apiKeys.ts b/packages/shared/src/types/apiKeys.ts index 5dc3c124015..09679504ecf 100644 --- a/packages/shared/src/types/apiKeys.ts +++ b/packages/shared/src/types/apiKeys.ts @@ -23,20 +23,14 @@ export interface APIKeyResource extends ClerkResource { export interface APIKeysNamespace { /** - * @experimental This API is in early access and may change in future releases. - * * Retrieves a paginated list of API keys for the current user or organization. */ getAll(params?: GetAPIKeysParams): Promise>; /** - * @experimental This API is in early access and may change in future releases. - * * Creates a new API key. */ create(params: CreateAPIKeyParams): Promise; /** - * @experimental This API is in early access and may change in future releases. - * * Revokes a given API key by ID. */ revoke(params: RevokeAPIKeyParams): Promise; diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index 670a1a21ba0..1a6921a6717 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -644,11 +644,7 @@ export interface Clerk { unmountPricingTable: (targetNode: HTMLDivElement) => void; /** - * This API is in early access and may change in future releases. - * - * Mount a api keys component at the target element. - * - * @experimental + * Mount an API keys component at the target element. * * @param targetNode - Target to mount the APIKeys component. * @param props - Configuration parameters. @@ -656,14 +652,10 @@ export interface Clerk { mountAPIKeys: (targetNode: HTMLDivElement, props?: APIKeysProps) => void; /** - * This API is in early access and may change in future releases. - * - * Unmount a api keys component from the target element. + * Unmount an API keys component from the target element. * If there is no component mounted at the target node, results in a noop. * - * @experimental - * - * @param targetNode - Target node to unmount the ApiKeys component from. + * @param targetNode - Target node to unmount the APIKeys component from. */ unmountAPIKeys: (targetNode: HTMLDivElement) => void; @@ -1032,9 +1024,6 @@ export interface Clerk { /** * API Keys Object - * - * @experimental - * This API is in early access and may change in future releases. */ apiKeys: APIKeysNamespace; diff --git a/packages/ui/src/components/APIKeys/APIKeys.tsx b/packages/ui/src/components/APIKeys/APIKeys.tsx index f137abff203..352ff251a8c 100644 --- a/packages/ui/src/components/APIKeys/APIKeys.tsx +++ b/packages/ui/src/components/APIKeys/APIKeys.tsx @@ -1,11 +1,6 @@ import { isClerkAPIResponseError } from '@clerk/shared/error'; import { isOrganizationId } from '@clerk/shared/internal/clerk-js/organization'; -import { - __experimental_useAPIKeys as useAPIKeys, - __internal_useOrganizationBase, - useClerk, - useUser, -} from '@clerk/shared/react'; +import { useAPIKeys, __internal_useOrganizationBase, useClerk, useUser } from '@clerk/shared/react'; import type { APIKeyResource } from '@clerk/shared/types'; import { lazy, useState } from 'react'; From 4652d20f10fdd92833658f7c442b5dea1cce8352 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Fri, 13 Mar 2026 08:15:02 -0700 Subject: [PATCH 02/10] chore: revert useAPIKeys to experimental --- packages/react/src/experimental.ts | 1 + packages/react/src/hooks/index.ts | 1 - packages/shared/src/react/hooks/index.ts | 2 +- packages/shared/src/react/hooks/useAPIKeys.tsx | 8 ++++++++ packages/ui/src/components/APIKeys/APIKeys.tsx | 7 ++++++- 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/react/src/experimental.ts b/packages/react/src/experimental.ts index 001206478e7..348bdfd274a 100644 --- a/packages/react/src/experimental.ts +++ b/packages/react/src/experimental.ts @@ -9,6 +9,7 @@ export type { } from '@clerk/shared/types'; export { + __experimental_useAPIKeys as useAPIKeys, __experimental_PaymentElementProvider as PaymentElementProvider, __experimental_usePaymentElement as usePaymentElement, __experimental_PaymentElement as PaymentElement, diff --git a/packages/react/src/hooks/index.ts b/packages/react/src/hooks/index.ts index 0db65cab7f7..ddd62c4fdb4 100644 --- a/packages/react/src/hooks/index.ts +++ b/packages/react/src/hooks/index.ts @@ -10,7 +10,6 @@ export { useUser, useSession, useReverification, - useAPIKeys, __experimental_useCheckout, __experimental_CheckoutProvider, __experimental_usePaymentElement, diff --git a/packages/shared/src/react/hooks/index.ts b/packages/shared/src/react/hooks/index.ts index 69cd73e01b0..9935f6b9440 100644 --- a/packages/shared/src/react/hooks/index.ts +++ b/packages/shared/src/react/hooks/index.ts @@ -1,5 +1,5 @@ export { assertContextExists, createContextAndHook } from './createContextAndHook'; -export { useAPIKeys, useAPIKeys as __experimental_useAPIKeys } from './useAPIKeys'; +export { useAPIKeys as __experimental_useAPIKeys } from './useAPIKeys'; export { useOrganization } from './useOrganization'; export { useOrganizationCreationDefaults } from './useOrganizationCreationDefaults'; export type { diff --git a/packages/shared/src/react/hooks/useAPIKeys.tsx b/packages/shared/src/react/hooks/useAPIKeys.tsx index bbbe704d19f..cff886d12c8 100644 --- a/packages/shared/src/react/hooks/useAPIKeys.tsx +++ b/packages/shared/src/react/hooks/useAPIKeys.tsx @@ -6,6 +6,9 @@ import type { PaginatedHookConfig, PaginatedResources } from '../types'; import { createCacheKeys } from './createCacheKeys'; import { usePagesOrInfinite, useWithSafeValues } from './usePagesOrInfinite'; +/** + * @internal + */ export type UseAPIKeysParams = PaginatedHookConfig< GetAPIKeysParams & { /** @@ -17,12 +20,17 @@ export type UseAPIKeysParams = PaginatedHookConfig< } >; +/** + * @internal + */ export type UseAPIKeysReturn = PaginatedResources< APIKeyResource, T extends { infinite: true } ? true : false >; /** + * @internal + * * The `useAPIKeys()` hook provides access to paginated API keys for the current user or organization. * * @example diff --git a/packages/ui/src/components/APIKeys/APIKeys.tsx b/packages/ui/src/components/APIKeys/APIKeys.tsx index 352ff251a8c..f137abff203 100644 --- a/packages/ui/src/components/APIKeys/APIKeys.tsx +++ b/packages/ui/src/components/APIKeys/APIKeys.tsx @@ -1,6 +1,11 @@ import { isClerkAPIResponseError } from '@clerk/shared/error'; import { isOrganizationId } from '@clerk/shared/internal/clerk-js/organization'; -import { useAPIKeys, __internal_useOrganizationBase, useClerk, useUser } from '@clerk/shared/react'; +import { + __experimental_useAPIKeys as useAPIKeys, + __internal_useOrganizationBase, + useClerk, + useUser, +} from '@clerk/shared/react'; import type { APIKeyResource } from '@clerk/shared/types'; import { lazy, useState } from 'react'; From b51866c18cda0f18ded7194050aa3f820ccc719d Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Fri, 13 Mar 2026 08:23:51 -0700 Subject: [PATCH 03/10] chore: clean up namespace --- packages/clerk-js/src/core/modules/apiKeys/index.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/clerk-js/src/core/modules/apiKeys/index.ts b/packages/clerk-js/src/core/modules/apiKeys/index.ts index de47ca9db91..20c1ec863e4 100644 --- a/packages/clerk-js/src/core/modules/apiKeys/index.ts +++ b/packages/clerk-js/src/core/modules/apiKeys/index.ts @@ -15,6 +15,8 @@ import { convertPageToOffsetSearchParams } from '@/utils/convertPageToOffsetSear import { APIKey, BaseResource } from '../../resources/internal'; export class APIKeys implements APIKeysNamespace { + static readonly #pathRoot = '/api_keys'; + /** * Returns the base options for the FAPI proxy requests. */ @@ -27,7 +29,7 @@ export class APIKeys implements APIKeysNamespace { return { // Set to an empty string because FAPI Proxy does not include the version in the path. pathPrefix: '', - // Set the session token as a Bearer token in the Authorization header for authentication. + // FAPI Proxy looks for the session token in the Authorization header. headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json', @@ -41,7 +43,7 @@ export class APIKeys implements APIKeysNamespace { return BaseResource._fetch({ ...(await this.#getBaseFapiProxyOptions()), method: 'GET', - path: '/api_keys', + path: APIKeys.#pathRoot, search: convertPageToOffsetSearchParams({ ...params, subject: params?.subject ?? BaseResource.clerk.organization?.id ?? BaseResource.clerk.user?.id ?? '', @@ -60,7 +62,7 @@ export class APIKeys implements APIKeysNamespace { async create(params: CreateAPIKeyParams): Promise { const json = (await BaseResource._fetch({ ...(await this.#getBaseFapiProxyOptions()), - path: '/api_keys', + path: APIKeys.#pathRoot, method: 'POST', body: JSON.stringify({ type: 'api_key', @@ -78,7 +80,7 @@ export class APIKeys implements APIKeysNamespace { const json = (await BaseResource._fetch({ ...(await this.#getBaseFapiProxyOptions()), method: 'POST', - path: `/api_keys/${params.apiKeyID}/revoke`, + path: `${APIKeys.#pathRoot}/${params.apiKeyID}/revoke`, body: JSON.stringify({ revocation_reason: params.revocationReason, }), From e11c5e88ef92f8d02cdcca111b96106375fa9fc8 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Fri, 13 Mar 2026 08:28:41 -0700 Subject: [PATCH 04/10] chore: document resolving api keys by subject --- packages/clerk-js/src/core/modules/apiKeys/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/clerk-js/src/core/modules/apiKeys/index.ts b/packages/clerk-js/src/core/modules/apiKeys/index.ts index 20c1ec863e4..77949b70ae0 100644 --- a/packages/clerk-js/src/core/modules/apiKeys/index.ts +++ b/packages/clerk-js/src/core/modules/apiKeys/index.ts @@ -39,6 +39,14 @@ export class APIKeys implements APIKeysNamespace { }; } + /** + * Retrieves a paginated list of API keys. + * + * The subject (owner) is resolved in the following order: + * 1. Explicit `subject` param (user or organization ID) + * 2. Active organization ID + * 3. Current user ID + */ async getAll(params?: GetAPIKeysParams): Promise> { return BaseResource._fetch({ ...(await this.#getBaseFapiProxyOptions()), From b56ccacce66c2f3f7825a06fb54292f41e2b5a83 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Fri, 13 Mar 2026 08:47:17 -0700 Subject: [PATCH 05/10] chore: remove experimental from hook --- packages/react/src/experimental.ts | 1 - packages/react/src/hooks/index.ts | 1 + packages/shared/src/react/hooks/index.ts | 2 +- packages/shared/src/react/hooks/useAPIKeys.tsx | 8 -------- packages/ui/src/components/APIKeys/APIKeys.tsx | 7 +------ 5 files changed, 3 insertions(+), 16 deletions(-) diff --git a/packages/react/src/experimental.ts b/packages/react/src/experimental.ts index 348bdfd274a..001206478e7 100644 --- a/packages/react/src/experimental.ts +++ b/packages/react/src/experimental.ts @@ -9,7 +9,6 @@ export type { } from '@clerk/shared/types'; export { - __experimental_useAPIKeys as useAPIKeys, __experimental_PaymentElementProvider as PaymentElementProvider, __experimental_usePaymentElement as usePaymentElement, __experimental_PaymentElement as PaymentElement, diff --git a/packages/react/src/hooks/index.ts b/packages/react/src/hooks/index.ts index ddd62c4fdb4..0db65cab7f7 100644 --- a/packages/react/src/hooks/index.ts +++ b/packages/react/src/hooks/index.ts @@ -10,6 +10,7 @@ export { useUser, useSession, useReverification, + useAPIKeys, __experimental_useCheckout, __experimental_CheckoutProvider, __experimental_usePaymentElement, diff --git a/packages/shared/src/react/hooks/index.ts b/packages/shared/src/react/hooks/index.ts index 9935f6b9440..69cd73e01b0 100644 --- a/packages/shared/src/react/hooks/index.ts +++ b/packages/shared/src/react/hooks/index.ts @@ -1,5 +1,5 @@ export { assertContextExists, createContextAndHook } from './createContextAndHook'; -export { useAPIKeys as __experimental_useAPIKeys } from './useAPIKeys'; +export { useAPIKeys, useAPIKeys as __experimental_useAPIKeys } from './useAPIKeys'; export { useOrganization } from './useOrganization'; export { useOrganizationCreationDefaults } from './useOrganizationCreationDefaults'; export type { diff --git a/packages/shared/src/react/hooks/useAPIKeys.tsx b/packages/shared/src/react/hooks/useAPIKeys.tsx index cff886d12c8..bbbe704d19f 100644 --- a/packages/shared/src/react/hooks/useAPIKeys.tsx +++ b/packages/shared/src/react/hooks/useAPIKeys.tsx @@ -6,9 +6,6 @@ import type { PaginatedHookConfig, PaginatedResources } from '../types'; import { createCacheKeys } from './createCacheKeys'; import { usePagesOrInfinite, useWithSafeValues } from './usePagesOrInfinite'; -/** - * @internal - */ export type UseAPIKeysParams = PaginatedHookConfig< GetAPIKeysParams & { /** @@ -20,17 +17,12 @@ export type UseAPIKeysParams = PaginatedHookConfig< } >; -/** - * @internal - */ export type UseAPIKeysReturn = PaginatedResources< APIKeyResource, T extends { infinite: true } ? true : false >; /** - * @internal - * * The `useAPIKeys()` hook provides access to paginated API keys for the current user or organization. * * @example diff --git a/packages/ui/src/components/APIKeys/APIKeys.tsx b/packages/ui/src/components/APIKeys/APIKeys.tsx index f137abff203..352ff251a8c 100644 --- a/packages/ui/src/components/APIKeys/APIKeys.tsx +++ b/packages/ui/src/components/APIKeys/APIKeys.tsx @@ -1,11 +1,6 @@ import { isClerkAPIResponseError } from '@clerk/shared/error'; import { isOrganizationId } from '@clerk/shared/internal/clerk-js/organization'; -import { - __experimental_useAPIKeys as useAPIKeys, - __internal_useOrganizationBase, - useClerk, - useUser, -} from '@clerk/shared/react'; +import { useAPIKeys, __internal_useOrganizationBase, useClerk, useUser } from '@clerk/shared/react'; import type { APIKeyResource } from '@clerk/shared/types'; import { lazy, useState } from 'react'; From 501c43e0c066f41d4f14a4ceebd515c7d83004aa Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Fri, 13 Mar 2026 08:49:31 -0700 Subject: [PATCH 06/10] chore: add interface tag to hook types --- packages/shared/src/react/hooks/useAPIKeys.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/shared/src/react/hooks/useAPIKeys.tsx b/packages/shared/src/react/hooks/useAPIKeys.tsx index bbbe704d19f..69bd41b552b 100644 --- a/packages/shared/src/react/hooks/useAPIKeys.tsx +++ b/packages/shared/src/react/hooks/useAPIKeys.tsx @@ -6,6 +6,9 @@ import type { PaginatedHookConfig, PaginatedResources } from '../types'; import { createCacheKeys } from './createCacheKeys'; import { usePagesOrInfinite, useWithSafeValues } from './usePagesOrInfinite'; +/** + * @interface + */ export type UseAPIKeysParams = PaginatedHookConfig< GetAPIKeysParams & { /** @@ -17,6 +20,9 @@ export type UseAPIKeysParams = PaginatedHookConfig< } >; +/** + * @interface + */ export type UseAPIKeysReturn = PaginatedResources< APIKeyResource, T extends { infinite: true } ? true : false From 27f98653bfae95ea9c213c1fba3ada72cad39f9e Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Fri, 13 Mar 2026 08:54:52 -0700 Subject: [PATCH 07/10] chore: add changeset --- .changeset/stable-api-keys.md | 43 ++++++++++++++++++++++++ packages/shared/src/react/hooks/index.ts | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 .changeset/stable-api-keys.md diff --git a/.changeset/stable-api-keys.md b/.changeset/stable-api-keys.md new file mode 100644 index 00000000000..584ecd68d79 --- /dev/null +++ b/.changeset/stable-api-keys.md @@ -0,0 +1,43 @@ +--- +"@clerk/shared": minor +"@clerk/react": minor +"@clerk/clerk-js": minor +"@clerk/ui": minor +--- + +Promote API Keys from experimental to stable. + +The `` component and `useAPIKeys()` hook are now generally available. + +### `` component + +```tsx +import { APIKeys } from '@clerk/clerk-react'; + +export default function Page() { + return ; +} +``` + +### `useAPIKeys()` hook + +```tsx +import { useAPIKeys } from '@clerk/clerk-react'; + +export default function CustomAPIKeys() { + const { data, isLoading, page, pageCount, fetchNext, fetchPrevious } = useAPIKeys({ + pageSize: 10, + initialPage: 1, + }); + + if (isLoading) return
Loading...
; + + return ( +
    + {data?.map((key) => ( +
  • {key.name}
  • + ))} +
+ ); +} +``` diff --git a/packages/shared/src/react/hooks/index.ts b/packages/shared/src/react/hooks/index.ts index 69cd73e01b0..3bc5d2b1b58 100644 --- a/packages/shared/src/react/hooks/index.ts +++ b/packages/shared/src/react/hooks/index.ts @@ -1,5 +1,5 @@ export { assertContextExists, createContextAndHook } from './createContextAndHook'; -export { useAPIKeys, useAPIKeys as __experimental_useAPIKeys } from './useAPIKeys'; +export { useAPIKeys } from './useAPIKeys'; export { useOrganization } from './useOrganization'; export { useOrganizationCreationDefaults } from './useOrganizationCreationDefaults'; export type { From 4ea024ff3b6fa01f383015189e9a98cfc82ee619 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Fri, 13 Mar 2026 08:55:53 -0700 Subject: [PATCH 08/10] chore: update changeset --- .changeset/stable-api-keys.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.changeset/stable-api-keys.md b/.changeset/stable-api-keys.md index 584ecd68d79..e07cd5c94cc 100644 --- a/.changeset/stable-api-keys.md +++ b/.changeset/stable-api-keys.md @@ -5,9 +5,7 @@ "@clerk/ui": minor --- -Promote API Keys from experimental to stable. - -The `` component and `useAPIKeys()` hook are now generally available. +API keys now generally available. ### `` component From 8d014da782234821088b66f2397c44c694568f85 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Fri, 13 Mar 2026 08:56:09 -0700 Subject: [PATCH 09/10] Update stable-api-keys.md --- .changeset/stable-api-keys.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/stable-api-keys.md b/.changeset/stable-api-keys.md index e07cd5c94cc..de1172bea4f 100644 --- a/.changeset/stable-api-keys.md +++ b/.changeset/stable-api-keys.md @@ -5,7 +5,7 @@ "@clerk/ui": minor --- -API keys now generally available. +API keys is now generally available. ### `` component From 4bc365e47c6c2a5f5ad455c210b2a0a6cb236dc2 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Fri, 13 Mar 2026 08:56:40 -0700 Subject: [PATCH 10/10] Update import paths for APIKeys and useAPIKeys --- .changeset/stable-api-keys.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/stable-api-keys.md b/.changeset/stable-api-keys.md index de1172bea4f..1da7ad36ebc 100644 --- a/.changeset/stable-api-keys.md +++ b/.changeset/stable-api-keys.md @@ -10,7 +10,7 @@ API keys is now generally available. ### `` component ```tsx -import { APIKeys } from '@clerk/clerk-react'; +import { APIKeys } from '@clerk/react'; export default function Page() { return ; @@ -20,7 +20,7 @@ export default function Page() { ### `useAPIKeys()` hook ```tsx -import { useAPIKeys } from '@clerk/clerk-react'; +import { useAPIKeys } from '@clerk/react'; export default function CustomAPIKeys() { const { data, isLoading, page, pageCount, fetchNext, fetchPrevious } = useAPIKeys({