From 9ee3fc25b17cba71696bfbd80f0c09d7b987521b Mon Sep 17 00:00:00 2001 From: Ted Palmer Date: Thu, 14 May 2026 11:28:23 -0400 Subject: [PATCH 1/6] wip: relay dashboard updates --- .scratch/int2-315-prompt.md | 74 ++++++++++++++++++++++++++ CLAUDE.md | 2 +- features/fast-fill.mdx | 2 +- features/fee-sponsorship.mdx | 2 +- references/api/api-keys.mdx | 98 +++++++++++++++++++---------------- references/api/quickstart.mdx | 4 +- snippets/GetAnApiKey.mdx | 4 +- 7 files changed, 134 insertions(+), 52 deletions(-) create mode 100644 .scratch/int2-315-prompt.md diff --git a/.scratch/int2-315-prompt.md b/.scratch/int2-315-prompt.md new file mode 100644 index 00000000..800b3488 --- /dev/null +++ b/.scratch/int2-315-prompt.md @@ -0,0 +1,74 @@ +# Claude Code prompt — INT2-315 + +Update the deposit address docs to reflect (a) the stance Max set in the linked Slack thread on wrong-currency deposits and (b) the fact that the withdraw UI at relay.link/withdraw is now live and handles several of these recovery cases. + +Linear ticket: https://linear.app/relayprotocol/issue/INT2-315/update-deposit-address-docs-for-non-solver-deposits + +## Background (what changed since the ticket was filed) + +The ticket was filed May 6 when the withdraw UI was still pre-launch. Things have moved since: + +- **`relay.link/withdraw` is live** as of 2026-05-12 (relay-client PR #870). It has Claim, Withdraw, and History tabs and works across all supported chains. +- **relay-kit failed-fill UI** now surfaces a "Withdraw" link to `relay.link/withdraw` when a failed transaction is withdrawable (relay-kit PR #989). +- The withdraw UI also supports recovering deposits with unrecognized deposit IDs after 7 days. + +What relay.link/withdraw covers today (verified in the Slack thread linked below): +- Wrong **solver** currency sent to a **strict** deposit address — recoverable via withdraw UI. +- Wrong **solver** currency sent to an **open** deposit address — the existing flow auto-regenerates the quote and fills; recovery UI isn't needed in this case but is the fallback if anything stalls. +- Failed fills where `refundTo` is set — normal auto-refund still applies; withdraw UI is the path when auto-refund didn't run (e.g. integrator omitted `refundTo`). + +What it does **not** yet cover: +- Wrong **non-solver** currency sent to either strict or open deposit addresses. This is what Max wanted the docs to flatly call non-recoverable. The fix for this is tracked in SLV-765 (solver-side sweep expansion) and RLY-4300 (Retool surface for support) — both still in progress. + +Source threads (read these before editing — they have the exact stance we want to land on): +- Max's "align on stance" thread: https://relayprotocol.slack.com/archives/C0ATN2HF2FQ/p1778100344578679 +- Rory's matrix of 4 cases + recovery paths: https://relayprotocol.slack.com/archives/C06KE004UP8/p1777558890041339 +- George/Ted decision to remove the old railway-hosted withdraw UI now that relay.link/withdraw is live: https://relayprotocol.slack.com/archives/C08LWGN3682/p1778567331586329 + +## What to change + +Primary file: `features/deposit-addresses.mdx`. Specifically: + +1. **The comparison table (currently around line 62)** — the two "Wrong token" rows. + - **Wrong token (solver currency) — Open**: keep the auto-regenerate-and-fill description, but add that the withdraw UI at `relay.link/withdraw` is the recovery surface when auto-flow doesn't complete. + - **Wrong token (solver currency) — Strict**: replace the current "Not supported — refund or manual recovery" wording. Strict + wrong-solver-currency is now recoverable via `relay.link/withdraw`. Point at it explicitly. + - **Wrong token (non-solver) — Open and Strict**: drop the "may require manual recovery" qualifier. Land on: not supported, and not currently recoverable. (Per Max's thread — this is the whole point of the ticket.) + +2. **The "Refund Behavior" section (currently around line 911)** — the bullet for "Wrong currency (non-solver token)" should drop "manual handling may be required" and state plainly that non-solver deposits are not recoverable today. Add a short companion bullet (or ``) noting that for the cases the withdraw UI does cover (wrong solver currency, failed fills with unrecognized deposit IDs after 7 days, etc.), users can self-serve at `relay.link/withdraw`. + +3. **The "Supported Currencies" `` (currently around line 1306)** — currently reads "Non-solver tokens and NFTs sent to deposit addresses are **not recoverable** through normal processes." That's roughly the stance we want, but tighten it: drop "through normal processes" (implies an abnormal one exists), keep "not recoverable," and explicitly say to verify the token is a solver currency before depositing. Don't soften it. + +4. **Cross-reference**: somewhere in the deposit addresses page, introduce `relay.link/withdraw` as the self-serve recovery surface for the cases it covers. The cleanest spot is probably a short subsection under "Refund Behavior" or as a `### Recovering stuck deposits` callout. Be specific about what it handles (wrong solver currency to a strict address; failed fills the integrator's app didn't catch; deposits with unrecognized deposit IDs after 7 days) and what it does not (non-solver currency). + +5. **Sweep the rest of the repo** for other pages that describe wrong-currency / non-solver / manual-recovery behavior and align them with the same stance. Likely candidates surfaced by grep: + - `references/protocol/components/deposit-addresses.mdx` + - `references/api/api_guides/bitcoin.mdx` + - `references/api/deposit-address-reindex.mdx` + - `use-cases/bridging.mdx` + - `solutions/commerce-and-payments.mdx` + Don't blanket-edit — only update where the page makes a claim about recovery of wrong-currency or non-solver deposits. + +## Style and conventions + +Follow `CLAUDE.md` at the repo root. In particular: +- `features/*.mdx` is a feature guide per §3.1 — keep paragraphs to 2–3 sentences, active voice, "you" for reader actions, product-as-subject for definitions. +- Use `` for the non-recoverability statement, `` for the withdraw-UI pointer. Stay under the 15-line callout cap (§2.5). +- Use **bold + backticks** in prose for parameter names (`` **`refundTo`** ``). Bare bold for `relay.link/withdraw` since it's a URL, not a param. +- Don't introduce italics. Don't widen the parameter table's `Required` column conventions — only the rows you're touching here are in scope. +- Internal links: root-relative paths only (`/features/...`), not `../features/...` and not the docs.relay.link absolute URL. + +## Do not + +- Do not add a changelog entry. The changelog policy in CLAUDE.md §4 covers breaking changes to the API or SDK — this is a doc-only correction of pre-launch wording, not a behavior change. +- Do not promise the withdraw UI will eventually cover non-solver deposits. Keep the docs to what's true today; the in-flight work (SLV-765, RLY-4300) is internal context, not something to surface to integrators yet. +- Do not touch the OpenAPI-derived API reference pages (`references/api/*.mdx` with `openapi:` frontmatter) unless one of them contains free-text we're contradicting. Those bodies are mostly empty by design (§3.3). + +## Verification before opening the PR + +After editing, re-read the deposit addresses page top to bottom and confirm: +- The four cells in the wrong-token rows of the comparison table all match the four-case matrix Ted laid out in Rory's thread (Reply 2 of 38). +- "Manual recovery" no longer appears anywhere on the page in a way that implies non-solver tokens can be recovered. +- `relay.link/withdraw` is mentioned at least once, in a place a reader looking up "my user sent the wrong token, what now?" would actually find it. +- All internal links resolve to real pages in this repo. + +Branch name from Linear: `ted/int2-315-update-deposit-address-docs-for-non-solver-deposits`. diff --git a/CLAUDE.md b/CLAUDE.md index dc813b41..efa1906a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -90,7 +90,7 @@ All pages use clear, Stripe-adjacent prose — plain English, short paragraphs ( ### 2.6 Links and cross-references - Internal links use root-relative paths: `[Fast Fill](/features/fast-fill)` — not relative (`../features/...`), not absolute URLs (`https://docs.relay.link/...`). -- Anchor links use the Mintlify-generated slug: `/references/api/api-keys#how-to-get-an-api-key`. +- Anchor links use the Mintlify-generated slug: `/references/api/api-keys#creating-an-api-key`. - When introducing a concept that has its own page, link on first mention. - External links (GitHub, viem, tanstack, etc.) open in the same tab by default unless the page already uses `target="_blank"` in a `` block. diff --git a/features/fast-fill.mdx b/features/fast-fill.mdx index bcfcfb9a..67624413 100644 --- a/features/fast-fill.mdx +++ b/features/fast-fill.mdx @@ -11,7 +11,7 @@ Fast Fill is a feature that allows you to accelerate the destination fill of a c Before you can start fast filling requests, you need: -1. **An API key** — Required to authenticate your fast fill requests. [Request an API key](/references/api/api-keys#how-to-get-an-api-key). +1. **An API key** — Required to authenticate your fast fill requests. Create one in the [Relay Dashboard](https://dashboard.relay.link); see [API keys and Rate Limits](/references/api/api-keys) for details. 2. **Enterprise Partnership** — Reach out to the Relay team to become an Enterprise Partner. Learn more about the [Enterprise Partner Program](/resources/enterprise). 3. **A Linked Funding Address** — A wallet address must be linked to your API key. This is the address that will fund your app balance. [Reach out](https://forms.gle/XNeELYavjwoJwPEf7) to the Relay team to link your wallet address. 4. **Sufficient App Balance** — Your app balance must have enough funds to cover fast fills and fee sponsorship. When a fast fill is triggered, a hold is placed against your app balance for the fill amount. This hold is released once the user's deposit lands onchain. While holds are active, they reduce the balance available for new fast fills and claims, but do not block [fee sponsorship](/features/fee-sponsorship) deductions. diff --git a/features/fee-sponsorship.mdx b/features/fee-sponsorship.mdx index 5f00573d..0a2d851d 100644 --- a/features/fee-sponsorship.mdx +++ b/features/fee-sponsorship.mdx @@ -17,7 +17,7 @@ Fee sponsorship covers all destination chain fees (including gas topup amounts), Before you can sponsor transactions, you need: -1. **An API key** — Required to authenticate your sponsorship requests and associate them with your app balance. [Request an API key](/references/api/api-keys#how-to-get-an-api-key). +1. **An API key** — Required to authenticate your sponsorship requests and associate them with your app balance. Create one in the [Relay Dashboard](https://dashboard.relay.link); see [API keys and Rate Limits](/references/api/api-keys) for details. 2. **Enterprise Partnership** — Reach out to the Relay team to become an Enterprise Partner. Learn more about the [Enterprise Partner Program](/resources/enterprise). 3. **A Linked Funding Address** — A wallet address must be linked to your API key. This is the address that will fund your app balance. [Reach out](https://forms.gle/XNeELYavjwoJwPEf7) to the relay team to link your wallet address. 3. **Sufficient App Balance** — Your app balance must have enough funds to cover the fees you wish to sponsor. diff --git a/references/api/api-keys.mdx b/references/api/api-keys.mdx index 1fc027ee..e13a11dd 100644 --- a/references/api/api-keys.mdx +++ b/references/api/api-keys.mdx @@ -1,13 +1,39 @@ --- -title: "Rate Limits and API keys" -description: "Authenticate requests and raise your rate limits with a Relay API key" +title: "API keys and Rate Limits" +description: "Create API keys in the Relay Dashboard to authenticate requests and raise your rate limits" --- -Relay enforces rate limits to ensure platform reliability and fair usage across integrators. Default limits apply to all requests. Higher limits are available via API keys. +Relay enforces rate limits to keep the platform reliable for every integrator. Default limits apply to unauthenticated traffic; an API key raises those limits and attributes each request to your account. -## Default Rate Limits (No API key) +You manage keys in the [Relay Dashboard](https://dashboard.relay.link) — create new keys, rotate existing ones, monitor request volume, and inspect individual requests. -The following limits apply when no API key is provided: +## Creating an API key + +API keys are self-serve. To create one: + +1. Sign in to the [Relay Dashboard](https://dashboard.relay.link). +2. Open the **API keys** tab. +3. Click **Create key**, give it a label (e.g. `production`, `staging`), and copy the key. + +Keys are shown only once — store yours in a secrets manager before closing the dialog. You can create multiple keys per account and revoke any one of them at any time. + + +Use a separate key per environment (production, staging, local). Per-key request history makes it easy to spot a misbehaving deploy without revoking the wrong credential. + + +## Tracking usage and requests + +The [Relay Dashboard](https://dashboard.relay.link) is also where you observe what your integration is doing in production: + +- **Requests** — full history of quotes and intents made with each key, with status, route, amounts, and timing. +- **Usage** — request volume and rate-limit utilization per key over time. +- **Keys** — create, rename, and revoke keys for your account. + +When debugging a specific transaction, paste the `requestId` from your application into the dashboard's search to jump straight to the matching record. + +## Default Rate Limits (no API key) + +The following limits apply to unauthenticated requests: | Endpoint | Limit | | ---------------------- | ----------------------- | @@ -18,7 +44,7 @@ The following limits apply when no API key is provided: ## API key Rate Limits -When using an API key, limits increase and are applied per key: +Authenticated requests get higher limits, applied per key: | Endpoint | Limit | | ---------------------- | ----------------------- | @@ -27,39 +53,24 @@ When using an API key, limits increase and are applied per key: | `/transactions/status` | 10 requests per second | | Other endpoints | 200 requests per minute | -API keys are recommended for server-side production integrations and higher-throughput use cases. - -## How to Request an API key - -Requirements: - -1. Must have Relay integrated in a public app. -2. Must have enough activity to hit default API rate limits. - -To request an API key (once requirements are met): - -1. Fill out the [API key request form](https://forms.gle/uiRVYXhtH8uBqybR9). -2. The Relay team will review within 72 hours. -3. If approved, we will email your unique API key. +API keys are recommended for server-side production integrations and any higher-throughput use case. ## How to Use an API key -### HTTP Requests +### HTTP requests -Pass the API key in the request headers: +Pass the key in the request headers on every call where you want elevated limits: ``` x-api-key: YOUR_API_KEY ``` -This header should be included on all requests where higher rate limits are required. - -### SDK Usage +### SDK usage -```jsx Global API key -// It is recommended to only set the apiKey parameter when using the SDK server-side. +```typescript Global API key +// Set apiKey only when using the SDK server-side. import { createClient, MAINNET_RELAY_API, @@ -68,21 +79,18 @@ import { createClient({ baseApiUrl: MAINNET_RELAY_API, apiKey: "YOUR_API_KEY", - ... - //other parameters + // ...other parameters }); ``` - -```jsx SDK Action API key -// In the case that you prefer not to set a global api key -// you can pass the api key into the headers parameter of the getQuote function. +```typescript SDK action API key +// Or pass the key per-call via the headers parameter. import { getClient } from "@relayprotocol/relay-sdk"; -const quoteParams = {...} +const quoteParams = { /* ... */ }; -const quote = await getClient()?.actions.getQuote(params, undefined, { - "x-api-key": "YOUR_API_KEY" +const quote = await getClient()?.actions.getQuote(quoteParams, undefined, { + "x-api-key": "YOUR_API_KEY", }); ``` @@ -90,32 +98,32 @@ const quote = await getClient()?.actions.getQuote(params, undefined, { ### Proxy API -If using the sdk on the client, create a proxy api which appends the key in the headers and then pass that endpoint into the `baseApiUrl` parameter. This prevents your key from being leaked while allowing you to set up the necessary protection in your proxy api. +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 while preserving elevated limits. -```jsx +```typescript import { createClient, MAINNET_RELAY_API, } from "@relayprotocol/relay-sdk"; createClient({ - baseApiUrl: "https://my-proxy.relay.link", //Replace with your proxy endpoint - ... - //other parameters + baseApiUrl: "https://my-proxy.relay.link", // Replace with your proxy endpoint + // ...other parameters }); ``` ## Keeping Your API key Secure -Your API key is sensitive — treat it like a password. It is tied to your account, controls your rate limits, and all requests made with it are attributed to you. +Treat your API key like a password. It's tied to your account, controls your rate limits, and every request made with it is attributed to you. -If your API key is leaked, unauthorized parties could consume your rate limits or make requests on your behalf. Contact us immediately if you suspect your key has been compromised and we will rotate it for you. +If your key is leaked, anyone holding it can consume your rate limits or make requests on your behalf. Revoke and re-create the key in the [Relay Dashboard](https://dashboard.relay.link) immediately if you suspect it has been compromised. **Best practices:** - **Keep it server-side only** — never expose it in client-side or frontend code. Use a [proxy API](#proxy-api) if calling Relay from the browser. -- **Use environment variables** — store your key in environment variables, not hardcoded in source code. +- **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. \ No newline at end of file +- **Restrict access** — only share the key with team members who need it. +- **Rotate regularly** — create a new key in the [Relay Dashboard](https://dashboard.relay.link) and revoke the old one whenever a team member with access leaves. diff --git a/references/api/quickstart.mdx b/references/api/quickstart.mdx index 2041647f..b7d34fb4 100644 --- a/references/api/quickstart.mdx +++ b/references/api/quickstart.mdx @@ -23,8 +23,8 @@ Follow this 5-step flow to integrate Relay into your application: ### API key Provisioning - You can find a self-serve form to request API keys [here](/references/api/api-keys#how-to-get-an-api-key).
- Having an API key will allow you to use the API at a higher rate limit. + Create an API key in the [Relay Dashboard](https://dashboard.relay.link) to raise your rate limits.
+ See [API keys and Rate Limits](/references/api/api-keys) for usage and limits.
## Chain Configuration diff --git a/snippets/GetAnApiKey.mdx b/snippets/GetAnApiKey.mdx index 7b4dbddf..ae565b54 100644 --- a/snippets/GetAnApiKey.mdx +++ b/snippets/GetAnApiKey.mdx @@ -1,3 +1,3 @@ -To get a higher rate limit, you can [request an API key](/references/api/api-keys#how-to-get-an-api-key). - \ No newline at end of file +Create an API key in the [Relay Dashboard](https://dashboard.relay.link) to raise your rate limits. + From db8be12a97f6fde20db16350a1ca5771b57dce6a Mon Sep 17 00:00:00 2001 From: Ted Palmer Date: Thu, 28 May 2026 09:51:01 -0400 Subject: [PATCH 2/6] Remove enterprise program references and update feature docs --- features/fast-fill.mdx | 5 ++--- features/fee-sponsorship.mdx | 3 +-- features/gasless-execution.mdx | 2 +- script.js | 32 -------------------------------- style.css | 14 -------------- 5 files changed, 4 insertions(+), 52 deletions(-) diff --git a/features/fast-fill.mdx b/features/fast-fill.mdx index 67624413..3cf98ae4 100644 --- a/features/fast-fill.mdx +++ b/features/fast-fill.mdx @@ -12,9 +12,8 @@ Fast Fill is a feature that allows you to accelerate the destination fill of a c Before you can start fast filling requests, you need: 1. **An API key** — Required to authenticate your fast fill requests. Create one in the [Relay Dashboard](https://dashboard.relay.link); see [API keys and Rate Limits](/references/api/api-keys) for details. -2. **Enterprise Partnership** — Reach out to the Relay team to become an Enterprise Partner. Learn more about the [Enterprise Partner Program](/resources/enterprise). -3. **A Linked Funding Address** — A wallet address must be linked to your API key. This is the address that will fund your app balance. [Reach out](https://forms.gle/XNeELYavjwoJwPEf7) to the Relay team to link your wallet address. -4. **Sufficient App Balance** — Your app balance must have enough funds to cover fast fills and fee sponsorship. When a fast fill is triggered, a hold is placed against your app balance for the fill amount. This hold is released once the user's deposit lands onchain. While holds are active, they reduce the balance available for new fast fills and claims, but do not block [fee sponsorship](/features/fee-sponsorship) deductions. +2. **A Fee Sponsorship Wallet** — A wallet linked to your API key that funds your app balance. Link one from the [App Balance page](https://dashboard.relay.link/balance) in the Relay Dashboard by signing a message to prove ownership — no gas required. +3. **Sufficient App Balance** — Your app balance must have enough funds to cover fast fills and fee sponsorship. When a fast fill is triggered, a hold is placed against your app balance for the fill amount. This hold is released once the user's deposit lands onchain. While holds are active, they reduce the balance available for new fast fills and claims, but do not block [fee sponsorship](/features/fee-sponsorship) deductions. Once you're set up, you can begin fast filling requests. diff --git a/features/fee-sponsorship.mdx b/features/fee-sponsorship.mdx index 0a2d851d..d65a78a3 100644 --- a/features/fee-sponsorship.mdx +++ b/features/fee-sponsorship.mdx @@ -18,8 +18,7 @@ Fee sponsorship covers all destination chain fees (including gas topup amounts), Before you can sponsor transactions, you need: 1. **An API key** — Required to authenticate your sponsorship requests and associate them with your app balance. Create one in the [Relay Dashboard](https://dashboard.relay.link); see [API keys and Rate Limits](/references/api/api-keys) for details. -2. **Enterprise Partnership** — Reach out to the Relay team to become an Enterprise Partner. Learn more about the [Enterprise Partner Program](/resources/enterprise). -3. **A Linked Funding Address** — A wallet address must be linked to your API key. This is the address that will fund your app balance. [Reach out](https://forms.gle/XNeELYavjwoJwPEf7) to the relay team to link your wallet address. +2. **A Fee Sponsorship Wallet** — A wallet linked to your API key that funds your app balance. Link one from the [App Balance page](https://dashboard.relay.link/balance) in the Relay Dashboard by signing a message to prove ownership — no gas required. 3. **Sufficient App Balance** — Your app balance must have enough funds to cover the fees you wish to sponsor. Once you're set up, you can begin depositing funds and sponsoring transactions. diff --git a/features/gasless-execution.mdx b/features/gasless-execution.mdx index 04cddb65..c8496374 100644 --- a/features/gasless-execution.mdx +++ b/features/gasless-execution.mdx @@ -13,7 +13,7 @@ This is where the `/execute` API comes in. The API allows users to submit raw ca ## How to use it? -This feature is only currently available to Enterprise Partners, learn more about the [Enterprise Partner Program](/resources/enterprise) to get started. Once you're an Enterprise Partner you should have an API key and a linked funding address. You'll then need to fund your app balance, you can learn more about that [here](/features/fee-sponsorship). +To use gasless execution you'll need an API key with a linked funding address and a funded app balance. Create an API key in the [Relay Dashboard](https://dashboard.relay.link), then see [Fee Sponsorship](/features/fee-sponsorship) for details on linking a funding address and funding your app balance. ### Executing a gasless quote diff --git a/script.js b/script.js index 380f442a..7b8a028c 100644 --- a/script.js +++ b/script.js @@ -128,34 +128,6 @@ function enhanceGetChainsPage() { }); } -function enhanceFeeSponsorshipPage() { - waitForElementId("#page-title", "Fee Sponsorship", () => { - if (!document.getElementById("enterprise-link")) { - const enterpriseLink = document.createElement("a"); - enterpriseLink.textContent = "Enterprise"; - enterpriseLink.href = "/resources/enterprise"; - enterpriseLink.id = "enterprise-link"; - const pageTitle = document.getElementById("page-title"); - pageTitle.appendChild(enterpriseLink); - pageTitle.classList.add("flex", "items-center"); - } - }); -} - -function enhanceFastFillPage() { - waitForElementId("#page-title", "Fast Fill", () => { - if (!document.getElementById("enterprise-link")) { - const enterpriseLink = document.createElement("a"); - enterpriseLink.textContent = "Enterprise"; - enterpriseLink.href = "/resources/enterprise"; - enterpriseLink.id = "enterprise-link"; - const pageTitle = document.getElementById("page-title"); - pageTitle.appendChild(enterpriseLink); - pageTitle.classList.add("flex", "items-center"); - } - }); -} - // ---- MAIN NAVIGATION HANDLER -------------- function onPageChange() { @@ -171,10 +143,6 @@ function onPageChange() { startPageObserver(enhanceGetQuotePage); } else if (path.includes("/references/api/get-chains")) { startPageObserver(enhanceGetChainsPage); - } else if (path.includes("/features/fee-sponsorship")) { - startPageObserver(enhanceFeeSponsorshipPage); - } else if (path.includes("/features/fast-fill")) { - startPageObserver(enhanceFastFillPage); } } diff --git a/style.css b/style.css index a0d383dc..6664b5fc 100644 --- a/style.css +++ b/style.css @@ -134,20 +134,6 @@ max-height: 32px; } - #enterprise-link { - margin-left: 10px; - padding: 2px 8px; - color: #fff; - border-radius: 20px; - font-size: 14px; - background-color: rgb(var(--primary-dark)/1); - display: inline-block; - line-height: normal; - font-weight: 600; - font-style: normal; - letter-spacing: normal; - } - @media (width < 700px) { [class*="intercom-with-namespace"], .intercom-lightweight-app-launcher { From 9ac577c3386161dd30ed7d5b85a552a7eb94407a Mon Sep 17 00:00:00 2001 From: Ted Palmer Date: Mon, 1 Jun 2026 19:46:17 -0400 Subject: [PATCH 3/6] feedback --- references/api/api-keys.mdx | 2 -- resources/enterprise.mdx | 2 -- 2 files changed, 4 deletions(-) diff --git a/references/api/api-keys.mdx b/references/api/api-keys.mdx index e13a11dd..639146d4 100644 --- a/references/api/api-keys.mdx +++ b/references/api/api-keys.mdx @@ -15,8 +15,6 @@ API keys are self-serve. To create one: 2. Open the **API keys** tab. 3. Click **Create key**, give it a label (e.g. `production`, `staging`), and copy the key. -Keys are shown only once — store yours in a secrets manager before closing the dialog. You can create multiple keys per account and revoke any one of them at any time. - Use a separate key per environment (production, staging, local). Per-key request history makes it easy to spot a misbehaving deploy without revoking the wrong credential. diff --git a/resources/enterprise.mdx b/resources/enterprise.mdx index d90c652f..71b1d0a2 100644 --- a/resources/enterprise.mdx +++ b/resources/enterprise.mdx @@ -8,8 +8,6 @@ sidebarTitle: Enterprise Partner Program As an Enterprise Partner, we will work with your team to craft a custom contract to support your use case and you will be granted access to the following exclusive features: -- [Fee Sponsorship](/features/fee-sponsorship) -- [Fast Fill](/features/fast-fill) - Custom SLAs - Priority Support - Increased Rate Limits From 0ebfd912a9832586ff09c1c333cf337c9c179eec Mon Sep 17 00:00:00 2001 From: Ted Palmer Date: Thu, 16 Jul 2026 17:05:26 -0400 Subject: [PATCH 4/6] Update features --- references/api/api-keys.mdx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/references/api/api-keys.mdx b/references/api/api-keys.mdx index 462c20fb..c5c308f8 100644 --- a/references/api/api-keys.mdx +++ b/references/api/api-keys.mdx @@ -5,7 +5,7 @@ description: "Create API keys in the Relay Dashboard to authenticate requests an Relay enforces rate limits to keep the platform reliable for every integrator. Default limits apply to unauthenticated traffic; an API key raises those limits and attributes each request to your account. -You manage keys in the [Relay Dashboard](https://dashboard.relay.link) — create new keys, rotate existing ones, monitor request volume, and inspect individual requests. +You manage keys in the [Relay Dashboard](https://dashboard.relay.link) — create new keys, rotate existing ones, and inspect individual requests. ## Creating an API key @@ -19,12 +19,13 @@ API keys are self-serve. To create one: Use a separate key per environment (production, staging, local). Per-key request history makes it easy to spot a misbehaving deploy without revoking the wrong credential. -## Tracking usage and requests +## Tracking requests The [Relay Dashboard](https://dashboard.relay.link) is also where you observe what your integration is doing in production: - **Requests** — full history of quotes and intents made with each key, with status, route, amounts, and timing. -- **Usage** — request volume and rate-limit utilization per key over time. +- **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. - **Keys** — create, rename, and revoke keys for your account. When debugging a specific transaction, paste the `requestId` from your application into the dashboard's search to jump straight to the matching record. From 1caf2d173fa50a6ba5a9cda7bf1d0fef19039528 Mon Sep 17 00:00:00 2001 From: Ted Palmer Date: Thu, 16 Jul 2026 17:14:00 -0400 Subject: [PATCH 5/6] Remove enterprise program --- docs.json | 7 +++++-- resources/enterprise.mdx | 21 --------------------- what-is-relay.mdx | 4 ---- 3 files changed, 5 insertions(+), 27 deletions(-) delete mode 100644 resources/enterprise.mdx diff --git a/docs.json b/docs.json index d85938ab..fa2962d3 100644 --- a/docs.json +++ b/docs.json @@ -65,7 +65,6 @@ "group": "Resources", "pages": [ "resources/supported-chains", - "resources/enterprise", "resources/developing-with-ai", "resources/support", "resources/brand-assets" @@ -402,7 +401,11 @@ }, { "source": "/resources/partnerships", - "destination": "/resources/enterprise" + "destination": "/references/api/api-keys" + }, + { + "source": "/resources/enterprise", + "destination": "/references/api/api-keys" }, { "source": "/references/sdk/getting-started", diff --git a/resources/enterprise.mdx b/resources/enterprise.mdx deleted file mode 100644 index 71b1d0a2..00000000 --- a/resources/enterprise.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "Enterprise Partner Program" -description: "Learn how to become an Enterprise Partner" -sidebarTitle: Enterprise Partner Program ---- - -## What is an Enterprise Partner? - -As an Enterprise Partner, we will work with your team to craft a custom contract to support your use case and you will be granted access to the following exclusive features: - -- Custom SLAs -- Priority Support -- Increased Rate Limits -- Revenue Share - -## How to Become an Enterprise Partner - -To become an Enterprise Partner, your team must meet the following criteria: -- **Volume:** Current or projected daily processing volume of $500,000 or more. -- **Application:** Submission of the [Enterprise Partnership Program form](https://forms.gle/XNeELYavjwoJwPEf7). -Our team will review your application and reach out with next steps if considered. \ No newline at end of file diff --git a/what-is-relay.mdx b/what-is-relay.mdx index 88fe6f9c..9b338b26 100644 --- a/what-is-relay.mdx +++ b/what-is-relay.mdx @@ -101,7 +101,3 @@ Unlike traditional bridges, Relay delivers the reliability users expect from mod **For Users**: [Try the Relay App](https://relay.link/) to swap any token across any chain instantly. **For Teams & Developers**: Check out our [Quickstart Guide](/references/api/quickstart) to add multichain payments to your app. - ---- - -_Contact us about enterprise features including dedicated support, custom SLAs, and priority routing._ From 47ea0a9e5227504afa506f9daf46bf0981b63e77 Mon Sep 17 00:00:00 2001 From: Ted Palmer Date: Fri, 17 Jul 2026 09:03:41 -0400 Subject: [PATCH 6/6] Cleanup --- .scratch/int2-315-prompt.md | 74 ------------------------------------- 1 file changed, 74 deletions(-) delete mode 100644 .scratch/int2-315-prompt.md diff --git a/.scratch/int2-315-prompt.md b/.scratch/int2-315-prompt.md deleted file mode 100644 index 800b3488..00000000 --- a/.scratch/int2-315-prompt.md +++ /dev/null @@ -1,74 +0,0 @@ -# Claude Code prompt — INT2-315 - -Update the deposit address docs to reflect (a) the stance Max set in the linked Slack thread on wrong-currency deposits and (b) the fact that the withdraw UI at relay.link/withdraw is now live and handles several of these recovery cases. - -Linear ticket: https://linear.app/relayprotocol/issue/INT2-315/update-deposit-address-docs-for-non-solver-deposits - -## Background (what changed since the ticket was filed) - -The ticket was filed May 6 when the withdraw UI was still pre-launch. Things have moved since: - -- **`relay.link/withdraw` is live** as of 2026-05-12 (relay-client PR #870). It has Claim, Withdraw, and History tabs and works across all supported chains. -- **relay-kit failed-fill UI** now surfaces a "Withdraw" link to `relay.link/withdraw` when a failed transaction is withdrawable (relay-kit PR #989). -- The withdraw UI also supports recovering deposits with unrecognized deposit IDs after 7 days. - -What relay.link/withdraw covers today (verified in the Slack thread linked below): -- Wrong **solver** currency sent to a **strict** deposit address — recoverable via withdraw UI. -- Wrong **solver** currency sent to an **open** deposit address — the existing flow auto-regenerates the quote and fills; recovery UI isn't needed in this case but is the fallback if anything stalls. -- Failed fills where `refundTo` is set — normal auto-refund still applies; withdraw UI is the path when auto-refund didn't run (e.g. integrator omitted `refundTo`). - -What it does **not** yet cover: -- Wrong **non-solver** currency sent to either strict or open deposit addresses. This is what Max wanted the docs to flatly call non-recoverable. The fix for this is tracked in SLV-765 (solver-side sweep expansion) and RLY-4300 (Retool surface for support) — both still in progress. - -Source threads (read these before editing — they have the exact stance we want to land on): -- Max's "align on stance" thread: https://relayprotocol.slack.com/archives/C0ATN2HF2FQ/p1778100344578679 -- Rory's matrix of 4 cases + recovery paths: https://relayprotocol.slack.com/archives/C06KE004UP8/p1777558890041339 -- George/Ted decision to remove the old railway-hosted withdraw UI now that relay.link/withdraw is live: https://relayprotocol.slack.com/archives/C08LWGN3682/p1778567331586329 - -## What to change - -Primary file: `features/deposit-addresses.mdx`. Specifically: - -1. **The comparison table (currently around line 62)** — the two "Wrong token" rows. - - **Wrong token (solver currency) — Open**: keep the auto-regenerate-and-fill description, but add that the withdraw UI at `relay.link/withdraw` is the recovery surface when auto-flow doesn't complete. - - **Wrong token (solver currency) — Strict**: replace the current "Not supported — refund or manual recovery" wording. Strict + wrong-solver-currency is now recoverable via `relay.link/withdraw`. Point at it explicitly. - - **Wrong token (non-solver) — Open and Strict**: drop the "may require manual recovery" qualifier. Land on: not supported, and not currently recoverable. (Per Max's thread — this is the whole point of the ticket.) - -2. **The "Refund Behavior" section (currently around line 911)** — the bullet for "Wrong currency (non-solver token)" should drop "manual handling may be required" and state plainly that non-solver deposits are not recoverable today. Add a short companion bullet (or ``) noting that for the cases the withdraw UI does cover (wrong solver currency, failed fills with unrecognized deposit IDs after 7 days, etc.), users can self-serve at `relay.link/withdraw`. - -3. **The "Supported Currencies" `` (currently around line 1306)** — currently reads "Non-solver tokens and NFTs sent to deposit addresses are **not recoverable** through normal processes." That's roughly the stance we want, but tighten it: drop "through normal processes" (implies an abnormal one exists), keep "not recoverable," and explicitly say to verify the token is a solver currency before depositing. Don't soften it. - -4. **Cross-reference**: somewhere in the deposit addresses page, introduce `relay.link/withdraw` as the self-serve recovery surface for the cases it covers. The cleanest spot is probably a short subsection under "Refund Behavior" or as a `### Recovering stuck deposits` callout. Be specific about what it handles (wrong solver currency to a strict address; failed fills the integrator's app didn't catch; deposits with unrecognized deposit IDs after 7 days) and what it does not (non-solver currency). - -5. **Sweep the rest of the repo** for other pages that describe wrong-currency / non-solver / manual-recovery behavior and align them with the same stance. Likely candidates surfaced by grep: - - `references/protocol/components/deposit-addresses.mdx` - - `references/api/api_guides/bitcoin.mdx` - - `references/api/deposit-address-reindex.mdx` - - `use-cases/bridging.mdx` - - `solutions/commerce-and-payments.mdx` - Don't blanket-edit — only update where the page makes a claim about recovery of wrong-currency or non-solver deposits. - -## Style and conventions - -Follow `CLAUDE.md` at the repo root. In particular: -- `features/*.mdx` is a feature guide per §3.1 — keep paragraphs to 2–3 sentences, active voice, "you" for reader actions, product-as-subject for definitions. -- Use `` for the non-recoverability statement, `` for the withdraw-UI pointer. Stay under the 15-line callout cap (§2.5). -- Use **bold + backticks** in prose for parameter names (`` **`refundTo`** ``). Bare bold for `relay.link/withdraw` since it's a URL, not a param. -- Don't introduce italics. Don't widen the parameter table's `Required` column conventions — only the rows you're touching here are in scope. -- Internal links: root-relative paths only (`/features/...`), not `../features/...` and not the docs.relay.link absolute URL. - -## Do not - -- Do not add a changelog entry. The changelog policy in CLAUDE.md §4 covers breaking changes to the API or SDK — this is a doc-only correction of pre-launch wording, not a behavior change. -- Do not promise the withdraw UI will eventually cover non-solver deposits. Keep the docs to what's true today; the in-flight work (SLV-765, RLY-4300) is internal context, not something to surface to integrators yet. -- Do not touch the OpenAPI-derived API reference pages (`references/api/*.mdx` with `openapi:` frontmatter) unless one of them contains free-text we're contradicting. Those bodies are mostly empty by design (§3.3). - -## Verification before opening the PR - -After editing, re-read the deposit addresses page top to bottom and confirm: -- The four cells in the wrong-token rows of the comparison table all match the four-case matrix Ted laid out in Rory's thread (Reply 2 of 38). -- "Manual recovery" no longer appears anywhere on the page in a way that implies non-solver tokens can be recovered. -- `relay.link/withdraw` is mentioned at least once, in a place a reader looking up "my user sent the wrong token, what now?" would actually find it. -- All internal links resolve to real pages in this repo. - -Branch name from Linear: `ted/int2-315-update-deposit-address-docs-for-non-solver-deposits`.