Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.
For deposits that do not need bridging — the end user sent an asset you accept natively to the deposit
address your platform shows them — there is no POST /api/v1/bridging/address call and Mesh is not
in the payment path. Call this endpoint once you have seen the transaction on chain so Mesh records it,
verifies it independently and sends the same transfer webhooks a bridged deposit produces, giving you one
record and one reconciliation stream for every deposit.
What happens: Mesh creates the transfer as pending with the reported hash, then verifies on
chain that the transaction is confirmed and credited destination.address in destination.asset.
On verification the transfer moves to succeeded and the succeeded webhook fires (with the
transaction hash and the on-chain amount). A transaction that conclusively did not deliver (it reverted, or
moved none of the asset to the address), or one whose credit cannot be verified by expirationTime,
marks the transfer failed and a failed webhook is sent. No pending webhook is sent. This endpoint does not return transfer status; use webhooks or the
transfers API with tracking.transferId.
One call per on-chain transaction. The transaction hash is the deposit’s identity: a player who
deposits several times to the same saved address produces several transactions, and each needs its own
call with its own transactionId. Call it after detection, not when the address is displayed.
Idempotency: a transactionId is single-use per userId. Re-submitting the same
transactionId + userId with the same destination and transactionHash returns the
original record (same transferId) in any state, so retries are safe. Re-submitting it with a
different destination or hash, or with a transactionId already used for a bridged address, is a
400 (and a transactionId used here cannot later mint a bridged address). Reporting a
transactionHash already tracked for the same destination under another transactionId is a
409 (transferAlreadyRequested) naming the existing transfer; the same hash crediting a
different address of yours (one transaction paying several users) is a separate deposit and is accepted.
Networks and assets:destination.network is a CAIP-2 id of an EVM, Solana, Tron, Bitcoin or XRP Ledger
network and destination.asset a token symbol Mesh knows on that network; any other network type is a
400, and an asset Mesh cannot verify on that network is a 400 (symbolNotSupported).
destination.address must be a well-formed address for that network
(invalidDestinationAddress otherwise) and transactionHash a well-formed transaction id for it
(EVM, Tron, Bitcoin, XRP Ledger: 32 bytes hex, 0x optional; Solana: base58 signature). amount is informational: the
on-chain credit is authoritative and is what the succeeded webhook carries, so a differing
amount is logged but does not fail the deposit.
POST
/
api
/
v1
/
bridging
/
notify
Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.
Reports a native (non-bridged) deposit the client has already detected on one of its own deposit addresses,
so Mesh records it, verifies it on chain and emits the same transfer webhooks a bridged deposit produces.
One call per on-chain transaction.
Idempotent per transactionId scoped to userId and B2B client/environment: a retry with the same
destination and transactionHash returns the original record. The same transactionId with a
different destination or hash is a 400; a transactionHash already tracked for the same destination
under another transactionId is a 409 (transferAlreadyRequested). The same hash crediting a
different address is a separate deposit.
Your platform's unique identifier for this deposit. One per on-chain transaction; re-submitting the same
value with the same destination and hash returns the previously created record.
Where the deposit landed: the network (CAIP-2 id), the asset symbol, and your platform's deposit address
that received the funds. Mesh verifies the reported transaction against this destination.
Optional amount received, as a decimal string in destination.asset units (e.g. "125.5").
Informational: the on-chain credit is authoritative and is what the succeeded webhook carries; a
differing value is logged for reconciliation but does not fail the deposit.
Maximum string length: 64
Response
Deposit recorded (or the original record returned on an idempotent retry); verification is in progress.
Opaque team code for error routing. Resolved from exception origin or caller file path via CODEOWNERS.
Format: 2-character code (e.g., "7K", "M2"). Use for alerting/routing, not display.
Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.
All possible error types are available in the documentation.
Echoes the recorded deposit and the tracking IDs to correlate the succeeded / failed webhook
Mesh sends once the reported transaction has been verified on chain (or could not be by
expirationTime). This endpoint does not return transfer status.
Show child attributes
Was this page helpful?
⌘I
Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Mesh","colors":{"primary":"#F9FF4D","light":"#F9FF4D","dark":"#F9FF4D"},"logo":{"light":"https://mintcdn.com/mesh-40/xC8T3jgyIbITRgDa/logo/yellow-logo.svg?fit=max\u0026auto=format\u0026n=xC8T3jgyIbITRgDa\u0026q=85\u0026s=1cd02a0ba4a7d0f45f959161701ec02d","dark":"https://mintcdn.com/mesh-40/xC8T3jgyIbITRgDa/logo/yellow-logo.svg?fit=max\u0026auto=format\u0026n=xC8T3jgyIbITRgDa\u0026q=85\u0026s=1cd02a0ba4a7d0f45f959161701ec02d"},"favicon":"https://mintcdn.com/mesh-40/AvjtqKCGv95_YUUc/favicon-new.png?fit=max\u0026auto=format\u0026n=AvjtqKCGv95_YUUc\u0026q=85\u0026s=932699c8f94d0f777bdd1b1ac6f17f23","api":{"openapi":"https://integration-api.meshconnect.com/swagger/v1/swagger.json"},"appearance":{"default":"dark","strict":true},"navbar":{"primary":{"type":"button","label":"Dashboard","href":"https://dashboard.meshconnect.com/login"}},"footer":{"socials":{"twitter":"https://twitter.com/meshconnectapi","linkedin":"https://www.linkedin.com/company/meshconnectapi"}},"integrations":{"ga4":{"measurementId":"G-1QG55ZYBHD"}},"errors":{"404":{"redirect":false,"title":"Page not found","description":"The page you're looking for doesn't exist or has been moved. Try using the **search bar** above, or head back to the [Quickstart guide](/build/15min-quickstart) to get started."}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"mesh-40","hasAudioNarration":false,"actualSubdomain":"mesh-40","customDomains":["docs.meshconnect.com"],"gitSource":{"type":"github","owner":"frontfin","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae26e067158360b7e243409","collectionId":"4a27a589-c8b6-4e2f-aed5-f991cc13b466","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae26e067158360b7e243409"},"feedback":{"thumbs":true,"issues":false,"edits":false,"agentFeedback":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"DISABLED"},"CONTEXTUAL_FEEDBACK":{"status":"DISABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae499afc2f3f738902373c6","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"API Reference","count":34},{"language":"default","tag":"Guides","count":27},{"language":"default","tag":"Further resources","count":16},{"language":"default","tag":"Account Management endpoints","count":10},{"language":"default","tag":"Build your integration","count":8},{"language":"default","tag":"Registered Clients","count":7},{"language":"default","tag":"Deprecated","count":6},{"language":"default","tag":"Core endpoints","count":6},{"language":"default","tag":"User account endpoints","count":4},{"language":"default","tag":"Headless bridging endpoints","count":4}]},"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":"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":"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":"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":"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":"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":"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},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@keyframes not-found-appear{0%{opacity:0}to{opacity:1}}.sdk-badge{display:inline-block;padding:.125rem .5rem;border-radius:.375rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.75rem;font-weight:500;line-height:1rem;white-space:nowrap;vertical-align:baseline;text-align:center}.sdk-live{color:#86efac;background-color:rgba(74,222,128,.1)}.sdk-backlog{color:#fca5a5;background-color:rgba(248,113,113,.1)}.sdk-coming-soon{color:#fcd34d;background-color:rgba(251,191,36,.1)}.sdk-default{color:#93c5fd;background-color:rgba(96,165,250,.1)}body:has(.not-found-container) #sidebar,body:has(.not-found-container) #table-of-contents{display:none!important}.not-found-container{position:fixed!important;top:64px!important;left:0!important;right:0!important;bottom:0!important;display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;text-align:center!important;padding:1.5rem!important;pointer-events:none;z-index:0;animation:not-found-appear .15s ease both}.not-found-container>*{pointer-events:auto;max-width:36rem;width:100%}#error-badge,.not-found-status-code{font-size:8rem!important;font-weight:900!important;line-height:1!important;color:#f9ff4d!important;opacity:.4!important;margin-bottom:.5rem!important;padding:0!important}#error-title,.not-found-title{font-size:1.75rem!important;font-weight:700!important;margin-bottom:.5rem!important}.not-found-description{font-size:1.05rem;color:rgba(229,229,231,.7);max-width:28rem;margin:0 auto 2.5rem;line-height:1.7}.not-found-recommended-page-link,.sidebar-group-header{color:#f9ff4d!important;font-weight:500}.sidebar-group-header{font-size:1rem!important;font-weight:800!important;letter-spacing:.08em!important;text-transform:uppercase!important;opacity:1!important;margin-top:1.75rem!important}#navigation-items,#sidebar-content{padding-top:0!important}li[data-group-tag]>button{font-weight:700!important}.parameter-reference{background:rgba(168,85,247,.1);border:1px solid rgba(168,85,247,.28);border-radius:.75rem;padding:.25rem .9rem;margin:.75rem 0 1.25rem}.parameter-reference [class*=accordion],.parameter-reference details,.parameter-reference>div:first-child{background:0 0!important;border:0!important;box-shadow:none!important}.parameter-reference button,.parameter-reference summary{background:0 0!important;position:relative;padding-left:1.75rem!important}.parameter-reference button::before,.parameter-reference summary::before{content:\"📋\";position:absolute;left:0;top:50%;transform:translateY(-50%);font-size:1rem;line-height:1}.platform-list{display:flex;flex-direction:column;border:1px solid rgba(255,255,255,.08);border-radius:.75rem;overflow:hidden;margin:1rem 0}.platform-list .platform-row{display:flex;align-items:center;gap:.6rem;padding:.9rem 1.1rem;border-bottom:1px solid rgba(255,255,255,.08)}.param-list .param-row:last-child,.platform-list .platform-row:last-child{border-bottom:none}.platform-list .platform-row img{width:18px;height:18px;flex-shrink:0;margin:0}.platform-list .platform-row span{font-weight:600}.param-list{display:flex;flex-direction:column;margin:1rem 0 .5rem}.param-list .param-row{padding:.9rem 0;border-bottom:1px solid rgba(255,255,255,.07)}.param-list .param-name{display:flex;flex-wrap:wrap;align-items:baseline;gap:.5rem .65rem;margin-bottom:.4rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em;font-weight:600;color:#f9ff4d;background:0 0}.param-list .param-name code{background:0 0;padding:0;border:0;font-size:inherit;font-weight:inherit;color:inherit}.param-list .param-name strong{font-weight:700}.param-list .param-body{font-size:.9em;color:rgba(229,229,231,.85);line-height:1.6}.param-list .param-body p{margin:0}.param-list .param-body p+p{margin-top:.55em}.param-list .param-body code{font-size:.88em}.param-list .param-tag{font-size:.7em;padding:.08em .5em}.parameter-reference table td:first-child,.parameter-reference table th:first-child{white-space:nowrap;min-width:14rem;vertical-align:top}.parameter-reference table td{vertical-align:top;padding-top:.6em;padding-bottom:.6em}.param-tag{display:inline-block;padding:.125rem .5rem;border-radius:.375rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.75rem;font-weight:500;line-height:1rem;white-space:nowrap;vertical-align:baseline;margin-bottom:.5rem}.param-tag-required{color:#86efac;background-color:rgba(74,222,128,.1)}.param-tag-optional{color:#fcd34d;background-color:rgba(251,191,36,.1)}:root{--sidebar-width:18rem;--content-edge-buffer:4.5rem;--content-max-width:56rem}@media (min-width:1024px){#sidebar-content{width:var(--sidebar-width)!important}#body-content{padding-left:var(--sidebar-width)!important}[class*=\"max-w-[696px]\"]{box-sizing:border-box!important;width:100%!important;max-width:min(var(--content-max-width),calc(100vw - var(--sidebar-width) - var(--content-edge-buffer)),100%)!important;margin-left:auto!important;margin-right:auto!important}}@media (min-width:1280px){:root{--content-edge-buffer:6.5rem}}@media (min-width:1520px){:root{--content-max-width:80rem}}#body-content :is(.frame, [class*=\"frame\"]){max-width:min(100%,48rem);margin-left:auto;margin-right:auto}#body-content :is(.frame, [class*=\"frame\"]) :is(img, picture, source){max-width:100%;height:auto;margin-left:auto;margin-right:auto;border-radius:.5rem}img.inline-icon{display:inline-block;width:1em;height:1em;max-width:none;margin:0 .3em 0 0;vertical-align:-.15em}"}],"page":{"pagePath":"api-reference/headless-bridging/notify-native-deposit","slug":"/api-reference/headless-bridging/notify-native-deposit","pageMetadata":{"openapi":"post /api/v1/bridging/notify","title":"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.","description":"For deposits that do not need bridging — the end user sent an asset you accept natively to the deposit\r\naddress your platform shows them — there is no `POST /api/v1/bridging/address` call and Mesh is not\r\nin the payment path. Call this endpoint once you have seen the transaction on chain so Mesh records it,\r\nverifies it independently and sends the same transfer webhooks a bridged deposit produces, giving you one\r\nrecord and one reconciliation stream for every deposit.\r\n \r\n**What happens:** Mesh creates the transfer as `pending` with the reported hash, then verifies on\r\nchain that the transaction is confirmed and credited `destination.address` in `destination.asset`.\r\nOn verification the transfer moves to `succeeded` and the `succeeded` webhook fires (with the\r\ntransaction hash and the on-chain amount). A transaction that conclusively did not deliver (it reverted, or\r\nmoved none of the asset to the address), or one whose credit cannot be verified by `expirationTime`,\r\nmarks the transfer `failed` and a `failed` webhook is sent. No `pending` webhook is sent. This endpoint does not return transfer status; use webhooks or the\r\ntransfers API with `tracking.transferId`.\r\n \r\n**One call per on-chain transaction.** The transaction hash is the deposit's identity: a player who\r\ndeposits several times to the same saved address produces several transactions, and each needs its own\r\ncall with its own `transactionId`. Call it after detection, not when the address is displayed.\r\n \r\n**Idempotency:** a `transactionId` is single-use per `userId`. Re-submitting the same\r\n`transactionId` + `userId` with the same destination and `transactionHash` returns the\r\noriginal record (same `transferId`) in any state, so retries are safe. Re-submitting it with a\r\ndifferent destination or hash, or with a `transactionId` already used for a bridged address, is a\r\n`400` (and a `transactionId` used here cannot later mint a bridged address). Reporting a\r\n`transactionHash` already tracked for the same destination under another `transactionId` is a\r\n`409` (`transferAlreadyRequested`) naming the existing transfer; the same hash crediting a\r\ndifferent address of yours (one transaction paying several users) is a separate deposit and is accepted.\r\n \r\n**Networks and assets:** `destination.network` is a CAIP-2 id of an EVM, Solana, Tron, Bitcoin or XRP Ledger\r\nnetwork and `destination.asset` a token symbol Mesh knows on that network; any other network type is a\r\n`400`, and an asset Mesh cannot verify on that network is a `400` (`symbolNotSupported`).\r\n`destination.address` must be a well-formed address for that network\r\n(`invalidDestinationAddress` otherwise) and `transactionHash` a well-formed transaction id for it\r\n(EVM, Tron, Bitcoin, XRP Ledger: 32 bytes hex, `0x` optional; Solana: base58 signature). `amount` is informational: the\r\non-chain credit is authoritative and is what the `succeeded` webhook carries, so a differing\r\n`amount` is logged but does not fail the deposit.","href":"/api-reference/headless-bridging/notify-native-deposit"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"For deposits that do not need bridging — the end user sent an asset you accept natively to the deposit\\r\\naddress your platform shows them — there is no \", _jsx(_components.code, {\n children: \"POST /api/v1/bridging/address\"\n }), \" call and Mesh is not\\r\\nin the payment path. Call this endpoint once you have seen the transaction on chain so Mesh records it,\\r\\nverifies it independently and sends the same transfer webhooks a bridged deposit produces, giving you one\\r\\nrecord and one reconciliation stream for every deposit.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"What happens:\"\n }), \" Mesh creates the transfer as \", _jsx(_components.code, {\n children: \"pending\"\n }), \" with the reported hash, then verifies on\\r\\nchain that the transaction is confirmed and credited \", _jsx(_components.code, {\n children: \"destination.address\"\n }), \" in \", _jsx(_components.code, {\n children: \"destination.asset\"\n }), \".\\r\\nOn verification the transfer moves to \", _jsx(_components.code, {\n children: \"succeeded\"\n }), \" and the \", _jsx(_components.code, {\n children: \"succeeded\"\n }), \" webhook fires (with the\\r\\ntransaction hash and the on-chain amount). A transaction that conclusively did not deliver (it reverted, or\\r\\nmoved none of the asset to the address), or one whose credit cannot be verified by \", _jsx(_components.code, {\n children: \"expirationTime\"\n }), \",\\r\\nmarks the transfer \", _jsx(_components.code, {\n children: \"failed\"\n }), \" and a \", _jsx(_components.code, {\n children: \"failed\"\n }), \" webhook is sent. No \", _jsx(_components.code, {\n children: \"pending\"\n }), \" webhook is sent. This endpoint does not return transfer status; use webhooks or the\\r\\ntransfers API with \", _jsx(_components.code, {\n children: \"tracking.transferId\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"One call per on-chain transaction.\"\n }), \" The transaction hash is the deposit’s identity: a player who\\r\\ndeposits several times to the same saved address produces several transactions, and each needs its own\\r\\ncall with its own \", _jsx(_components.code, {\n children: \"transactionId\"\n }), \". Call it after detection, not when the address is displayed.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Idempotency:\"\n }), \" a \", _jsx(_components.code, {\n children: \"transactionId\"\n }), \" is single-use per \", _jsx(_components.code, {\n children: \"userId\"\n }), \". Re-submitting the same\\r\\n\", _jsx(_components.code, {\n children: \"transactionId\"\n }), \" + \", _jsx(_components.code, {\n children: \"userId\"\n }), \" with the same destination and \", _jsx(_components.code, {\n children: \"transactionHash\"\n }), \" returns the\\r\\noriginal record (same \", _jsx(_components.code, {\n children: \"transferId\"\n }), \") in any state, so retries are safe. Re-submitting it with a\\r\\ndifferent destination or hash, or with a \", _jsx(_components.code, {\n children: \"transactionId\"\n }), \" already used for a bridged address, is a\\r\\n\", _jsx(_components.code, {\n children: \"400\"\n }), \" (and a \", _jsx(_components.code, {\n children: \"transactionId\"\n }), \" used here cannot later mint a bridged address). Reporting a\\r\\n\", _jsx(_components.code, {\n children: \"transactionHash\"\n }), \" already tracked for the same destination under another \", _jsx(_components.code, {\n children: \"transactionId\"\n }), \" is a\\r\\n\", _jsx(_components.code, {\n children: \"409\"\n }), \" (\", _jsx(_components.code, {\n children: \"transferAlreadyRequested\"\n }), \") naming the existing transfer; the same hash crediting a\\r\\ndifferent address of yours (one transaction paying several users) is a separate deposit and is accepted.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Networks and assets:\"\n }), \" \", _jsx(_components.code, {\n children: \"destination.network\"\n }), \" is a CAIP-2 id of an EVM, Solana, Tron, Bitcoin or XRP Ledger\\r\\nnetwork and \", _jsx(_components.code, {\n children: \"destination.asset\"\n }), \" a token symbol Mesh knows on that network; any other network type is a\\r\\n\", _jsx(_components.code, {\n children: \"400\"\n }), \", and an asset Mesh cannot verify on that network is a \", _jsx(_components.code, {\n children: \"400\"\n }), \" (\", _jsx(_components.code, {\n children: \"symbolNotSupported\"\n }), \").\\r\\n\", _jsx(_components.code, {\n children: \"destination.address\"\n }), \" must be a well-formed address for that network\\r\\n(\", _jsx(_components.code, {\n children: \"invalidDestinationAddress\"\n }), \" otherwise) and \", _jsx(_components.code, {\n children: \"transactionHash\"\n }), \" a well-formed transaction id for it\\r\\n(EVM, Tron, Bitcoin, XRP Ledger: 32 bytes hex, \", _jsx(_components.code, {\n children: \"0x\"\n }), \" optional; Solana: base58 signature). \", _jsx(_components.code, {\n children: \"amount\"\n }), \" is informational: the\\r\\non-chain credit is authoritative and is what the \", _jsx(_components.code, {\n children: \"succeeded\"\n }), \" webhook carries, so a differing\\r\\n\", _jsx(_components.code, {\n children: \"amount\"\n }), \" is logged but does not fail the deposit.\"]\n })]\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}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"openapi":"post /api/v1/bridging/notify","title":"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.","description":"For deposits that do not need bridging — the end user sent an asset you accept natively to the deposit\r\naddress your platform shows them — there is no `POST /api/v1/bridging/address` call and Mesh is not\r\nin the payment path. Call this endpoint once you have seen the transaction on chain so Mesh records it,\r\nverifies it independently and sends the same transfer webhooks a bridged deposit produces, giving you one\r\nrecord and one reconciliation stream for every deposit.\r\n \r\n**What happens:** Mesh creates the transfer as `pending` with the reported hash, then verifies on\r\nchain that the transaction is confirmed and credited `destination.address` in `destination.asset`.\r\nOn verification the transfer moves to `succeeded` and the `succeeded` webhook fires (with the\r\ntransaction hash and the on-chain amount). A transaction that conclusively did not deliver (it reverted, or\r\nmoved none of the asset to the address), or one whose credit cannot be verified by `expirationTime`,\r\nmarks the transfer `failed` and a `failed` webhook is sent. No `pending` webhook is sent. This endpoint does not return transfer status; use webhooks or the\r\ntransfers API with `tracking.transferId`.\r\n \r\n**One call per on-chain transaction.** The transaction hash is the deposit's identity: a player who\r\ndeposits several times to the same saved address produces several transactions, and each needs its own\r\ncall with its own `transactionId`. Call it after detection, not when the address is displayed.\r\n \r\n**Idempotency:** a `transactionId` is single-use per `userId`. Re-submitting the same\r\n`transactionId` + `userId` with the same destination and `transactionHash` returns the\r\noriginal record (same `transferId`) in any state, so retries are safe. Re-submitting it with a\r\ndifferent destination or hash, or with a `transactionId` already used for a bridged address, is a\r\n`400` (and a `transactionId` used here cannot later mint a bridged address). Reporting a\r\n`transactionHash` already tracked for the same destination under another `transactionId` is a\r\n`409` (`transferAlreadyRequested`) naming the existing transfer; the same hash crediting a\r\ndifferent address of yours (one transaction paying several users) is a separate deposit and is accepted.\r\n \r\n**Networks and assets:** `destination.network` is a CAIP-2 id of an EVM, Solana, Tron, Bitcoin or XRP Ledger\r\nnetwork and `destination.asset` a token symbol Mesh knows on that network; any other network type is a\r\n`400`, and an asset Mesh cannot verify on that network is a `400` (`symbolNotSupported`).\r\n`destination.address` must be a well-formed address for that network\r\n(`invalidDestinationAddress` otherwise) and `transactionHash` a well-formed transaction id for it\r\n(EVM, Tron, Bitcoin, XRP Ledger: 32 bytes hex, `0x` optional; Solana: base58 signature). `amount` is informational: the\r\non-chain credit is authoritative and is what the `succeeded` webhook carries, so a differing\r\n`amount` is logged but does not fail the deposit.","href":"/api-reference/headless-bridging/notify-native-deposit"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Headless Bridging"],"summary":"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.","description":"For deposits that do not need bridging — the end user sent an asset you accept natively to the deposit\r\naddress your platform shows them — there is no `POST /api/v1/bridging/address` call and Mesh is not\r\nin the payment path. Call this endpoint once you have seen the transaction on chain so Mesh records it,\r\nverifies it independently and sends the same transfer webhooks a bridged deposit produces, giving you one\r\nrecord and one reconciliation stream for every deposit.\r\n \r\n**What happens:** Mesh creates the transfer as `pending` with the reported hash, then verifies on\r\nchain that the transaction is confirmed and credited `destination.address` in `destination.asset`.\r\nOn verification the transfer moves to `succeeded` and the `succeeded` webhook fires (with the\r\ntransaction hash and the on-chain amount). A transaction that conclusively did not deliver (it reverted, or\r\nmoved none of the asset to the address), or one whose credit cannot be verified by `expirationTime`,\r\nmarks the transfer `failed` and a `failed` webhook is sent. No `pending` webhook is sent. This endpoint does not return transfer status; use webhooks or the\r\ntransfers API with `tracking.transferId`.\r\n \r\n**One call per on-chain transaction.** The transaction hash is the deposit's identity: a player who\r\ndeposits several times to the same saved address produces several transactions, and each needs its own\r\ncall with its own `transactionId`. Call it after detection, not when the address is displayed.\r\n \r\n**Idempotency:** a `transactionId` is single-use per `userId`. Re-submitting the same\r\n`transactionId` + `userId` with the same destination and `transactionHash` returns the\r\noriginal record (same `transferId`) in any state, so retries are safe. Re-submitting it with a\r\ndifferent destination or hash, or with a `transactionId` already used for a bridged address, is a\r\n`400` (and a `transactionId` used here cannot later mint a bridged address). Reporting a\r\n`transactionHash` already tracked for the same destination under another `transactionId` is a\r\n`409` (`transferAlreadyRequested`) naming the existing transfer; the same hash crediting a\r\ndifferent address of yours (one transaction paying several users) is a separate deposit and is accepted.\r\n \r\n**Networks and assets:** `destination.network` is a CAIP-2 id of an EVM, Solana, Tron, Bitcoin or XRP Ledger\r\nnetwork and `destination.asset` a token symbol Mesh knows on that network; any other network type is a\r\n`400`, and an asset Mesh cannot verify on that network is a `400` (`symbolNotSupported`).\r\n`destination.address` must be a well-formed address for that network\r\n(`invalidDestinationAddress` otherwise) and `transactionHash` a well-formed transaction id for it\r\n(EVM, Tron, Bitcoin, XRP Ledger: 32 bytes hex, `0x` optional; Solana: base58 signature). `amount` is informational: the\r\non-chain credit is authoritative and is what the `succeeded` webhook carries, so a differing\r\n`amount` is logged but does not fail the deposit.","requestBody":"3d0ca2e4-69f5-49df-9b63-21db95fd7e98","responses":{"200":"e0573f0d-6238-4415-898b-e5dbc8488b01","400":"e1aa85ff-40fd-459d-bd08-9f182a980647","401":"ba7573b2-0504-432b-82b0-be0ba2f14b00","403":"ef121e4e-e265-41cf-8403-6b83e9d9ed1f","409":"afcd8ad9-7a6d-4d84-b265-9c8169b31455"},"method":"post","type":"path","servers":["8208eed4-8164-4d93-b101-01f89c9bee01","2408a598-01ce-463c-ac8c-2da0b07f067d"],"security":["d76c5d14-23f1-4b2e-8ebf-5430952f53df"],"path":"/api/v1/bridging/notify","baseUrlOptions":["https://integration-api.meshconnect.com","https://sandbox-integration-api.meshconnect.com"],"title":"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"Request body for `POST /api/v1/bridging/notify`.\r\n\n\r\nReports a native (non-bridged) deposit the client has already detected on one of its own deposit addresses,\r\nso Mesh records it, verifies it on chain and emits the same transfer webhooks a bridged deposit produces.\r\nOne call per on-chain transaction.\r\n\n\r\nIdempotent per `transactionId` scoped to `userId` and B2B client/environment: a retry with the same\r\ndestination and `transactionHash` returns the original record. The same `transactionId` with a\r\ndifferent destination or hash is a `400`; a `transactionHash` already tracked for the same destination\r\nunder another `transactionId` is a `409` (`transferAlreadyRequested`). The same hash crediting a\r\ndifferent address is a separate deposit.\r\n","required":["destination","transactionHash","transactionId","userId"],"properties":{"userId":{"maxLength":384,"minLength":1,"type":"string","description":"Your platform's unique identifier for the end user who made this deposit.\r\nCombined with `transactionId` to enforce idempotency.","isRequired":true,"uniqueKey":"userId","typeLabel":"string"},"transactionId":{"maxLength":128,"minLength":1,"type":"string","description":"Your platform's unique identifier for this deposit. One per on-chain transaction; re-submitting the same\r\nvalue with the same destination and hash returns the previously created record.","isRequired":true,"uniqueKey":"transactionId","typeLabel":"string"},"destination":{"type":"object","description":"Where the deposit landed: the network (CAIP-2 id), the asset symbol, and your platform's deposit address\r\nthat received the funds. Mesh verifies the reported transaction against this destination.","required":["address","asset","network"],"properties":{"network":{"minLength":1,"type":"string","description":"CAIP-2 network identifier for the token's network.\r\n\nExamples: `eip155:1` (Ethereum Mainnet), `eip155:137` (Polygon),\r\n`eip155:8453` (Base), `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp` (Solana Mainnet).","isRequired":true,"uniqueKey":"destination.network","typeLabel":"string"},"asset":{"minLength":1,"type":"string","description":"Token symbol, case-insensitive (e.g. `USDC`, `ETH`, `MATIC`).","isRequired":true,"uniqueKey":"destination.asset","typeLabel":"string"},"address":{"maxLength":200,"minLength":1,"type":"string","description":"On-chain wallet address on the destination network that will receive the bridged funds.\r\nMust be a valid address for the specified `network`.","isRequired":true,"uniqueKey":"destination.address","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"destination","typeLabel":"object"},"transactionHash":{"maxLength":128,"minLength":1,"type":"string","description":"Hash of the on-chain transaction that delivered the deposit to `destination.address`.","isRequired":true,"uniqueKey":"transactionHash","typeLabel":"string"},"amount":{"oneOf":[{"maxLength":64,"type":"string","description":"Optional amount received, as a decimal string in `destination.asset` units (e.g. `\"125.5\"`).\r\nInformational: the on-chain credit is authoritative and is what the `succeeded` webhook carries; a\r\ndiffering value is logged for reconciliation but does not fail the deposit.","uniqueKey":"amount.oneOf.0","typeLabel":"string"},{"maxLength":64,"type":"null","description":"Optional amount received, as a decimal string in `destination.asset` units (e.g. `\"125.5\"`).\r\nInformational: the on-chain credit is authoritative and is what the `succeeded` webhook carries; a\r\ndiffering value is logged for reconciliation but does not fail the deposit.","uniqueKey":"amount.oneOf.1","typeLabel":"null"}],"uniqueKey":"amount","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"userId":"\u003cstring>","transactionId":"\u003cstring>","destination":{"network":"\u003cstring>","asset":"\u003cstring>","address":"\u003cstring>"},"transactionHash":"\u003cstring>","amount":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"e0573f0d-6238-4415-898b-e5dbc8488b01":{"description":"Deposit recorded (or the original record returned on an idempotent retry); verification is in progress.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","serverFailure","permissionDenied","badRequest","notFound","conflict","tooManyRequest","locked","unavailableForLegalReasons","serviceUnavailable"],"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"message":{"oneOf":[{"type":"string","description":"A message generated by the API","uniqueKey":"message.oneOf.0","typeLabel":"string"},{"type":"null","description":"A message generated by the API","uniqueKey":"message.oneOf.1","typeLabel":"null"}],"uniqueKey":"message","typeLabel":"string | null"},"displayMessage":{"oneOf":[{"type":"string","description":"User-friendly display message that can be presented to the end user","uniqueKey":"displayMessage.oneOf.0","typeLabel":"string"},{"type":"null","description":"User-friendly display message that can be presented to the end user","uniqueKey":"displayMessage.oneOf.1","typeLabel":"null"}],"uniqueKey":"displayMessage","typeLabel":"string | null"},"errorHash":{"oneOf":[{"type":"string","description":"An error grouping hash from string components and caller information. Used by bugsnag on FE for correct error grouping","readOnly":true,"uniqueKey":"errorHash.oneOf.0","typeLabel":"string"},{"type":"null","description":"An error grouping hash from string components and caller information. Used by bugsnag on FE for correct error grouping","readOnly":true,"uniqueKey":"errorHash.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorHash","typeLabel":"string | null"},"teamCode":{"oneOf":[{"type":"string","description":"Opaque team code for error routing. Resolved from exception origin or caller file path via CODEOWNERS.\r\nFormat: 2-character code (e.g., \"7K\", \"M2\"). Use for alerting/routing, not display.","readOnly":true,"uniqueKey":"teamCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Opaque team code for error routing. Resolved from exception origin or caller file path via CODEOWNERS.\r\nFormat: 2-character code (e.g., \"7K\", \"M2\"). Use for alerting/routing, not display.","readOnly":true,"uniqueKey":"teamCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"teamCode","typeLabel":"string | null"},"errorType":{"oneOf":[{"type":"string","description":"Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.\r\nAll possible error types are available in the documentation.","uniqueKey":"errorType.oneOf.0","typeLabel":"string"},{"type":"null","description":"Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.\r\nAll possible error types are available in the documentation.","uniqueKey":"errorType.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorType","typeLabel":"string | null"},"errorData":{"oneOf":[{"readOnly":true},{"readOnly":true,"type":"null","uniqueKey":"errorData.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorData","typeLabel":"null"},"content":{"oneOf":[{"type":"object","description":"Response body for `POST /api/v1/bridging/notify`.\r\n\n\r\nEchoes the recorded deposit and the tracking IDs to correlate the `succeeded` / `failed` webhook\r\nMesh sends once the reported transaction has been verified on chain (or could not be by\r\n`expirationTime`). This endpoint does not return transfer status.\r\n","required":["destination","expirationTime","tracking","transactionHash","warnings"],"properties":{"tracking":{"oneOf":[{"type":"object","description":"Internal IDs for tracking this deposit. Store these to correlate webhook events and status updates\r\nback to this specific transfer.","required":["transactionId","transferId","userId"],"properties":{"userId":{"oneOf":[{"type":"string","description":"The end-user identifier supplied in the originating request.\r\nEchoed back for client-side reconciliation.","isRequired":true,"uniqueKey":"content.oneOf.0.tracking.oneOf.0.userId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The end-user identifier supplied in the originating request.\r\nEchoed back for client-side reconciliation.","isRequired":true,"uniqueKey":"content.oneOf.0.tracking.oneOf.0.userId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"content.oneOf.0.tracking.oneOf.0.userId","typeLabel":"string | null"},"transactionId":{"oneOf":[{"type":"string","description":"The transfer identifier supplied in the originating request.\r\nEchoed back for client-side reconciliation.","isRequired":true,"uniqueKey":"content.oneOf.0.tracking.oneOf.0.transactionId.oneOf.0","typeLabel":"string"},{"type":"null","description":"The transfer identifier supplied in the originating request.\r\nEchoed back for client-side reconciliation.","isRequired":true,"uniqueKey":"content.oneOf.0.tracking.oneOf.0.transactionId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"content.oneOf.0.tracking.oneOf.0.transactionId","typeLabel":"string | null"},"transferId":{"type":"string","description":"Mesh-internal unique identifier for this transfer record.\r\nUse this ID when querying transfer status or matching incoming webhook payloads.","format":"uuid","isRequired":true,"uniqueKey":"content.oneOf.0.tracking.oneOf.0.transferId","typeLabel":"string\u003cuuid>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"content.oneOf.0.tracking.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"content.oneOf.0.tracking.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"content.oneOf.0.tracking","typeLabel":"object | null"},"destination":{"oneOf":[{"type":"object","description":"The destination (network, asset, address) the deposit was recorded against, normalized by Mesh.","required":["address","asset","network"],"properties":{"network":{"minLength":1,"type":"string","description":"CAIP-2 network identifier for the token's network.\r\n\nExamples: `eip155:1` (Ethereum Mainnet), `eip155:137` (Polygon),\r\n`eip155:8453` (Base), `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp` (Solana Mainnet).","isRequired":true,"uniqueKey":"content.oneOf.0.destination.oneOf.0.network","typeLabel":"string"},"asset":{"minLength":1,"type":"string","description":"Token symbol, case-insensitive (e.g. `USDC`, `ETH`, `MATIC`).","isRequired":true,"uniqueKey":"content.oneOf.0.destination.oneOf.0.asset","typeLabel":"string"},"address":{"maxLength":200,"minLength":1,"type":"string","description":"On-chain wallet address on the destination network that will receive the bridged funds.\r\nMust be a valid address for the specified `network`.","isRequired":true,"uniqueKey":"content.oneOf.0.destination.oneOf.0.address","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"content.oneOf.0.destination.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"content.oneOf.0.destination.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"content.oneOf.0.destination","typeLabel":"object | null"},"transactionHash":{"oneOf":[{"type":"string","description":"The on-chain transaction hash Mesh is verifying, normalized.","isRequired":true,"uniqueKey":"content.oneOf.0.transactionHash.oneOf.0","typeLabel":"string"},{"type":"null","description":"The on-chain transaction hash Mesh is verifying, normalized.","isRequired":true,"uniqueKey":"content.oneOf.0.transactionHash.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"content.oneOf.0.transactionHash","typeLabel":"string | null"},"expirationTime":{"type":"integer","description":"Unix timestamp (seconds) by which Mesh must verify the transaction. If it cannot, the transfer is marked\r\n`failed` and a `failed` webhook is sent.","format":"int64","isRequired":true,"uniqueKey":"content.oneOf.0.expirationTime","typeLabel":"integer\u003cint64>"},"warnings":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"content.oneOf.0.warnings.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Operational notes about verification, idempotency and the failure deadline.","isRequired":true,"uniqueKey":"content.oneOf.0.warnings.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Operational notes about verification, idempotency and the failure deadline.","isRequired":true,"uniqueKey":"content.oneOf.0.warnings.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"content.oneOf.0.warnings","typeLabel":"string[] | null"},"amount":{"oneOf":[{"type":"string","description":"The reported amount in `destination.asset` units, when one was supplied.","uniqueKey":"content.oneOf.0.amount.oneOf.0","typeLabel":"string"},{"type":"null","description":"The reported amount in `destination.asset` units, when one was supplied.","uniqueKey":"content.oneOf.0.amount.oneOf.1","typeLabel":"null"}],"uniqueKey":"content.oneOf.0.amount","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"content.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"content.oneOf.1","typeLabel":"null"}],"uniqueKey":"content","typeLabel":"object | null"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":"ok","message":"\u003cstring>","displayMessage":"\u003cstring>","errorHash":"\u003cstring>","teamCode":"\u003cstring>","errorType":"\u003cstring>","errorData":"\u003cunknown>","content":{"tracking":{"userId":"\u003cstring>","transactionId":"\u003cstring>","transferId":"3c90c3cc-0d44-4b50-8888-8dd25736052a"},"destination":{"network":"\u003cstring>","asset":"\u003cstring>","address":"\u003cstring>"},"transactionHash":"\u003cstring>","expirationTime":123,"warnings":["\u003cstring>"],"amount":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"e1aa85ff-40fd-459d-bd08-9f182a980647":{"description":"Request is missing required fields, the network is unknown or not an EVM / Solana / Tron / Bitcoin / XRP Ledger network, the asset is not supported on that network (`symbolNotSupported`), the address is not valid for the network (`invalidDestinationAddress`), the hash or amount is malformed, or the `transactionId` was already used with a different destination or hash.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","serverFailure","permissionDenied","badRequest","notFound","conflict","tooManyRequest","locked","unavailableForLegalReasons","serviceUnavailable"],"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"message":{"oneOf":[{"type":"string","description":"A message generated by the API","uniqueKey":"message.oneOf.0","typeLabel":"string"},{"type":"null","description":"A message generated by the API","uniqueKey":"message.oneOf.1","typeLabel":"null"}],"uniqueKey":"message","typeLabel":"string | null"},"displayMessage":{"oneOf":[{"type":"string","description":"User-friendly display message that can be presented to the end user","uniqueKey":"displayMessage.oneOf.0","typeLabel":"string"},{"type":"null","description":"User-friendly display message that can be presented to the end user","uniqueKey":"displayMessage.oneOf.1","typeLabel":"null"}],"uniqueKey":"displayMessage","typeLabel":"string | null"},"errorHash":{"oneOf":[{"type":"string","description":"An error grouping hash from string components and caller information. Used by bugsnag on FE for correct error grouping","readOnly":true,"uniqueKey":"errorHash.oneOf.0","typeLabel":"string"},{"type":"null","description":"An error grouping hash from string components and caller information. Used by bugsnag on FE for correct error grouping","readOnly":true,"uniqueKey":"errorHash.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorHash","typeLabel":"string | null"},"teamCode":{"oneOf":[{"type":"string","description":"Opaque team code for error routing. Resolved from exception origin or caller file path via CODEOWNERS.\r\nFormat: 2-character code (e.g., \"7K\", \"M2\"). Use for alerting/routing, not display.","readOnly":true,"uniqueKey":"teamCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Opaque team code for error routing. Resolved from exception origin or caller file path via CODEOWNERS.\r\nFormat: 2-character code (e.g., \"7K\", \"M2\"). Use for alerting/routing, not display.","readOnly":true,"uniqueKey":"teamCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"teamCode","typeLabel":"string | null"},"errorType":{"oneOf":[{"type":"string","description":"Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.\r\nAll possible error types are available in the documentation.","uniqueKey":"errorType.oneOf.0","typeLabel":"string"},{"type":"null","description":"Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.\r\nAll possible error types are available in the documentation.","uniqueKey":"errorType.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorType","typeLabel":"string | null"},"errorData":{"oneOf":[{"readOnly":true},{"readOnly":true,"type":"null","uniqueKey":"errorData.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorData","typeLabel":"null"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"example":{"status":"ok","message":"","errorHash":"014bffeb","teamCode":"Q9","errorType":""},"examples":{"Example":{"title":"Example","value":{"status":"ok","message":"","errorHash":"014bffeb","teamCode":"Q9","errorType":""}}},"exampleType":"examples"}},"exampleType":"examples"},"ba7573b2-0504-432b-82b0-be0ba2f14b00":{"description":"Unauthorized — Client ID or Client Secret are missing or incorrect.","content":{"application/json":{"schema":{}}},"exampleType":"generated"},"ef121e4e-e265-41cf-8403-6b83e9d9ed1f":{"description":"Headless bridging is not enabled for this client (`permissionDenied`), or the API key does not have the write scope required for this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","serverFailure","permissionDenied","badRequest","notFound","conflict","tooManyRequest","locked","unavailableForLegalReasons","serviceUnavailable"],"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"message":{"oneOf":[{"type":"string","description":"A message generated by the API","uniqueKey":"message.oneOf.0","typeLabel":"string"},{"type":"null","description":"A message generated by the API","uniqueKey":"message.oneOf.1","typeLabel":"null"}],"uniqueKey":"message","typeLabel":"string | null"},"displayMessage":{"oneOf":[{"type":"string","description":"User-friendly display message that can be presented to the end user","uniqueKey":"displayMessage.oneOf.0","typeLabel":"string"},{"type":"null","description":"User-friendly display message that can be presented to the end user","uniqueKey":"displayMessage.oneOf.1","typeLabel":"null"}],"uniqueKey":"displayMessage","typeLabel":"string | null"},"errorHash":{"oneOf":[{"type":"string","description":"An error grouping hash from string components and caller information. Used by bugsnag on FE for correct error grouping","readOnly":true,"uniqueKey":"errorHash.oneOf.0","typeLabel":"string"},{"type":"null","description":"An error grouping hash from string components and caller information. Used by bugsnag on FE for correct error grouping","readOnly":true,"uniqueKey":"errorHash.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorHash","typeLabel":"string | null"},"teamCode":{"oneOf":[{"type":"string","description":"Opaque team code for error routing. Resolved from exception origin or caller file path via CODEOWNERS.\r\nFormat: 2-character code (e.g., \"7K\", \"M2\"). Use for alerting/routing, not display.","readOnly":true,"uniqueKey":"teamCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Opaque team code for error routing. Resolved from exception origin or caller file path via CODEOWNERS.\r\nFormat: 2-character code (e.g., \"7K\", \"M2\"). Use for alerting/routing, not display.","readOnly":true,"uniqueKey":"teamCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"teamCode","typeLabel":"string | null"},"errorType":{"oneOf":[{"type":"string","description":"Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.\r\nAll possible error types are available in the documentation.","uniqueKey":"errorType.oneOf.0","typeLabel":"string"},{"type":"null","description":"Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.\r\nAll possible error types are available in the documentation.","uniqueKey":"errorType.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorType","typeLabel":"string | null"},"errorData":{"oneOf":[{"readOnly":true},{"readOnly":true,"type":"null","uniqueKey":"errorData.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorData","typeLabel":"null"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"example":{"status":"ok","message":"","errorHash":"014bffeb","teamCode":"Q9","errorType":""},"examples":{"Example":{"title":"Example","value":{"status":"ok","message":"","errorHash":"014bffeb","teamCode":"Q9","errorType":""}}},"exampleType":"examples"}},"exampleType":"examples"},"afcd8ad9-7a6d-4d84-b265-9c8169b31455":{"description":"The `transactionHash` is already tracked for this destination by another transfer (`transferAlreadyRequested`). The message names the existing transfer and its `transactionId`.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","serverFailure","permissionDenied","badRequest","notFound","conflict","tooManyRequest","locked","unavailableForLegalReasons","serviceUnavailable"],"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"message":{"oneOf":[{"type":"string","description":"A message generated by the API","uniqueKey":"message.oneOf.0","typeLabel":"string"},{"type":"null","description":"A message generated by the API","uniqueKey":"message.oneOf.1","typeLabel":"null"}],"uniqueKey":"message","typeLabel":"string | null"},"displayMessage":{"oneOf":[{"type":"string","description":"User-friendly display message that can be presented to the end user","uniqueKey":"displayMessage.oneOf.0","typeLabel":"string"},{"type":"null","description":"User-friendly display message that can be presented to the end user","uniqueKey":"displayMessage.oneOf.1","typeLabel":"null"}],"uniqueKey":"displayMessage","typeLabel":"string | null"},"errorHash":{"oneOf":[{"type":"string","description":"An error grouping hash from string components and caller information. Used by bugsnag on FE for correct error grouping","readOnly":true,"uniqueKey":"errorHash.oneOf.0","typeLabel":"string"},{"type":"null","description":"An error grouping hash from string components and caller information. Used by bugsnag on FE for correct error grouping","readOnly":true,"uniqueKey":"errorHash.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorHash","typeLabel":"string | null"},"teamCode":{"oneOf":[{"type":"string","description":"Opaque team code for error routing. Resolved from exception origin or caller file path via CODEOWNERS.\r\nFormat: 2-character code (e.g., \"7K\", \"M2\"). Use for alerting/routing, not display.","readOnly":true,"uniqueKey":"teamCode.oneOf.0","typeLabel":"string"},{"type":"null","description":"Opaque team code for error routing. Resolved from exception origin or caller file path via CODEOWNERS.\r\nFormat: 2-character code (e.g., \"7K\", \"M2\"). Use for alerting/routing, not display.","readOnly":true,"uniqueKey":"teamCode.oneOf.1","typeLabel":"null"}],"uniqueKey":"teamCode","typeLabel":"string | null"},"errorType":{"oneOf":[{"type":"string","description":"Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.\r\nAll possible error types are available in the documentation.","uniqueKey":"errorType.oneOf.0","typeLabel":"string"},{"type":"null","description":"Strictly-typed error type that is explaining the reason of an unsuccessful status of the operation.\r\nAll possible error types are available in the documentation.","uniqueKey":"errorType.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorType","typeLabel":"string | null"},"errorData":{"oneOf":[{"readOnly":true},{"readOnly":true,"type":"null","uniqueKey":"errorData.oneOf.1","typeLabel":"null"}],"uniqueKey":"errorData","typeLabel":"null"}},"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"example":{"status":"ok","message":"","errorHash":"014bffeb","teamCode":"Q9","errorType":""},"examples":{"Example":{"title":"Example","value":{"status":"ok","message":"","errorHash":"014bffeb","teamCode":"Q9","errorType":""}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"d76c5d14-23f1-4b2e-8ebf-5430952f53df":{"Client-Secret":{"type":"apiKey","description":"Contact Mesh to get client Secret","name":"X-Client-Secret","in":"header","scopes":[],"schemeName":"Client-Secret"},"Client-Id":{"type":"apiKey","description":"Contact Mesh to get client Id","name":"X-Client-Id","in":"header","scopes":[],"schemeName":"Client-Id"}}},"servers":{"8208eed4-8164-4d93-b101-01f89c9bee01":{"url":"https://integration-api.meshconnect.com"},"2408a598-01ce-463c-ac8c-2da0b07f067d":{"url":"https://sandbox-integration-api.meshconnect.com"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","description":"Contact Mesh to get client Secret","name":"X-Client-Secret","in":"header","scopes":[],"schemeName":"Client-Secret"},"schema":{"title":"X-Client-Secret","type":"string","description":"Contact Mesh to get client Secret","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"Client-Secret","name":"X-Client-Secret"},{"scheme":{"type":"apiKey","description":"Contact Mesh to get client Id","name":"X-Client-Id","in":"header","scopes":[],"schemeName":"Client-Id"},"schema":{"title":"X-Client-Id","type":"string","description":"Contact Mesh to get client Id","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"Client-Id","name":"X-Client-Id"}],"title":"Client-Secret \u0026 Client-Id"}]},"originalFileLocation":"https://integration-api.meshconnect.com/swagger/v1/swagger.json"},"subdomain":"mesh-40","siteName":"Mesh","title":"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses. - Mesh","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-30T13:21:24.090Z","originalFileLocation":"api-reference/headless-bridging/notify-native-deposit.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"dark\";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=\"dark\"}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=\"For deposits that do not need bridging — the end user sent an asset you accept natively to the deposit address your platform shows them — there is no POST /api/v1/bridging/address call and Mesh is not in the payment path. Call this endpoint once you have seen the transaction on chain so Mesh records it, verifies it independently and sends the same transfer webhooks a bridged deposit produces, giving you one record and one reconciliation stream for every deposit. What happens: Mesh creates the transfer as pending with the reported hash, then verifies on chain that the transaction is confirmed and credited destination.address in destination.asset. On verification the transfer moves to succeeded and the succeeded webhook fires (with the transaction hash and the on-chain amount). A transaction that conclusively did not deliver (it reverted, or moved none of the asset to the address), or one whose credit cannot be verified by expirationTime, marks the transfer failed and a failed webhook is sent. No pending webhook is sent. This endpoint does not return transfer status; use webhooks or the transfers API with tracking.transferId. One call per on-chain transaction. The transaction hash is the deposit\u0026#x27;s identity: a player who deposits several times to the same saved address produces several transactions, and each needs its own call with its own transactionId. Call it after detection, not when the address is displayed. Idempotency: a transactionId is single-use per userId. Re-submitting the same transactionId + userId with the same destination and transactionHash returns the original record (same transferId) in any state, so retries are safe. Re-submitting it with a different destination or hash, or with a transactionId already used for a bridged address, is a 400 (and a transactionId used here cannot later mint a bridged address). Reporting a transactionHash already tracked for the same destination under another transactionId is a 409 (transferAlreadyRequested) naming the existing transfer; the same hash crediting a different address of yours (one transaction paying several users) is a separate deposit and is accepted. Networks and assets: destination.network is a CAIP-2 id of an EVM, Solana, Tron, Bitcoin or XRP Ledger network and destination.asset a token symbol Mesh knows on that network; any other network type is a 400, and an asset Mesh cannot verify on that network is a 400 (symbolNotSupported). destination.address must be a well-formed address for that network (invalidDestinationAddress otherwise) and transactionHash a well-formed transaction id for it (EVM, Tron, Bitcoin, XRP Ledger: 32 bytes hex, 0x optional; Solana: base58 signature). amount is informational: the on-chain credit is authoritative and is what the succeeded webhook carries, so a differing amount is logged but does not fail the deposit.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Mesh\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/mesh-40/p00HcmipLgvMhble/_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/mesh-40/p00HcmipLgvMhble/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/mesh-40/p00HcmipLgvMhble/_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/mesh-40/p00HcmipLgvMhble/_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/mesh-40/p00HcmipLgvMhble/_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/mesh-40/p00HcmipLgvMhble/_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/mesh-40/p00HcmipLgvMhble/_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/mesh-40/p00HcmipLgvMhble/_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/mesh-40/p00HcmipLgvMhble/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses. - Mesh\">\u003cmeta data-mint-head property=\"og:description\" content=\"For deposits that do not need bridging — the end user sent an asset you accept natively to the deposit address your platform shows them — there is no POST /api/v1/bridging/address call and Mesh is not in the payment path. Call this endpoint once you have seen the transaction on chain so Mesh records it, verifies it independently and sends the same transfer webhooks a bridged deposit produces, giving you one record and one reconciliation stream for every deposit. What happens: Mesh creates the transfer as pending with the reported hash, then verifies on chain that the transaction is confirmed and credited destination.address in destination.asset. On verification the transfer moves to succeeded and the succeeded webhook fires (with the transaction hash and the on-chain amount). A transaction that conclusively did not deliver (it reverted, or moved none of the asset to the address), or one whose credit cannot be verified by expirationTime, marks the transfer failed and a failed webhook is sent. No pending webhook is sent. This endpoint does not return transfer status; use webhooks or the transfers API with tracking.transferId. One call per on-chain transaction. The transaction hash is the deposit\u0026#x27;s identity: a player who deposits several times to the same saved address produces several transactions, and each needs its own call with its own transactionId. Call it after detection, not when the address is displayed. Idempotency: a transactionId is single-use per userId. Re-submitting the same transactionId + userId with the same destination and transactionHash returns the original record (same transferId) in any state, so retries are safe. Re-submitting it with a different destination or hash, or with a transactionId already used for a bridged address, is a 400 (and a transactionId used here cannot later mint a bridged address). Reporting a transactionHash already tracked for the same destination under another transactionId is a 409 (transferAlreadyRequested) naming the existing transfer; the same hash crediting a different address of yours (one transaction paying several users) is a separate deposit and is accepted. Networks and assets: destination.network is a CAIP-2 id of an EVM, Solana, Tron, Bitcoin or XRP Ledger network and destination.asset a token symbol Mesh knows on that network; any other network type is a 400, and an asset Mesh cannot verify on that network is a 400 (symbolNotSupported). destination.address must be a well-formed address for that network (invalidDestinationAddress otherwise) and transactionHash a well-formed transaction id for it (EVM, Tron, Bitcoin, XRP Ledger: 32 bytes hex, 0x optional; Solana: base58 signature). amount is informational: the on-chain credit is authoritative and is what the succeeded webhook carries, so a differing amount is logged but does not fail the deposit.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Mesh\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.meshconnect.com/api-reference/headless-bridging/notify-native-deposit\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://mesh-40.mintlify.app/_mintlify/api/og/v2?division=Headless+bridging+endpoints\u0026amp;title=Report+a+native+%28non-bridged%29+deposit+your+platform+has+already+detected+on+one+of+its+own+deposit+addresses.\u0026amp;description=For+deposits+that+do+not+need+bridging+%E2%80%94+the+end+user+sent+an+asset+you+accept+natively+to+the+deposit%0D%0Aaddress+your+platform+shows+them+%E2%80%94+there+is+no+%60POST+%2Fap\u0026amp;theme=9eeaacc453403c39c4dc5090\u0026amp;signature=73ad541c2ed544c0e59bb751b938a43c0f0ebf82d368fce9af66a9496906cd08\">\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=\"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses. - Mesh\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"For deposits that do not need bridging — the end user sent an asset you accept natively to the deposit address your platform shows them — there is no POST /api/v1/bridging/address call and Mesh is not in the payment path. Call this endpoint once you have seen the transaction on chain so Mesh records it, verifies it independently and sends the same transfer webhooks a bridged deposit produces, giving you one record and one reconciliation stream for every deposit. What happens: Mesh creates the transfer as pending with the reported hash, then verifies on chain that the transaction is confirmed and credited destination.address in destination.asset. On verification the transfer moves to succeeded and the succeeded webhook fires (with the transaction hash and the on-chain amount). A transaction that conclusively did not deliver (it reverted, or moved none of the asset to the address), or one whose credit cannot be verified by expirationTime, marks the transfer failed and a failed webhook is sent. No pending webhook is sent. This endpoint does not return transfer status; use webhooks or the transfers API with tracking.transferId. One call per on-chain transaction. The transaction hash is the deposit\u0026#x27;s identity: a player who deposits several times to the same saved address produces several transactions, and each needs its own call with its own transactionId. Call it after detection, not when the address is displayed. Idempotency: a transactionId is single-use per userId. Re-submitting the same transactionId + userId with the same destination and transactionHash returns the original record (same transferId) in any state, so retries are safe. Re-submitting it with a different destination or hash, or with a transactionId already used for a bridged address, is a 400 (and a transactionId used here cannot later mint a bridged address). Reporting a transactionHash already tracked for the same destination under another transactionId is a 409 (transferAlreadyRequested) naming the existing transfer; the same hash crediting a different address of yours (one transaction paying several users) is a separate deposit and is accepted. Networks and assets: destination.network is a CAIP-2 id of an EVM, Solana, Tron, Bitcoin or XRP Ledger network and destination.asset a token symbol Mesh knows on that network; any other network type is a 400, and an asset Mesh cannot verify on that network is a 400 (symbolNotSupported). destination.address must be a well-formed address for that network (invalidDestinationAddress otherwise) and transactionHash a well-formed transaction id for it (EVM, Tron, Bitcoin, XRP Ledger: 32 bytes hex, 0x optional; Solana: base58 signature). amount is informational: the on-chain credit is authoritative and is what the succeeded webhook carries, so a differing amount is logged but does not fail the deposit.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://mesh-40.mintlify.app/_mintlify/api/og/v2?division=Headless+bridging+endpoints\u0026amp;title=Report+a+native+%28non-bridged%29+deposit+your+platform+has+already+detected+on+one+of+its+own+deposit+addresses.\u0026amp;description=For+deposits+that+do+not+need+bridging+%E2%80%94+the+end+user+sent+an+asset+you+accept+natively+to+the+deposit%0D%0Aaddress+your+platform+shows+them+%E2%80%94+there+is+no+%60POST+%2Fap\u0026amp;theme=9eeaacc453403c39c4dc5090\u0026amp;signature=73ad541c2ed544c0e59bb751b938a43c0f0ebf82d368fce9af66a9496906cd08\">\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/mesh-40/p00HcmipLgvMhble/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Mesh\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#F9FF4D\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.meshconnect.com/api-reference/headless-bridging/notify-native-deposit\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/headless-bridging/notify-native-deposit.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.meshconnect.com/#organization\",\"name\":\"Mesh\",\"url\":\"https://docs.meshconnect.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/mesh-40/xC8T3jgyIbITRgDa/logo/yellow-logo.svg?fit=max\u0026auto=format\u0026n=xC8T3jgyIbITRgDa\u0026q=85\u0026s=1cd02a0ba4a7d0f45f959161701ec02d\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.meshconnect.com#website\",\"name\":\"Mesh\",\"url\":\"https://docs.meshconnect.com\",\"publisher\":{\"@id\":\"https://docs.meshconnect.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.meshconnect.com/api-reference/headless-bridging/notify-native-deposit#webpage\",\"url\":\"https://docs.meshconnect.com/api-reference/headless-bridging/notify-native-deposit\",\"name\":\"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.\",\"description\":\"For deposits that do not need bridging — the end user sent an asset you accept natively to the deposit address your platform shows them — there is no POST /api/v1/bridging/address call and Mesh is not in the payment path. Call this endpoint once you have seen the transaction on chain so Mesh records it, verifies it independently and sends the same transfer webhooks a bridged deposit produces, giving you one record and one reconciliation stream for every deposit. What happens: Mesh creates the transfer as pending with the reported hash, then verifies on chain that the transaction is confirmed and credited destination.address in destination.asset. On verification the transfer moves to succeeded and the succeeded webhook fires (with the transaction hash and the on-chain amount). A transaction that conclusively did not deliver (it reverted, or moved none of the asset to the address), or one whose credit cannot be verified by expirationTime, marks the transfer failed and a failed webhook is sent. No pending webhook is sent. This endpoint does not return transfer status; use webhooks or the transfers API with tracking.transferId. One call per on-chain transaction. The transaction hash is the deposit's identity: a player who deposits several times to the same saved address produces several transactions, and each needs its own call with its own transactionId. Call it after detection, not when the address is displayed. Idempotency: a transactionId is single-use per userId. Re-submitting the same transactionId + userId with the same destination and transactionHash returns the original record (same transferId) in any state, so retries are safe. Re-submitting it with a different destination or hash, or with a transactionId already used for a bridged address, is a 400 (and a transactionId used here cannot later mint a bridged address). Reporting a transactionHash already tracked for the same destination under another transactionId is a 409 (transferAlreadyRequested) naming the existing transfer; the same hash crediting a different address of yours (one transaction paying several users) is a separate deposit and is accepted. Networks and assets: destination.network is a CAIP-2 id of an EVM, Solana, Tron, Bitcoin or XRP Ledger network and destination.asset a token symbol Mesh knows on that network; any other network type is a 400, and an asset Mesh cannot verify on that network is a 400 (symbolNotSupported). destination.address must be a well-formed address for that network (invalidDestinationAddress otherwise) and transactionHash a well-formed transaction id for it (EVM, Tron, Bitcoin, XRP Ledger: 32 bytes hex, 0x optional; Solana: base58 signature). amount is informational: the on-chain credit is authoritative and is what the succeeded webhook carries, so a differing amount is logged but does not fail the deposit.\",\"dateModified\":\"2026-10-30T13:21:24.090Z\",\"isPartOf\":{\"@id\":\"https://docs.meshconnect.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.meshconnect.com/api-reference/headless-bridging/notify-native-deposit#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.meshconnect.com/api-reference/headless-bridging/notify-native-deposit#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.meshconnect.com/api-reference/managed-account-authentication/get-link-token-with-parameters\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Headless bridging endpoints\",\"item\":\"https://docs.meshconnect.com/api-reference/headless-bridging/get-deposit-routes\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.\",\"item\":\"https://docs.meshconnect.com/api-reference/headless-bridging/notify-native-deposit\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.meshconnect.com/api-reference/headless-bridging/notify-native-deposit#apireference\",\"headline\":\"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.\",\"name\":\"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.\",\"description\":\"For deposits that do not need bridging — the end user sent an asset you accept natively to the deposit address your platform shows them — there is no POST /api/v1/bridging/address call and Mesh is not in the payment path. Call this endpoint once you have seen the transaction on chain so Mesh records it, verifies it independently and sends the same transfer webhooks a bridged deposit produces, giving you one record and one reconciliation stream for every deposit. What happens: Mesh creates the transfer as pending with the reported hash, then verifies on chain that the transaction is confirmed and credited destination.address in destination.asset. On verification the transfer moves to succeeded and the succeeded webhook fires (with the transaction hash and the on-chain amount). A transaction that conclusively did not deliver (it reverted, or moved none of the asset to the address), or one whose credit cannot be verified by expirationTime, marks the transfer failed and a failed webhook is sent. No pending webhook is sent. This endpoint does not return transfer status; use webhooks or the transfers API with tracking.transferId. One call per on-chain transaction. The transaction hash is the deposit's identity: a player who deposits several times to the same saved address produces several transactions, and each needs its own call with its own transactionId. Call it after detection, not when the address is displayed. Idempotency: a transactionId is single-use per userId. Re-submitting the same transactionId + userId with the same destination and transactionHash returns the original record (same transferId) in any state, so retries are safe. Re-submitting it with a different destination or hash, or with a transactionId already used for a bridged address, is a 400 (and a transactionId used here cannot later mint a bridged address). Reporting a transactionHash already tracked for the same destination under another transactionId is a 409 (transferAlreadyRequested) naming the existing transfer; the same hash crediting a different address of yours (one transaction paying several users) is a separate deposit and is accepted. Networks and assets: destination.network is a CAIP-2 id of an EVM, Solana, Tron, Bitcoin or XRP Ledger network and destination.asset a token symbol Mesh knows on that network; any other network type is a 400, and an asset Mesh cannot verify on that network is a 400 (symbolNotSupported). destination.address must be a well-formed address for that network (invalidDestinationAddress otherwise) and transactionHash a well-formed transaction id for it (EVM, Tron, Bitcoin, XRP Ledger: 32 bytes hex, 0x optional; Solana: base58 signature). amount is informational: the on-chain credit is authoritative and is what the succeeded webhook carries, so a differing amount is logged but does not fail the deposit.\",\"url\":\"https://docs.meshconnect.com/api-reference/headless-bridging/notify-native-deposit\",\"mainEntityOfPage\":{\"@id\":\"https://docs.meshconnect.com/api-reference/headless-bridging/notify-native-deposit#webpage\"},\"dateModified\":\"2026-10-30T13:21:24.090Z\",\"publisher\":{\"@id\":\"https://docs.meshconnect.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.meshconnect.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Mesh\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Mesh","nav":{"global":null,"groups":[{"group":"Guides","pages":[{"group":"Build your integration","pages":[{"title":"15min Quickstart","href":"/build/15min-quickstart"},{"title":"Prepare to build","href":"/build/prepare-to-build"},{"title":"Fetch a Link Token","href":"/build/fetch-link-token"},{"title":"Launch the Mesh SDK","href":"/build/launch-sdk"},{"title":"Use Mesh's callback functions","href":"/build/callbacks"},{"title":"Supercharge return-users","href":"/build/return-users"},{"title":"Polish the experience","href":"/build/polish"},{"title":"Prepare for go-live","href":"/build/go-live"}]},{"group":"Extend your integration","pages":[{"title":"Add Mesh onramp integrations to your \"Buy\" lineup","href":"/extend/onramp"},{"title":"Add Mesh to your withdrawal flow","href":"/extend/withdrawal"},{"title":"Verify self-hosted wallets","href":"/extend/verify-wallets"}]},{"group":"Further resources","pages":[{"title":"How it all fits together","href":"/resources/how-it-fits"},{"title":"Concepts","href":"/resources/concepts"},{"title":"SDK release notes \u0026 versioning","href":"/resources/sdk-release-notes"},{"title":"Transfer status webhooks","href":"/resources/webhooks"},{"title":"Multi-language support","href":"/resources/multi-language"},{"title":"Fiat currency support","href":"/resources/fiat-currency"},{"title":"Mesh SDK events","href":"/resources/sdk-events"},{"title":"Manual deposits","href":"/resources/manual-deposits"},{"title":"Headless bridging","href":"/resources/headless-bridging"},{"title":"SDK backup mode","href":"/resources/sdk-backup-mode"},{"title":"Just-in-time address fetching","href":"/resources/jit-address-fetching"},{"title":"Managing sub-clients","href":"/resources/sub-clients"},{"title":"Intelligent catalog filtering","href":"/resources/catalog-filtering"},{"title":"Sandbox \u0026 Testnets","href":"/resources/sandbox-testnets"},{"title":"Network and token support","href":"/resources/supported-tokens"},{"title":"Common errors","href":"/resources/common-errors"}]}]},{"group":"API Reference","pages":[{"group":"Core endpoints","pages":[{"openapi":"post /api/v1/linktoken","title":"Get Link token","href":"/api-reference/managed-account-authentication/get-link-token-with-parameters"},{"openapi":"get /api/v1/transfers/managed/mesh","title":"Get Mesh transfers","href":"/api-reference/managed-transfers/get-transfers-initiated-by-mesh"},{"openapi":"get /api/v1/transfers/managed/networks","title":"Get networks","href":"/api-reference/managed-transfers/get-networks"},{"openapi":"get /api/v1/transfers/managed/integrations","title":"Get integrations","href":"/api-reference/managed-transfers/get-integrations"},{"openapi":"get /api/v1/transfers/managed/tokens","title":"Get supported tokens","href":"/api-reference/managed-transfers/get-supported-tokens-list"},{"openapi":"post /api/v1/transfers/managed/quote","title":"Get quote","href":"/api-reference/managed-transfers/quote-transfer"}]},{"group":"Headless bridging endpoints","pages":[{"openapi":"post /api/v1/bridging/routes/deposit","title":"Discover pay-in (source) bridging routes for one or more payout destinations.","href":"/api-reference/headless-bridging/get-deposit-routes"},{"openapi":"post /api/v1/bridging/routes/withdrawal","title":"Discover payout (destination) bridging routes for fixed omnibus (source) legs.","href":"/api-reference/headless-bridging/get-withdrawal-routes"},{"openapi":"post /api/v1/bridging/quote","title":"Get an indicative quote for bridging a given pay-in amount on a configured origin→destination route.","href":"/api-reference/headless-bridging/get-quote"},{"openapi":"post /api/v1/bridging/address","title":"Create a one-time bridging deposit address for a selected origin→destination pair.","description":"Returns a single-use address on the \u003cb>origin\u003c/b> network for the \u003cb>origin\u003c/b> asset. Funds must be\r\nsent to that address on that chain; Mesh detects the deposit, executes the bridge, and delivers\r\nto `destination.address` on the destination network.\r\n \r\n**Deposit-style (user pay-in):** discover routes with `POST /api/v1/bridging/routes/deposit`.\r\nThe end user sends from their wallet to the returned deposit address.\r\n \r\n**Withdrawal-style (platform pay-in):** discover routes with `POST /api/v1/bridging/routes/withdrawal`\r\nto pair an omnibus `origin` with the user’s chosen destination. Your platform sends the origin\r\nasset from that omnibus wallet to the deposit address; the user’s withdrawal address is `destination.address`.\r\n \r\n**Idempotency:** a `transactionId` is single-use per `userId`. While the transfer is still\r\npending, re-submitting the same `transactionId` + `userId` with the same origin, destination and\r\naddress returns the previously created address unchanged (same `transferId`, same\r\n`expirationTime`) rather than generating a new one, so network-error retries are safe. Re-submitting\r\nwith a different origin, destination or address is a `400`. Once the transfer has reached a terminal\r\nstate (succeeded, failed or expired), the same `transactionId` returns `409`; use a new\r\n`transactionId` for a new address.\r\n \r\n**Expiry:** `constraints.expirationTime` is fixed at creation (6 hours by default) and is the point at\r\nwhich Mesh stops tracking the address. A transfer that has not been funded by then is marked failed; a\r\npay-in that arrives before then is bridged and the transfer moves to succeeded as soon as it settles. Do\r\nnot display or use the address after `expirationTime`: the provider may still bridge funds sent\r\nlater, but Mesh will not track them automatically.\r\n \r\n**Minimum amount:** `constraints.minimumAmount` is the smallest pay-in (in the origin asset) Mesh\r\naccepts on this route: the stricter of the route's configured minimum and the platform USD floor\r\nconverted at the current price. It is the same value `POST /api/v1/bridging/quote` returns in its\r\n`constraints` and enforces with `amountBelowMinimum`. `constraints.maximumAmount` is the\r\nplatform USD cap converted at the current price (enforced on `/quote` with `amountExceedsMaximum`);\r\nthe provider's available liquidity may be lower and surfaces at quote time the same way.\r\n \r\n**Typical flow:**\r\n1. Discover routes (`routes/deposit` or `routes/withdrawal`) and fix `origin` + `destination`\r\n (destination includes the recipient withdrawal address when applicable).\r\n2. Call this endpoint with those values.\r\n3. Show the deposit address, constraints (`minimumAmount`, `expirationTime`, `singleUseAddress`),\r\n and warnings to whoever will broadcast the pay-in (end user or your custody system).\r\n4. After the pay-in is sent on-chain, Mesh completes the bridge to the destination address.\r\n5. Use `transferId` from `tracking` for webhooks or the transfer status API.\r\n \r\n**Important:** the deposit address is single-use; do not reuse it.","href":"/api-reference/headless-bridging/create-bridged-address"},{"openapi":"post /api/v1/bridging/notify","title":"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses.","href":"/api-reference/headless-bridging/notify-native-deposit"}]},{"group":"User account endpoints","pages":[{"openapi":"post /api/v1/transfers/managed/address/list","title":"Get deposit addresses","description":"Get or generate a cryptocurrency deposit address that can be used to transfer assets to the financial institution","href":"/api-reference/managed-transfers/get-list-of-deposit-addresses"},{"openapi":"post /api/v1/holdings/get","title":"Get crypto holdings","href":"/api-reference/portfolio/get-holdings"},{"openapi":"post /api/v1/holdings/value","title":"Get holdings values","href":"/api-reference/portfolio/get-holdings-values"},{"openapi":"post /api/v1/balance/get","title":"Get fiat holdings","href":"/api-reference/balance/get-account-balance"}]},{"group":"Verify endpoints","pages":[{"openapi":"post /api/v1/exchange/verify","title":"Get profile data","href":"/api-reference/verify/verify"},{"openapi":"get /api/v1/wallets/verify","title":"Get verified addresses","href":"/api-reference/verify/wallet"}]},{"group":"Token management endpoints","pages":[{"openapi":"post /api/v1/token/refresh","title":"Refresh auth token","href":"/api-reference/managed-account-authentication/refresh-auth-token"},{"openapi":"delete /api/v1/account","title":"Remove connection","href":"/api-reference/managed-account-authentication/remove-connection"}]},{"group":"Account Management endpoints","pages":[{"group":"Auth Token","pages":[{"title":"Generate Auth token","deprecated":null,"version":null,"openapi":"https://admin-api.meshconnect.com/swagger/AdminAPI/swagger.json post /admin/api/v1/Token","href":"/api-reference/auth-token/generate-auth-token"}]},{"group":"Main Clients","pages":[{"title":"Get Main Client callback urls","deprecated":null,"version":null,"openapi":"https://admin-api.meshconnect.com/swagger/AdminAPI/swagger.json get /admin/api/v1/Client/callbackUrls","href":"/api-reference/main-clients/get-main-client-callback-urls"},{"title":"Update Main Client callback urls","deprecated":null,"version":null,"openapi":"https://admin-api.meshconnect.com/swagger/AdminAPI/swagger.json post /admin/api/v1/Client/callbackUrls","href":"/api-reference/main-clients/update-main-client-callback-urls"}]},{"group":"Registered Clients","pages":[{"title":"Get all Registered clients","deprecated":null,"version":null,"openapi":"https://admin-api.meshconnect.com/swagger/AdminAPI/swagger.json get /admin/api/v1/SubClient","href":"/api-reference/registered-clients/get-all-registered-clients"},{"title":"Add new Registered client","deprecated":null,"version":null,"openapi":"https://admin-api.meshconnect.com/swagger/AdminAPI/swagger.json post /admin/api/v1/SubClient","href":"/api-reference/registered-clients/add-new-registered-client"},{"title":"Get Registered client","deprecated":null,"version":null,"openapi":"https://admin-api.meshconnect.com/swagger/AdminAPI/swagger.json get /admin/api/v1/SubClient/{id}","href":"/api-reference/registered-clients/get-registered-client"},{"title":"Update Registered client","deprecated":null,"version":null,"openapi":"https://admin-api.meshconnect.com/swagger/AdminAPI/swagger.json put /admin/api/v1/SubClient/{id}","href":"/api-reference/registered-clients/update-registered-client"},{"title":"Delete Registered client","deprecated":null,"version":null,"openapi":"https://admin-api.meshconnect.com/swagger/AdminAPI/swagger.json delete /admin/api/v1/SubClient/{id}","href":"/api-reference/registered-clients/delete-registered-client"},{"title":"Update Registered client Logo","deprecated":null,"version":null,"openapi":"https://admin-api.meshconnect.com/swagger/AdminAPI/swagger.json post /admin/api/v1/SubClient/{id}/logo","href":"/api-reference/registered-clients/update-registered-client-logo"},{"title":"Remove Registered client Logo","deprecated":null,"version":null,"openapi":"https://admin-api.meshconnect.com/swagger/AdminAPI/swagger.json delete /admin/api/v1/SubClient/{id}/logo","href":"/api-reference/registered-clients/remove-registered-client-logo"}]}]},{"group":"Deprecated","pages":[{"openapi":"get /api/v1/integrations","title":"Get available integrations","href":"/api-reference/managed-account-authentication/retrieve-the-list-of-all-available-integrations"},{"openapi":"get /api/v1/status","title":"Get integrations health status","href":"/api-reference/managed-account-authentication/get-health-status"},{"openapi":"post /api/v1/transfers/managed/address/get","title":"Get deposit address","href":"/api-reference/managed-transfers/get-deposit-address"},{"openapi":"post /api/v1/transfers/address/get","title":"Get deposit address","href":"/api-reference/transfers/get-deposit-address"},{"openapi":"get /api/v1/holdings/portfolio","title":"Get aggregated portfolio","href":"/api-reference/portfolio/get-aggregated-portfolio"},{"openapi":"get /api/v1/balance/portfolio","title":"Get aggregated portfolio fiat balances","href":"/api-reference/balance/get-aggregated-portfolio-fiat-balances"}]}]}]},"title":"Report a native (non-bridged) deposit your platform has already detected on one of its own deposit addresses. - Mesh","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-26-lDe7V.js","utils-CWQmgYtH.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-4-Aw3rSD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C2zjXYA5.js","snippetPresets-DFmpFA7C.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-CT9uE8Ip.js","ApiExamples-FJpQavWq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-D_GvPF7k.js","shallow-Bs2ZB0NO.js","getApiPlaygroundDisplay-DCcqJJk-.js","CodeSnippet-DzDxawVe.js","CodeSnippets-aUr7fU-7.js","getPastedJson-Y1fKsj_I.js","icon-DI4zTsDr.js","MethodPill-C0nDlmSQ.js","DuplicateIcon-NUXbx2nQ.js","createIcon-BdTHrPAi.js","DynamicMarkdown-CtpgKJwj.js","SectionHeading-B3x35tOt.js","axios-vUo_bRtp.js","Markdown-3OmurJMP.js","clsx-DMKzROTp.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-1ms6tsT-.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Ke9xIMFx.js"]}