Find a missing stablecoin deposit
Work through the checks for "the coins never arrived": find the deposit, or the reason it was not credited and what to send support.
This recipe walks through the checks for "the coins never arrived". It either finds the deposit, or finds why Gravv did not credit it and what to send support. It is for a support agent answering "I sent 100 USDC two hours ago and it is not there".
Status. Available.
Money example
- Ada says she sent 100 USDC to her Polygon address
0xc47B…1962. - You look up her transaction on a block explorer. It went out on Ethereum, not Polygon.
- Gravv watches that address on Polygon only, so it credited nothing. Open a support ticket with the hash instead of asking her to send again.
Before you start
Ask the sender for the transaction hash, the network they chose and the coin they sent.
Find out what is required
Run the checks below in order. Each uses data you can see yourself, on Gravv or on a public block explorer.
Steps
1. Did Gravv record it?
The tx_hash filter needs an exact match, so send the hash exactly as the explorer shows it.
curl --request GET \
--url 'https://api.gravv.xyz/v1/transactions?tx_hash=0x6bebb2737f6a6f0fb23c6f5da2cec255404e4fb440034d6608697a8d41bed440' \
--header 'Api-Key: <API_KEY>'
const response = await fetch("https://api.gravv.xyz/v1/transactions?tx_hash=0x6bebb2737f6a6f0fb23c6f5da2cec255404e4fb440034d6608697a8d41bed440", {
method: "GET",
headers: {
"Api-Key": process.env.GRAVV_API_KEY,
},
});
console.log(response.status, await response.json());
import os
import requests
response = requests.get(
"https://api.gravv.xyz/v1/transactions?tx_hash=0x6bebb2737f6a6f0fb23c6f5da2cec255404e4fb440034d6608697a8d41bed440",
headers={
"Api-Key": os.environ["GRAVV_API_KEY"],
},
)
print(response.status_code, response.json())
If the response has a crypto_funding row, Gravv recorded the deposit. Check the customer and the wallet on the row.
2. Did your server miss the webhook?
List the inflow webhook records since the day of the deposit.
curl --request GET \
--url 'https://api.gravv.xyz/v1/webhooks/history?event_type=inflow&start_date=2026-10-13' \
--header 'Api-Key: <API_KEY>'
const response = await fetch("https://api.gravv.xyz/v1/webhooks/history?event_type=inflow&start_date=2026-10-13", {
method: "GET",
headers: {
"Api-Key": process.env.GRAVV_API_KEY,
},
});
console.log(response.status, await response.json());
import os
import requests
response = requests.get(
"https://api.gravv.xyz/v1/webhooks/history?event_type=inflow&start_date=2026-10-13",
headers={
"Api-Key": os.environ["GRAVV_API_KEY"],
},
)
print(response.status_code, response.json())
Open a recent record with GET /v1/webhooks/event/{id}. Its payload has the tx_hash. To resend it, see Trace a transfer and resend a webhook.
3. Check the address
On the explorer, the transaction's recipient (for a token, the token transfer's recipient) must be the wallet's address from GET /v1/wallets/{wallet_id}. On EVM networks, compare the addresses without regard to letter case, because Gravv returns the checksum form and many explorers show lower case. On Stellar and Solana, compare character for character. The most common cause is an address copied from an old wallet, another customer or another app.
4. Check the network
The explorer where you found the transaction must be for the wallet's network. The same 0x… address exists on every EVM network, so an exchange accepts it on any of them. Gravv watches only the wallet's own network.
5. Check the coin
The coin must be a deposit coin for that network:
- USDC or USDT on
polygon,ethereumoravalanche. - USDC on
solanaorstellar.
Gravv never records native coins, such as POL, ETH, SOL and XLM, as deposits.
6. Stellar only: did the sender's wallet refuse?
If the sender's wallet refused to send, the address's trustline was not ready yet. See Receive USDC on Stellar or Solana to make sure a Stellar address is ready.
7. Is only the balance behind?
If the row exists but GET /v1/wallets/{wallet_id} shows an old figure or "stale": true, wait a few seconds and read again.
What can go wrong
| What you find | Why | What to do |
|---|---|---|
A crypto_funding row |
The deposit arrived | Credit the user. Resend the webhook if your server missed it |
| The right address on another EVM network | Wrong network | Do not ask the sender to send again. Contact support with the hash, the network and the wallet id. Gravv does not guarantee recovery |
| The recipient is not your Gravv wallet | Wrong address | The money went elsewhere. Only the owner of that address can return it |
| The right address and network, but USDT on Solana or Stellar, or a native coin | Gravv does not support that coin | Contact support with the hash. You may still have received an inflow.onchain.completed with a <network>:<hash> id and no row |
| The wallet is on a network that is not supported | Gravv does not take deposits on that network | Contact support. Create future wallets on a supported network |
inflow.onchain.failed |
The sender's transaction failed on chain | The money never left the sender, so they must send again |
| Pending on the explorer | The transaction is not final on chain yet | Wait |
Webhooks you will receive
Gravv sends inflow.onchain.completed when it sees the deposit, and inflow.onchain.failed when the sender's transaction failed on chain.
Testing in sandbox
The checks work the same way on test networks, with a test-network explorer.