Create Apps and API keys in the Relay Dashboard to authenticate requests and manage your rate limits
Relay enforces rate limits to keep the platform reliable for every integrator. You manage API keys in the Relay Dashboard — create new API keys, rotate existing ones, and inspect individual requests. Default limits listed below apply to self-serve API keys.
An App represents one integration, for example a product or an environment. The App owns the configuration that Relay applies to that integration: the rate limit tier, features, the webhook, IP and origin restrictions, the fee sponsorship wallet, and App Fees settings. An API key is a credential that authenticates requests for one App. All keys in an App use the App’s configuration.An App can have a maximum of two active API keys. You manage Apps and their keys in the Relay Dashboard. You need the admin role in your Dashboard organization to create Apps and keys.
Rotate a key to replace it without downtime and without reconfiguration. The replacement key is in the same App, so it uses the App’s configuration immediately. The old key continues to work until you deactivate it.
If the App has no active key, click Create an API key under API keys.
If the App has one active key, rotate it:
Open Apps and select the App.
Under API keys, open the actions menu on the key and select Rotate Key.
Click Rotate API key, then optionally rename the new key and click Save.
Change your integration to use the new key. When the old key’s in-progress requests are complete, deactivate the old key from the same menu.
If the App has two active keys, deactivate one key first.
If your App uses a webhook, accept signatures from both keys until you deactivate the old key.
Create a separate App per environment (production, staging, local). Each environment then gets its own configuration and request history, so you can spot a misbehaving deploy without deactivating the wrong key.
The Relay Dashboard is also where you observe what your integration is doing in production:
Requests — full history of quotes and intents for each App, with status, route, amounts, and timing.
Advanced filtering — narrow the table by chain, currency, amount, status, time, and more, combining conditions with AND/OR logic to isolate exactly the requests you care about.
Custom views — save any combination of filters, sort order, and columns as a reusable view for your team, each with its own name, icon, and color.
Apps — create Apps, and rename, rotate, and deactivate their API keys.
Webhooks — configure a per-App webhook endpoint so transaction status updates are pushed to your backend instead of polling.
When debugging a specific transaction, paste the requestId from your application into the dashboard’s search to jump straight to the matching record.
Higher limits are available on request. They apply per App:
Endpoint
Limit
/quote
50 requests per second
/requests/v3
20 requests per second
/requests
5 requests per second
/transactions/status
10 requests per second
/authorize
5 requests per minute per (API key, wallet), with a 30 requests per minute aggregate ceiling per API key
Other endpoints
200 requests per minute
/requests and /requests/v2 share the 5 rps bucket; /requests/v3 has its own 20 rps bucket./authorize is bucketed by the wallet field in the request body alongside your API key, so concurrent authorizations from different end-users don’t compete for the same bucket. The aggregate per-key ceiling still applies across all wallets and bounds total volume of the on-chain authorization path.To request higher limits, get in touch through the support widget in the Relay Dashboard.
Already hitting a limit? See Handling Rate Limits for how to recover from 429 responses and reduce your request volume before requesting an upgrade.
Quote requests that set a referrer must be authenticated: pass your API key in the x-api-key header on POST /quote and POST /quote/v2. Requests with a referrer but no valid key return 401 with errorCode: "UNAUTHORIZED_QUOTE". Starting October 2, 2026, every quote/v2 request will require a valid API key. quote/v2 remains fully supported for authenticated requests.
// Set apiKey only when using the SDK server-side.import { createClient, MAINNET_RELAY_API,} from "@relayprotocol/relay-sdk";createClient({ baseApiUrl: MAINNET_RELAY_API, apiKey: "YOUR_API_KEY", // ...other parameters});
// Or pass the key per-call via the headers parameter.import { getClient } from "@relayprotocol/relay-sdk";const quoteParams = { /* ... */ };const quote = await getClient()?.actions.getQuote(quoteParams, undefined, { "x-api-key": "YOUR_API_KEY",});
If you’re calling the SDK from the browser, stand up a proxy that appends the key server-side and point baseApiUrl at it. This keeps the key out of client bundles and keeps your App’s rate limits.
import { createClient, MAINNET_RELAY_API,} from "@relayprotocol/relay-sdk";createClient({ baseApiUrl: "https://my-proxy.relay.link", // Replace with your proxy endpoint // ...other parameters});
Treat your API key like a password. A person who has your key can make requests as your App. These requests use your App’s rate limits and are attributed to you.
If your key is leaked, anyone holding it can consume your rate limits or make requests on your behalf. If you think that a key is compromised, rotate it in the Relay Dashboard. Change your integration to use the replacement key. Then deactivate the compromised key. Do not activate it again.
Best practices:
Keep it server-side only — never expose it in client-side or frontend code. Use a proxy API if calling Relay from the browser.
Use environment variables — store the key in environment variables, not hardcoded in source code.
Don’t commit it to version control — add it to .gitignore or use a secrets manager.
Restrict access — only share the key with team members who need it.
Rotate keys — rotate a key on a regular schedule. Also rotate it immediately when a team member with access leaves.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Relay","colors":{"primary":"#4615C8","light":"#A7AAFF","dark":"#4615C8"},"logo":{"light":"https://mintcdn.com/unevenlabs/Gbv82V37Oid9F6eG/logo/relay-black.svg?fit=max\u0026auto=format\u0026n=Gbv82V37Oid9F6eG\u0026q=85\u0026s=7983e6e441ff77eeac7e17c03c2d0e8c","dark":"https://mintcdn.com/unevenlabs/Gbv82V37Oid9F6eG/logo/relay-white.svg?fit=max\u0026auto=format\u0026n=Gbv82V37Oid9F6eG\u0026q=85\u0026s=fbdcf916b96f42397c1470872ab80cda"},"favicon":"https://mintcdn.com/unevenlabs/f--GnNtyUvuqA2AW/favicon.png?fit=max\u0026auto=format\u0026n=f--GnNtyUvuqA2AW\u0026q=85\u0026s=d40a0a20b4bf062cea218d7eed38c576","api":{"openapi":["https://api.relay.link/documentation/json"],"examples":{"defaults":"required","languages":["curl","javascript","python"],"prefill":false},"mdx":{"server":["https://api.relay.link","https://api.testnets.relay.link"]}},"appearance":{"default":"light"},"navbar":{"links":[{"href":"https://support.relay.link/en/","label":"Support"},{"href":"https://forms.gle/XNeELYavjwoJwPEf7","label":"Get in Touch"}],"primary":{"type":"button","label":"Try Relay","href":"https://www.relay.link/"}},"footer":{"socials":{"twitter":"https://twitter.com/RelayProtocol"}},"integrations":{"intercom":{"appId":"b09ps4q8"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"unevenlabs","hasAudioNarration":false,"actualSubdomain":"unevenlabs","customDomains":["docs.relay.link"],"gitSource":{"type":"github","owner":"relayprotocol","repo":"relay-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adf9193b66836487c227e5c","collectionId":"f9136a60-3e64-48a8-a6fd-f6f0d74685ee","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adf9193b66836487c227e5c"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6adfe5bf7c136a80fb7e24f1","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"API Reference","count":97},{"language":"default","tag":"RelayKit","count":48},{"language":"default","tag":"Relay Platform","count":29},{"language":"default","tag":"Relay Protocol","count":29},{"language":"default","tag":"Settlement","count":17},{"language":"default","tag":"Integration Guides","count":13},{"language":"default","tag":"Vaults","count":12},{"language":"default","tag":"Core Concepts","count":11},{"language":"default","tag":"SDK","count":11},{"language":"default","tag":"Features","count":9}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@keyframes rotation{0%{transform:rotate(0deg)}to{transform:rotate(360deg)}}#navbar a[href*=\"/references\"]{padding-left:18px;padding-right:18px}.card-link{color:var(--tw-prose-links);text-decoration:none;font-weight:600;margin-top:10px;display:inline-block;margin-right:5px;border-bottom:1px solid transparent}.card-link:hover{border-bottom:1px solid rgb(var(--primary-light))}#ui-kit-overview-cards a>div>div:first-child{float:left;margin-right:12px}#ui-kit-overview-cards a>div h2{margin:0;display:inline}.relay-table{td:not(:first-child) {\n padding-left: 24px;\n }\n\n th:not(:first-child) {\n padding-left: 24px;\n }\n\n .chain-icon-light {\n display: block;\n }\n\n .chain-icon-dark {\n display: none;\n }}.dark .relay-table .chain-icon-light{display:none}.dark .relay-table .chain-icon-dark{display:block}#\\/references\\/api\\/advanced,#\\/references\\/api\\/core,#\\/references\\/api\\/utilities{pointer-events:none;font-weight:700}.loader{width:48px;height:48px;border:5px solid rgb(70 21 200);border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:rotation 1s linear infinite}#body-amount [data-component-part=field-info-pill]:has(>span.text-gray-400),#body-destination-chain-id [data-component-part=field-info-pill]:has(>span.text-gray-400),#body-destination-currency [data-component-part=field-info-pill]:has(>span.text-gray-400),#body-origin-chain-id [data-component-part=field-info-pill]:has(>span.text-gray-400),#body-origin-currency [data-component-part=field-info-pill]:has(>span.text-gray-400),#body-trade-type [data-component-part=field-info-pill]:has(>span.text-gray-400),#body-user [data-component-part=field-info-pill]:has(>span.text-gray-400){display:none}#custom-vm-quicksets{display:flex;gap:10px;margin-top:10px;margin-left:16px;border-bottom:1px solid;border-color:rgb(var(--gray-200)/.7);padding-bottom:16px}#custom-vm-quicksets button{border-radius:4px;overflow:hidden;border:0;cursor:pointer;transition:opacity .2s ease;opacity:1}#custom-vm-quicksets button img{width:32px;height:32px}#custom-vm-quicksets button:hover,.homepage-card:hover .homepage-card-link{opacity:.8}#custom-vm-quicksets-intro{font-weight:600;margin-top:20px;margin-left:16px}#hyperliquid-button{background-color:#fff;padding:2px;max-height:32px}body:has(.homepage-bg) .nav-tabs-item[href=\"/what-is-relay\"]{color:rgb(75 85 99)!important;text-shadow:none!important}.dark body:has(.homepage-bg) .nav-tabs-item[href=\"/what-is-relay\"],body.dark:has(.homepage-bg) .nav-tabs-item[href=\"/what-is-relay\"]{color:rgb(156 163 175)!important}body:has(.homepage-bg) .nav-tabs-item[href=\"/what-is-relay\"]>div{background:0 0!important}.homepage-bg{width:100%;height:40vh;position:relative;background:var(--Violet-Light-9, #4615C8);pointer-events:none}.homepage-cards{display:flex;gap:24px;margin:40px 50px;justify-content:center}.homepage-card{min-height:200px;padding:24px;border-radius:12px;border:1px solid rgba(0,0,0,.1);background-color:#fff;text-decoration:none;color:inherit;display:flex;flex-direction:column;gap:12px;max-width:300px;transition:background-color .2s,border-color .2s}.dark .homepage-card{border:1px solid rgba(255,255,255,.1);background-color:#1a1a1a}.homepage-card h3{font-size:18px;font-weight:700;color:#000;margin:0 0 -8px}.dark .homepage-card h3{color:#fff}.homepage-card-description{margin:0 0 40px;font-size:14px;color:#666;line-height:1.5}.dark .homepage-card-description{color:#999}.homepage-card-link{font-size:14px;color:#4615c8;font-weight:500;margin-top:auto}.dark .homepage-card-link{color:#a78bfa}.relay-checkbox{appearance:none;-webkit-appearance:none;width:12px;height:12px;border:1px solid #c8ccff;border-radius:3px;background-color:#f7f8ff;cursor:pointer;position:relative;transition:all .15s ease;flex-shrink:0}.relay-checkbox:hover{border-color:#b4b8ff;background-color:#eff1ff}.relay-checkbox:focus{outline:0;border-color:#4615c8;box-shadow:0 0 0 2px rgba(70,21,200,.15)}.relay-checkbox:checked{background-color:#4615c8;border-color:#4615c8}.relay-checkbox:checked:hover{background-color:#3b00b4;border-color:#3b00b4}.relay-checkbox:checked::after{content:'';position:absolute;left:3px;top:0;width:4px;height:7px;border:solid #fff;border-width:0 1.5px 1.5px 0;transform:rotate(45deg)}.relay-checkbox:disabled{cursor:not-allowed;opacity:.5;background-color:#eff1ff;border-color:#d7dbff}.dark .relay-checkbox{background-color:#141331;border-color:#4016b8}.dark .relay-checkbox:hover{border-color:#4c24d1;background-color:#216}.dark .relay-checkbox:focus{border-color:#5b2af9;box-shadow:0 0 0 2px rgba(91,42,249,.25)}.dark .relay-checkbox:checked{background-color:#4615c8;border-color:#4615c8}.dark .relay-checkbox:checked:hover{background-color:#3901aa;border-color:#3901aa}.dark .relay-checkbox:disabled{background-color:#216;border-color:#4016b8}.callout .prose>:first-child{margin-top:0}[data-cl-filter-bar]{position:sticky;top:var(--cl-sticky-top, 5rem);z-index:20;display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:12px 0;margin-bottom:20px;border-bottom:1px solid var(--gray-200)}.dark [data-cl-filter-bar]{border-bottom-color:rgb(55 65 81)}div:has(>[data-component-part=update-label]){top:calc(var(--scroll-mt, 5rem) + var(--cl-bar-height, 0px))}[data-cl-filter-bar] button,[data-component-part=update-tag]{cursor:pointer;padding:2px 8px;border:1px solid var(--gray-200);border-radius:9999px;transition:border-color .15s,color .15s,background-color .15s}[data-cl-filter-bar] button{font-size:.875rem;font-weight:500;line-height:1.5;color:rgb(107 114 128);background:0 0}[data-cl-filter-bar] button:hover,[data-cl-filter-bar] button[data-cl-active=true],[data-component-part=update-tag]:hover,[data-component-part=update-tag][data-cl-active=true]{border-color:rgb(var(--primary)/var(--tw-text-opacity, 1));color:rgb(var(--primary)/var(--tw-text-opacity, 1))}[data-cl-filter-bar] button[data-cl-active=true],[data-component-part=update-tag][data-cl-active=true]{background:rgb(var(--primary)/.08)}.dark [data-cl-filter-bar] button,.dark [data-component-part=update-tag]{border-color:rgb(55 65 81);color:rgb(156 163 175)}.dark [data-cl-filter-bar] button:hover,.dark [data-cl-filter-bar] button[data-cl-active=true],.dark [data-component-part=update-tag]:hover,.dark [data-component-part=update-tag][data-cl-active=true]{border-color:rgb(var(--primary-light));color:rgb(var(--primary-light))}.dark [data-cl-filter-bar] button[data-cl-active=true],.dark [data-component-part=update-tag][data-cl-active=true]{background:rgb(var(--primary-light)/.14)}"}],"page":{"pagePath":"references/api/api-keys","slug":"/references/api/api-keys","pageMetadata":{"title":"Apps, API keys, and Rate Limits","description":"Create Apps and API keys in the Relay Dashboard to authenticate requests and manage your rate limits","href":"/references/api/api-keys"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Create Apps and API keys in the Relay Dashboard to authenticate requests and manage your rate limits\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,CodeGroup,Heading,Table,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Relay enforces rate limits to keep the platform reliable for every integrator. You manage API keys in the `,_jsx(_components.a,{href:`https://dashboard.relay.link`,children:`Relay Dashboard`}),` — create new API keys, rotate existing ones, and inspect individual requests. Default limits listed below apply to self-serve API keys.`]}),`\n`,_jsx(Heading,{level:`2`,id:`apps-and-api-keys`,children:`Apps and API keys`}),`\n`,_jsxs(_components.p,{children:[`An App represents one integration, for example a product or an environment. The App owns the configuration that Relay applies to that integration: the rate limit tier, features, the webhook, IP and origin restrictions, the fee sponsorship wallet, and `,_jsx(_components.a,{href:`/features/app-fees`,children:`App Fees`}),` settings. An API key is a credential that authenticates requests for one App. All keys in an App use the App’s configuration.`]}),`\n`,_jsxs(_components.p,{children:[`An App can have a maximum of two active API keys. You manage Apps and their keys in the `,_jsx(_components.a,{href:`https://dashboard.relay.link`,children:`Relay Dashboard`}),`. You need the admin role in your Dashboard organization to create Apps and keys.`]}),`\n`,_jsx(Heading,{level:`3`,id:`create-an-app`,children:`Create an App`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Sign in to the `,_jsx(_components.a,{href:`https://dashboard.relay.link`,children:`Relay Dashboard`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Apps`}),` in the sidebar.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Create an App`}),`, enter a name (e.g. `,_jsx(_components.code,{children:`Production`}),`, `,_jsx(_components.code,{children:`Staging`}),`), and click `,_jsx(_components.strong,{children:`Create`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Relay creates the App with its first API key, named after the App. The App page opens with the key listed under `,_jsx(_components.strong,{children:`API keys`}),`, where you can copy it.`]}),`\n`,_jsx(Heading,{level:`3`,id:`add-or-rotate-an-api-key`,children:`Add or rotate an API key`}),`\n`,_jsx(_components.p,{children:`Rotate a key to replace it without downtime and without reconfiguration. The replacement key is in the same App, so it uses the App’s configuration immediately. The old key continues to work until you deactivate it.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`If the App has no active key, click `,_jsx(_components.strong,{children:`Create an API key`}),` under `,_jsx(_components.strong,{children:`API keys`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`If the App has one active key, rotate it:`,`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Apps`}),` and select the App.`]}),`\n`,_jsxs(_components.li,{children:[`Under `,_jsx(_components.strong,{children:`API keys`}),`, open the actions menu on the key and select `,_jsx(_components.strong,{children:`Rotate Key`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Rotate API key`}),`, then optionally rename the new key and click `,_jsx(_components.strong,{children:`Save`}),`.`]}),`\n`,_jsx(_components.li,{children:`Change your integration to use the new key. When the old key’s in-progress requests are complete, deactivate the old key from the same menu.`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.li,{children:`If the App has two active keys, deactivate one key first.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`If your App uses a `,_jsx(_components.a,{href:`/references/api/api_guides/webhooks#verification`,children:`webhook`}),`, accept signatures from both keys until you deactivate the old key.`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Create a separate App per environment (production, staging, local). Each environment then gets its own configuration and request history, so you can spot a misbehaving deploy without deactivating the wrong key.`})}),`\n`,_jsx(Heading,{level:`2`,id:`tracking-requests`,children:`Tracking requests`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`https://dashboard.relay.link`,children:`Relay Dashboard`}),` is also where you observe what your integration is doing in production:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Requests`}),` — full history of quotes and intents for each App, with status, route, amounts, and timing.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Advanced filtering`}),` — narrow the table by chain, currency, amount, status, time, and more, combining conditions with AND/OR logic to isolate exactly the requests you care about.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Custom views`}),` — save any combination of filters, sort order, and columns as a reusable view for your team, each with its own name, icon, and color.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Apps`}),` — create Apps, and rename, rotate, and deactivate their API keys.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Webhooks`}),` — configure a per-App `,_jsx(_components.a,{href:`/references/api/api_guides/webhooks`,children:`webhook endpoint`}),` so transaction status updates are pushed to your backend instead of polling.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`When debugging a specific transaction, paste the `,_jsx(_components.code,{children:`requestId`}),` from your application into the dashboard’s search to jump straight to the matching record.`]}),`\n`,_jsx(Heading,{level:`2`,id:`default-rate-limits`,children:`Default Rate Limits`}),`\n`,_jsx(_components.p,{children:`The following limits apply per App. All API keys in the App share these limits:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Limit`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/quote`})}),_jsx(_components.td,{children:`50 requests per minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/requests`})}),_jsx(_components.td,{children:`100 requests per minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/requests/v3`})}),_jsx(_components.td,{children:`200 requests per minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/transactions/status`})}),_jsx(_components.td,{children:`200 requests per minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Other endpoints`}),_jsx(_components.td,{children:`200 requests per minute`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`elevated-rate-limits`,children:`Elevated Rate Limits`}),`\n`,_jsx(_components.p,{children:`Higher limits are available on request. They apply per App:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Limit`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/quote`})}),_jsx(_components.td,{children:`50 requests per second`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/requests/v3`})}),_jsx(_components.td,{children:`20 requests per second`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/requests`})}),_jsx(_components.td,{children:`5 requests per second`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/transactions/status`})}),_jsx(_components.td,{children:`10 requests per second`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/authorize`})}),_jsxs(_components.td,{children:[`5 requests per minute per `,_jsx(_components.code,{children:`(API key, wallet)`}),`, with a 30 requests per minute aggregate ceiling per API key`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Other endpoints`}),_jsx(_components.td,{children:`200 requests per minute`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`/requests`}),` and `,_jsx(_components.code,{children:`/requests/v2`}),` share the 5 rps bucket; `,_jsx(_components.code,{children:`/requests/v3`}),` has its own 20 rps bucket.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`/authorize`}),` is bucketed by the `,_jsx(_components.code,{children:`wallet`}),` field in the request body alongside your API key, so concurrent authorizations from different end-users don’t compete for the same bucket. The aggregate per-key ceiling still applies across all wallets and bounds total volume of the on-chain authorization path.`]}),`\n`,_jsxs(_components.p,{children:[`To request higher limits, get in touch through the support widget in the `,_jsx(_components.a,{href:`https://dashboard.relay.link`,children:`Relay Dashboard`}),`.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Already hitting a limit? See `,_jsx(_components.a,{href:`/references/api/api_core_concepts/handling-rate-limits`,children:`Handling Rate Limits`}),` for how to recover from `,_jsx(_components.code,{children:`429`}),` responses and reduce your request volume before requesting an upgrade.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`how-to-use-an-api-key`,children:`How to Use an API key`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Quote requests that set a `,_jsx(_components.code,{children:`referrer`}),` must be authenticated: pass your API key in the `,_jsx(_components.code,{children:`x-api-key`}),` header on `,_jsx(_components.code,{children:`POST /quote`}),` and `,_jsx(_components.code,{children:`POST /quote/v2`}),`. Requests with a referrer but no valid key return `,_jsx(_components.code,{children:`401`}),` with `,_jsx(_components.code,{children:`errorCode: \"UNAUTHORIZED_QUOTE\"`}),`. Starting `,_jsx(_components.strong,{children:`October 2, 2026`}),`, every `,_jsx(_components.code,{children:`quote/v2`}),` request will require a valid API key. `,_jsx(_components.code,{children:`quote/v2`}),` remains fully supported for authenticated requests.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`http-requests`,children:`HTTP requests`}),`\n`,_jsx(_components.p,{children:`Pass the key in the request headers on every request:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`x-api-key: YOUR_API_KEY`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`sdk-usage`,children:`SDK usage`}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`Global API key`,numberOfLines:`11`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Set apiKey only when using the SDK server-side.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` createClient`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` MAINNET_RELAY_API`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`} `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"@relayprotocol/relay-sdk\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`createClient`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` baseApiUrl:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` MAINNET_RELAY_API`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` apiKey:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"YOUR_API_KEY\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // ...other parameters`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`SDK action API key`,numberOfLines:`8`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Or pass the key per-call via the headers parameter.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`getClient`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"@relayprotocol/relay-sdk\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` quoteParams`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`/* ... */`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` };`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` quote`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` getClient`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()?.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`actions`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getQuote`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`quoteParams`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`undefined`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"x-api-key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"YOUR_API_KEY\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})})]}),`\n`,_jsx(Heading,{level:`3`,id:`proxy-api`,children:`Proxy API`}),`\n`,_jsxs(_components.p,{children:[`If you’re calling the SDK from the browser, stand up a proxy that appends the key server-side and point `,_jsx(_components.code,{children:`baseApiUrl`}),` at it. This keeps the key out of client bundles and keeps your App’s rate limits.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` createClient`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` MAINNET_RELAY_API`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`} `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"@relayprotocol/relay-sdk\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`createClient`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` baseApiUrl:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://my-proxy.relay.link\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Replace with your proxy endpoint`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // ...other parameters`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`keeping-your-api-key-secure`,children:`Keeping Your API key Secure`}),`\n`,_jsx(_components.p,{children:`Treat your API key like a password. A person who has your key can make requests as your App. These requests use your App’s rate limits and are attributed to you.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`If your key is leaked, anyone holding it can consume your rate limits or make requests on your behalf. If you think that a key is compromised, `,_jsx(_components.a,{href:`#add-or-rotate-an-api-key`,children:`rotate it`}),` in the `,_jsx(_components.a,{href:`https://dashboard.relay.link`,children:`Relay Dashboard`}),`. Change your integration to use the replacement key. Then deactivate the compromised key. Do not activate it again.`]})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Best practices:`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Keep it server-side only`}),` — never expose it in client-side or frontend code. Use a `,_jsx(_components.a,{href:`#proxy-api`,children:`proxy API`}),` if calling Relay from the browser.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Use environment variables`}),` — store the key in environment variables, not hardcoded in source code.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Don’t commit it to version control`}),` — add it to `,_jsx(_components.code,{children:`.gitignore`}),` or use a secrets manager.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Restrict access`}),` — only share the key with team members who need it.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Rotate keys`}),` — `,_jsx(_components.a,{href:`#add-or-rotate-an-api-key`,children:`rotate a key`}),` on a regular schedule. Also rotate it immediately when a team member with access leaves.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Apps, API keys, and Rate Limits","description":"Create Apps and API keys in the Relay Dashboard to authenticate requests and manage your rate limits","href":"/references/api/api-keys"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Apps and API keys","slug":"apps-and-api-keys","depth":2,"children":[{"title":"Create an App","slug":"create-an-app","depth":3,"children":[]},{"title":"Add or rotate an API key","slug":"add-or-rotate-an-api-key","depth":3,"children":[]}]},{"title":"Tracking requests","slug":"tracking-requests","depth":2,"children":[]},{"title":"Default Rate Limits","slug":"default-rate-limits","depth":2,"children":[]},{"title":"Elevated Rate Limits","slug":"elevated-rate-limits","depth":2,"children":[]},{"title":"How to Use an API key","slug":"how-to-use-an-api-key","depth":2,"children":[{"title":"HTTP requests","slug":"http-requests","depth":3,"children":[]},{"title":"SDK usage","slug":"sdk-usage","depth":3,"children":[]},{"title":"Proxy API","slug":"proxy-api","depth":3,"children":[]}]},{"title":"Keeping Your API key Secure","slug":"keeping-your-api-key-secure","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/unevenlabs/e205e0c83de02f5e/script.js","/_mintlify/custom/unevenlabs/90d7a6a8bc7d1a3b/content/intercom-opener.js","/_mintlify/custom/unevenlabs/a13c5467619df0df/iframe-resizer.js","/_mintlify/custom/unevenlabs/411e1fdad39a2d9e/posthog.js","/_mintlify/custom/unevenlabs/9cf2d871386c2976/playground-enhancer.js"],"subdomain":"unevenlabs","siteName":"Relay","title":"Apps, API keys, and Rate Limits - Relay","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-23T16:10:08.108Z","originalFileLocation":"references/api/api-keys.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Create Apps and API keys in the Relay Dashboard to authenticate requests and manage your rate limits\">\u003cmeta data-mint-head name=\"application-name\" content=\"Relay\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/unevenlabs/P-TdogRhaTE5DlJS/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/unevenlabs/P-TdogRhaTE5DlJS/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/unevenlabs/P-TdogRhaTE5DlJS/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/unevenlabs/P-TdogRhaTE5DlJS/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/unevenlabs/P-TdogRhaTE5DlJS/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/unevenlabs/P-TdogRhaTE5DlJS/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/unevenlabs/P-TdogRhaTE5DlJS/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/unevenlabs/P-TdogRhaTE5DlJS/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/unevenlabs/P-TdogRhaTE5DlJS/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Apps, API keys, and Rate Limits - Relay\">\u003cmeta data-mint-head property=\"og:description\" content=\"Create Apps and API keys in the Relay Dashboard to authenticate requests and manage your rate limits\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Relay\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.relay.link/references/api/api-keys\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://unevenlabs.mintlify.app/_mintlify/api/og/v2?division=+\u0026amp;title=Apps%2C+API+keys%2C+and+Rate+Limits\u0026amp;description=Create+Apps+and+API+keys+in+the+Relay+Dashboard+to+authenticate+requests+and+manage+your+rate+limits\u0026amp;theme=bb8130bdebc4204a02b71ad8\u0026amp;signature=a863b167638347c4be1a5c23fd216ec3e8eb0e6c533af47d884c3e0fc7e3f20a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Apps, API keys, and Rate Limits - Relay\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Create Apps and API keys in the Relay Dashboard to authenticate requests and manage your rate limits\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://unevenlabs.mintlify.app/_mintlify/api/og/v2?division=+\u0026amp;title=Apps%2C+API+keys%2C+and+Rate+Limits\u0026amp;description=Create+Apps+and+API+keys+in+the+Relay+Dashboard+to+authenticate+requests+and+manage+your+rate+limits\u0026amp;theme=bb8130bdebc4204a02b71ad8\u0026amp;signature=a863b167638347c4be1a5c23fd216ec3e8eb0e6c533af47d884c3e0fc7e3f20a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/unevenlabs/P-TdogRhaTE5DlJS/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Relay\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4615C8\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.relay.link/references/api/api-keys\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/references/api/api-keys.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.relay.link/#organization\",\"name\":\"Relay\",\"url\":\"https://docs.relay.link\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/unevenlabs/Gbv82V37Oid9F6eG/logo/relay-black.svg?fit=max\u0026auto=format\u0026n=Gbv82V37Oid9F6eG\u0026q=85\u0026s=7983e6e441ff77eeac7e17c03c2d0e8c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.relay.link#website\",\"name\":\"Relay\",\"url\":\"https://docs.relay.link\",\"publisher\":{\"@id\":\"https://docs.relay.link/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.relay.link/references/api/api-keys#webpage\",\"url\":\"https://docs.relay.link/references/api/api-keys\",\"name\":\"Apps, API keys, and Rate Limits\",\"description\":\"Create Apps and API keys in the Relay Dashboard to authenticate requests and manage your rate limits\",\"dateModified\":\"2026-10-23T16:10:08.108Z\",\"isPartOf\":{\"@id\":\"https://docs.relay.link#website\"},\"breadcrumb\":{\"@id\":\"https://docs.relay.link/references/api/api-keys#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.relay.link/references/api/api-keys#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\" \",\"item\":\"https://docs.relay.link/references/api/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Apps, API keys, and Rate Limits\",\"item\":\"https://docs.relay.link/references/api/api-keys\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.relay.link/references/api/api-keys#article\",\"headline\":\"Apps, API keys, and Rate Limits\",\"name\":\"Apps, API keys, and Rate Limits\",\"description\":\"Create Apps and API keys in the Relay Dashboard to authenticate requests and manage your rate limits\",\"url\":\"https://docs.relay.link/references/api/api-keys\",\"mainEntityOfPage\":{\"@id\":\"https://docs.relay.link/references/api/api-keys#webpage\"},\"dateModified\":\"2026-10-23T16:10:08.108Z\",\"publisher\":{\"@id\":\"https://docs.relay.link/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.relay.link#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Relay\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Relay","nav":{"global":null,"tabs":[{"tab":"Relay Platform","pages":[{"title":"Relay Platform","href":"/what-is-relay"}]},{"tab":"API Reference","groups":[{"group":" ","pages":[{"title":"API Overview","href":"/references/api/overview"},{"title":"Quickstart","description":"Execute your first cross-chain transaction in under 5 minutes.","href":"/references/api/quickstart"},{"title":"Apps, API keys, and Rate Limits","href":"/references/api/api-keys"},{"group":"Core Concepts","pages":[{"title":"Understanding Step Execution","description":"How step execution works when driving Relay directly from the API","href":"/references/api/api_core_concepts/step-execution"},{"title":"Wallet Detection","href":"/references/api/api_core_concepts/wallet-detection"},{"title":"Cost \u0026 Fee Structure","href":"/references/api/api_core_concepts/fees"},{"title":"Refunds","href":"/references/api/api_core_concepts/refunds"},{"title":"Input Validation","href":"/references/api/api_core_concepts/input-validation"},{"title":"Trade Types","href":"/references/api/api_core_concepts/trade-types"},{"title":"Surplus \u0026 Shortage","href":"/references/api/api_core_concepts/surplus-and-shortage"},{"title":"Handling Quote Errors","href":"/references/api/api_core_concepts/handling-errors"},{"title":"Handling Rate Limits","href":"/references/api/api_core_concepts/handling-rate-limits"},{"title":"Handling Execution Errors","href":"/references/api/api_core_concepts/execution-errors"},{"title":"Contract Compatibility","href":"/references/api/api_core_concepts/contract-compatibility"}]},{"group":"Integration Guides","pages":[{"title":"Bridging Integration Guide","href":"/references/api/api_guides/bridging-integration-guide"},{"title":"Call Execution Integration Guide","href":"/references/api/api_guides/calling-integration-guide"},{"title":"Transaction Indexing","href":"/references/api/api_guides/transaction-indexing"},{"title":"Base Builder Codes","href":"/references/api/api_guides/builder-codes"},{"title":"Smart Accounts in Relay","href":"/references/api/api_guides/smart-accounts"},{"group":"Chain Support Guides","pages":[{"title":"Testnet Support","href":"/references/api/api_guides/testnet"},{"title":"Solana Support","href":"/references/api/api_guides/solana"},{"title":"Bitcoin Support","href":"/references/api/api_guides/bitcoin"},{"title":"Hyperliquid Support","href":"/references/api/api_guides/hyperliquid-support"},{"title":"Lighter Support","href":"/references/api/api_guides/lighter-support"}]},{"title":"Deep Linking","href":"/references/api/api_guides/deep-linking"},{"title":"Websockets","href":"/references/api/api_guides/websockets"},{"title":"Webhooks","href":"/references/api/api_guides/webhooks"}]},{"group":"Migration Guides","pages":[{"title":"Migrating to Requests v3","href":"/references/api/api_guides/migrating-to-requests-v3"}]},{"group":"Chains, Tokens, Contracts","pages":[{"title":"Supported Chains","href":"/references/api/api_resources/supported-chains"},{"title":"Contract Addresses","href":"/references/api/api_resources/contract-addresses"},{"title":"Supported Tokens \u0026 Routes","href":"/references/api/api_resources/supported-routes"}]},{"title":"Troubleshooting","href":"/references/api/troubleshooting"}]},{"group":"API Reference","pages":[{"title":"Core","href":"/references/api/core"},{"title":"Get Quote","openapi":"post /quote/v2","href":"/references/api/get-quote-v2"},{"title":"Submit Permit","openapi":"post /execute/permits","href":"/references/api/execute-permits"},{"title":"Get Status","openapi":"get /intents/status/v3","href":"/references/api/get-intents-status-v3"},{"title":"Get Requests","openapi":"get /requests/v3","href":"/references/api/get-requests"},{"title":"Utilities","href":"/references/api/utilities"},{"title":"Get Chains","openapi":"get /chains","href":"/references/api/get-chains"},{"title":"Get Chains Liquidity","openapi":"get /chains/liquidity","href":"/references/api/get-chains-liquidity"},{"title":"Get Currencies","openapi":"post /currencies/v2","href":"/references/api/get-currencies-v2"},{"title":"Get Currency Classifications","openapi":"get /currencies/classifications","href":"/references/api/get-currency-classifications"},{"title":"Get Token Price","openapi":"get /currencies/token/price","href":"/references/api/get-token-price"},{"title":"Transactions Index","openapi":"post /transactions/index","href":"/references/api/transactions-index"},{"title":"Transactions Single","openapi":"post /transactions/single","href":"/references/api/transactions-single"},{"title":"Deposit Address Reindex","openapi":"post /transactions/deposit-address/reindex","href":"/references/api/deposit-address-reindex"},{"title":"Get App Fee Balances","openapi":"get /app-fees/{wallet}/balances","href":"/references/api/get-app-fee-balances"},{"title":"Get Balance Events","openapi":"get /balance/{wallet}/events","href":"/references/api/get-balance-events"},{"title":"Claim App Fees","openapi":"post /app-fees/{wallet}/claim","href":"/references/api/claim-app-fees"},{"title":"Get Usage","openapi":"get /metrics/usage","href":"/references/api/get-usage"},{"title":"Advanced","href":"/references/api/advanced"},{"title":"Fast Fill","openapi":"post /fast-fill","href":"/references/api/fast-fill"},{"title":"Get Swap Sources","openapi":"get /swap-sources","href":"/references/api/get-swap-sources"},{"title":"Execute Gasless Txs","sidebarTitle":"Gasless Execution","openapi":"post /execute","href":"/references/api/execute"},{"group":"Withdrawals","pages":[{"title":"Attest Deposit","openapi":"post /withdrawals/attest-deposit","href":"/references/api/attest-deposit"},{"title":"Get Recovery Balances","openapi":"get /withdrawals/balances","href":"/references/api/get-withdrawal-balances"},{"title":"Request Withdrawal","openapi":"post /withdrawals/request","href":"/references/api/request-withdrawal"},{"title":"Get Withdrawal Status","openapi":"get /withdrawals/status","href":"/references/api/get-withdrawal-status"}]},{"group":"Deprecated","pages":[{"title":"Get Requests (v2)","openapi":"get /requests/v2","href":"/references/api/get-requests-v2"},{"title":"Get Price","openapi":"post /price","href":"/references/api/get-price"},{"title":"Get Config","openapi":"get /config/v2","href":"/references/api/get-config"},{"title":"Get Execution Status","openapi":"get /intents/status","href":"/references/api/get-intents-status"},{"title":"Get Currencies","openapi":"post /currencies/v1","href":"/references/api/get-currencies"},{"title":"Get Quote","openapi":"post /quote","href":"/references/api/get-quote"}]}]},{"group":"Websockets","pages":[{"title":"Intent Status","asyncapi":"websocket-reference.json relay-ws","href":"/references/websockets/intent-status"}]}]},{"tab":"RelayKit","pages":[{"title":"RelayKit","href":"/references/relay-kit/overview"}]},{"tab":"Relay Protocol","pages":[{"title":"Relay Protocol","href":"/references/protocol/overview"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"title":"Apps, API keys, and Rate Limits - Relay","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":[],"chunks":[]}