import { BookOpenIcon } from "@heroicons/react/20/solid"; import { type MetaFunction } from "@remix-run/react"; import { typedjson, useTypedLoaderData } from "remix-typedjson"; import { AdminDebugTooltip } from "~/components/admin/debugTooltip"; import { CodeBlock } from "~/components/code/CodeBlock"; import { InlineCode } from "~/components/code/InlineCode"; import { EnvironmentCombo, environmentFullTitle, environmentTextClassName, } from "~/components/environments/EnvironmentLabel"; import { RegenerateApiKeyModal } from "~/components/environments/RegenerateApiKeyModal"; import { MainHorizontallyCenteredContainer, PageBody, PageContainer, } from "~/components/layout/AppLayout"; import { PermissionDenied } from "~/components/PermissionDenied"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "~/components/primitives/Accordion"; import { LinkButton } from "~/components/primitives/Buttons"; import { Callout } from "~/components/primitives/Callout"; import { ClipboardField } from "~/components/primitives/ClipboardField"; import { Header2 } from "~/components/primitives/Headers"; import { Hint } from "~/components/primitives/Hint"; import { InputGroup } from "~/components/primitives/InputGroup"; import { Label } from "~/components/primitives/Label"; import { NavBar, PageAccessories, PageTitle } from "~/components/primitives/PageHeader"; import * as Property from "~/components/primitives/PropertyTable"; import { useOrganization } from "~/hooks/useOrganizations"; import { resolveOrgIdFromSlug } from "~/models/organization.server"; import { ApiKeysPresenter } from "~/presenters/v3/ApiKeysPresenter.server"; import { dashboardLoader } from "~/services/routeBuilders/dashboardBuilder"; import { cn } from "~/utils/cn"; import { docsPath, EnvironmentParamSchema } from "~/utils/pathBuilder"; export const meta: MetaFunction = () => { return [ { title: `API keys | Trigger.dev`, }, ]; }; export const loader = dashboardLoader( { params: EnvironmentParamSchema, context: async (params) => { const organizationId = await resolveOrgIdFromSlug(params.organizationSlug); return organizationId ? { organizationId } : {}; }, // No hard authorization: anyone with project access can open the page. // Reading the secret key is gated per environment tier below — a role // that can't read this tier's keys gets the info panel, not the key. }, async ({ params, user, ability }) => { const { projectParam, envParam } = params; try { const presenter = new ApiKeysPresenter(); const { environment, hasVercelIntegration } = await presenter.call({ userId: user.id, projectSlug: projectParam, environmentSlug: envParam, }); const canReadApiKeys = !environment || ability.can("read", { type: "apiKeys", envType: environment.type }); return typedjson({ // Never serialize the secret key to the client when the role can't // read it for this environment tier. environment: environment && !canReadApiKeys ? { ...environment, apiKey: "" } : environment, hasVercelIntegration, canReadApiKeys, }); } catch (error) { console.error(error); throw new Response(undefined, { status: 400, statusText: "Something went wrong, if this problem persists please contact support.", }); } } ); export default function Page() { const { environment, hasVercelIntegration, canReadApiKeys } = useTypedLoaderData(); const _organization = useOrganization(); if (!environment) { throw new Response(undefined, { status: 404, statusText: "Environment not found", }); } let envBlock = `TRIGGER_SECRET_KEY="${environment.apiKey}"`; if (environment.branchName) { envBlock += `\nTRIGGER_PREVIEW_BRANCH="${environment.branchName}"`; } return ( {environment.slug} {environment.id} API keys docs
API keys
{canReadApiKeys ? (
Set this as your TRIGGER_SECRET_KEY{" "} env var in your backend.
{environment.branchName && ( Set this as your{" "} TRIGGER_PREVIEW_BRANCH env var in your backend. )} {environment.type === "DEVELOPMENT" && ( Every team member gets their own dev Secret key. Make sure you're using the one above otherwise you will trigger runs on your team member's machine. )} How to set these environment variables
You need to set these environment variables in your backend. This allows the SDK to authenticate with Trigger.dev.
) : ( )}
); }