> For the complete documentation index, see [llms.txt](https://docs.intents.aurora.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.intents.aurora.dev/api-reference/persistent-addresses-api-reference/create-persistent-deposit-address.md).

# Create persistent deposit address

## POST /api/persistent-deposit-address/{apiKey}

> Returns a chain-specific deposit address that funnels deposits into the recipient's account. The same address is returned for repeat calls with the same API key + recipient + recipientType + sender + depositChain + destinationChain/destinationAsset + confidential, so users can safely save it externally. A different API key (or \`recipientType\`/\`destinationAsset\`/\`destinationChain\`/\`confidential\`) yields a different deposit address and a separate underlying Intents account.\
> \
> \> \*\*Access.\*\* Creating new addresses is limited to organisations approved by Aurora; any other API key receives a 403.\
> \
> \> \*\*EVM chains share one address.\*\* Across different EVM chains you only need to generate the deposit address \*\*once\*\* using any EVM chain as \`depositChain\`. The returned address works automatically for deposits on every other supported EVM chain — no need to call this endpoint again per EVM chain.\
> \
> \> \*\*Fees.\*\* The account is minted with a baseline of app fees computed like \`/api/quote\` from the key's fee configuration (confidential variants when \`confidential\` is true). Because the deposited asset is not known yet, only fee rules that do not constrain the origin asset apply, matched against the destination. The fees actually applied to each swap come from \`/api/persistent-deposit-fees\`, which 1Click calls per swap with the real origin asset.

```json
{"openapi":"3.0.3","info":{"title":"@aurora-is-near/intents-fee-service","version":"1.0.0"},"servers":[{"url":"https://intents-api.aurora.dev"}],"security":[],"paths":{"/api/persistent-deposit-address/{apiKey}":{"post":{"tags":["deposit"],"description":"Returns a chain-specific deposit address that funnels deposits into the recipient's account. The same address is returned for repeat calls with the same API key + recipient + recipientType + sender + depositChain + destinationChain/destinationAsset + confidential, so users can safely save it externally. A different API key (or `recipientType`/`destinationAsset`/`destinationChain`/`confidential`) yields a different deposit address and a separate underlying Intents account.\n\n> **Access.** Creating new addresses is limited to organisations approved by Aurora; any other API key receives a 403.\n\n> **EVM chains share one address.** Across different EVM chains you only need to generate the deposit address **once** using any EVM chain as `depositChain`. The returned address works automatically for deposits on every other supported EVM chain — no need to call this endpoint again per EVM chain.\n\n> **Fees.** The account is minted with a baseline of app fees computed like `/api/quote` from the key's fee configuration (confidential variants when `confidential` is true). Because the deposited asset is not known yet, only fee rules that do not constrain the origin asset apply, matched against the destination. The fees actually applied to each swap come from `/api/persistent-deposit-fees`, which 1Click calls per swap with the real origin asset.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"recipient":{"type":"string","minLength":1,"description":"Where the swapped funds are sent, in the format required by `recipientType`: an address on `destinationChain` for `DESTINATION_CHAIN` (default), or an Intents account ID (e.g. \"alice.near\") for `INTENTS`. Funds deposited to the returned address will ultimately route to this recipient."},"sender":{"type":"string","minLength":1,"description":"Identifier of the user the deposit address is generated for (e.g. their ID in the system). A unique deposit address is generated and persisted per (API key, sender, recipient, recipientType, destinationAsset, confidential, depositChain), so incoming deposits can be attributed to a specific user. A single underlying Intents account is shared per (API key, sender, recipient, recipientType, destinationAsset, confidential) across all deposit chains; only the deposit address is chain-specific."},"depositChain":{"type":"string","enum":["eth","bera","base","gnosis","arb","bsc","avax","op","pol","monad","adi","plasma","scroll","xlayer","hood","sui","aptos","xrp","btc","doge","tron","ton","near","sol","zec","ltc","cardano","stellar","aleo","bch","dash","starknet","coca","qtc","evm"],"description":"Chain the user deposits FROM (the chain of the returned deposit address). Short code matching the widget config Chains enum, e.g. \"arb\" for Arbitrum. The special value \"evm\" is accepted as a shortcut for any EVM chain — all EVM chains share one deposit address — and resolves to Base (\"base\"). For \"stellar\", the response includes a `memo` that deposits must carry."},"destinationChain":{"type":"string","enum":["eth","bera","base","gnosis","arb","bsc","avax","op","pol","monad","adi","plasma","scroll","xlayer","hood","sui","aptos","xrp","btc","doge","tron","ton","near","sol","zec","ltc","cardano","stellar","aleo","bch","dash","starknet","coca","qtc"],"description":"Chain the user receives funds ON (for `recipientType` `INTENTS`, the chain `destinationAsset` belongs to; the funds stay inside Intents). Used to resolve `destinationAsset` when it is provided as a symbol. Short code matching the widget config Chains enum, e.g. \"base\" for Base."},"destinationAsset":{"type":"string","minLength":1,"description":"Asset the user wants to receive on `destinationChain`. Accepts either a token symbol (e.g. \"USDC\") or an asset ID (e.g. \"nep141:base-0x...omft.near\"). When a symbol is used and more than one token shares that symbol on `destinationChain`, the request is rejected with 400 and the caller must switch to the asset ID."},"confidential":{"default":false,"description":"Whether the underlying account used for swaps settles on the Confidential Intents rail. When `true`, the account is minted with basic confidentiality mode (deposits still arrive at ordinary chain addresses). Part of the address identity: `true` and `false` produce different, independently persisted deposit addresses and separate accounts for otherwise identical parameters. Defaults to `false`.","type":"boolean"},"recipientType":{"default":"DESTINATION_CHAIN","description":"Type of `recipient`:\n- `DESTINATION_CHAIN` (default) - swapped funds are withdrawn to `recipient` on `destinationChain`.\n- `INTENTS` - swapped funds are transferred to the `recipient` account inside Intents. Not available together with `confidential: true`.\n\nPart of the address identity: the two types produce different, independently persisted deposit addresses and separate accounts for otherwise identical parameters.","type":"string","enum":["DESTINATION_CHAIN","INTENTS"]}},"required":["recipient","sender","depositChain","destinationChain","destinationAsset"],"description":"To specify the asset the user receives, you can either:\n- Pass a token **symbol** in `destinationAsset` (e.g. \"USDC\") together with `destinationChain` (e.g. \"base\"). The API resolves the symbol to an asset ID on that chain.\n- Or pass an **asset ID** directly in `destinationAsset` (e.g. \"nep141:base-0x...omft.near\"). `destinationChain` is still required to locate it.\n\nWhen a symbol matches more than one token on the same `destinationChain`, the request fails with `400` and an error listing the matching asset IDs (\"Multiple tokens with symbol ... Use one of the asset IDs instead: ...\"). In that case, retry with the specific asset ID you want."}}},"required":true,"description":"To specify the asset the user receives, you can either:\n- Pass a token **symbol** in `destinationAsset` (e.g. \"USDC\") together with `destinationChain` (e.g. \"base\"). The API resolves the symbol to an asset ID on that chain.\n- Or pass an **asset ID** directly in `destinationAsset` (e.g. \"nep141:base-0x...omft.near\"). `destinationChain` is still required to locate it.\n\nWhen a symbol matches more than one token on the same `destinationChain`, the request fails with `400` and an error listing the matching asset IDs (\"Multiple tokens with symbol ... Use one of the asset IDs instead: ...\"). In that case, retry with the specific asset ID you want."},"parameters":[{"schema":{"type":"string"},"in":"path","name":"apiKey","required":true,"description":"API key generated at [https://studio.aurora.dev](https://studio.aurora.dev)"}],"responses":{"200":{"description":"Persistent deposit address generated or fetched from cache","content":{"application/json":{"schema":{"type":"object","properties":{"depositAddress":{"type":"string","description":"Chain-specific deposit address. Sending any supported asset on this chain to this address will deposit funds into the NEAR Intents account associated with `recipient`."},"alreadyExists":{"type":"boolean","description":"True when this exact deposit address already existed and was already user-requested (`requested = true`) before this call — i.e. the call was a cache hit on a previously generated address rather than a new generation."},"memo":{"description":"Deposit memo required by some chains (currently only Stellar). Deposits to `depositAddress` on such chains MUST include this memo or the funds are not credited. Omitted for chains that do not use a memo.","type":"string"},"correlationId":{"description":"Trace identifier of the 1Click quote made to create this address, for debugging upstream latency and errors with the 1Click team. Only present when this call actually quoted 1Click — it is omitted when the address was served from an existing record, and 1Click does not always return one.","type":"string"}},"required":["depositAddress","alreadyExists"],"additionalProperties":false,"description":"Persistent deposit address generated or fetched from cache"}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"message":{"type":"string","description":"Error message returned by the upstream quote API."},"correlationId":{"type":"string","description":"Unique identifier for request tracing and debugging."},"timestamp":{"type":"string","description":"Timestamp in ISO format when the error response was generated."},"path":{"type":"string","description":"API path associated with the failed request."}},"required":["message","correlationId","timestamp","path"],"additionalProperties":false,"description":"API error, fee configuration is invalid, `destinationAsset` symbol is ambiguous on `destinationChain`, or `recipientType` `INTENTS` is combined with `confidential: true`"},{"type":"object","properties":{"message":{"type":"string"},"error":{"type":"string"},"data":{"type":"object","additionalProperties":{}},"statusCode":{"type":"number"}},"required":["message","statusCode"],"additionalProperties":false}]}}}},"403":{"description":"The API key does not belong to an organisation approved for persistent deposit address creation. Addresses already issued are still returned","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"error":{"type":"string"},"data":{"type":"object","additionalProperties":{}},"statusCode":{"type":"number"}},"required":["message","statusCode"],"additionalProperties":false,"description":"The API key does not belong to an organisation approved for persistent deposit address creation. Addresses already issued are still returned"}}}},"404":{"description":"Application key is not assigned or no token matches `destinationAsset` on `destinationChain`","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"error":{"type":"string"},"data":{"type":"object","additionalProperties":{}},"statusCode":{"type":"number","enum":[404]}},"required":["message","statusCode"],"additionalProperties":false,"description":"Application key is not assigned or no token matches `destinationAsset` on `destinationChain`"}}}},"429":{"description":"Rate limit exceeded, or a concurrent request is already creating this deposit address; retry","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"error":{"type":"string"},"data":{"type":"object","additionalProperties":{}},"statusCode":{"type":"number"}},"required":["message","statusCode"],"additionalProperties":false,"description":"Rate limit exceeded, or a concurrent request is already creating this deposit address; retry"}}}},"500":{"description":"Internal Server Error - Failed to call upstream services","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"error":{"type":"string"},"data":{"type":"object","additionalProperties":{}},"statusCode":{"type":"number","enum":[500]}},"required":["message","statusCode"],"additionalProperties":false,"description":"Internal Server Error - Failed to call upstream services"}}}}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.intents.aurora.dev/api-reference/persistent-addresses-api-reference/create-persistent-deposit-address.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
