On this page
Retrieve deposit
Read one payment-channel deposit in any state, with its frozen fee snapshot, gross fee and net amounts, and its on-chain evidence.
API key: Payment
Read one deposit by its pcd_ identifier, in any state. An id you learned from a payment_channel.deposit.confirming webhook resolves here immediately, so you never have to hold a webhook payload just to be able to look it up later.
Response (200 OK)
{
"id": "pcd_8ScRvL4jNq2XkB7mTfZdWu",
"payment_channel_id": "pc_2QhKZv6mRt9WdA3nYpLbXf",
"project_id": "prj_xFukZuAJZR06pLVBh3uwzv",
"payment_channel_external_id": "customer-42",
"status": "confirmed",
"is_final": true,
"is_test": false,
"currency": "USDT",
"network": "TRC20",
"chain_id": 728126428,
"contract_address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"gross": "100",
"fee": "1",
"net": "99",
"applied_fee_percent": 1.0,
"customer_fee_percent": 0,
"tx_hash": "9f4c1b7e30ad52c8ef6a1d84b0c39f27a5e6d138f4b90c72ae51d63b8407fc25",
"transfer_id": "9f4c1b7e30ad52c8ef6a1d84b0c39f27a5e6d138f4b90c72ae51d63b8407fc25:41a614f803b6fd780986a42c78ec9c7f77e6ded13c:41c9f6a2b7d0138e54ca3b91f6072ed48a5c1e93b7:0",
"source_address": "TW9s4RkAqBnLpVdX2ChYzUeGm7QfKt3NbZ",
"destination_address": "TN3W4H6rK2ce4vX9YnFQHwKENnHjoxb3m9",
"block_height": 68421905,
"first_included_block_timestamp": 1767225900,
"explorer_url": "https://tronscan.org/#/transaction/9f4c1b7e30ad52c8ef6a1d84b0c39f27a5e6d138f4b90c72ae51d63b8407fc25",
"created_at": 1767225870,
"updated_at": 1767225930,
"confirmed_at": 1767225930
}
Fields
| Field | Meaning |
|---|---|
id |
The deposit identifier (pcd_…). This is what you deduplicate on. |
payment_channel_id, payment_channel_external_id |
The channel that received it, and the identifier you gave that channel. |
status |
confirming, reorged or confirmed. |
is_final |
true only for confirmed. |
currency, network, chain_id, contract_address |
The token that arrived and where. contract_address is the token's on-chain identifier — contract address on EVM and Tron, jetton master on TON, SPL mint on Solana. |
gross, fee, net |
Decimal strings. net is what reaches your balance. |
applied_fee_percent, customer_fee_percent |
The rates frozen for this deposit at attribution. |
tx_hash, transfer_id, block_height |
On-chain evidence. transfer_id is opaque — match on it, do not parse it. |
source_address |
The payer's address when the chain exposes one; absent otherwise. |
destination_address |
The channel address the money arrived at. |
first_included_block_timestamp |
When the transaction first appeared in a block. |
explorer_url |
A block-explorer link when one exists for that network. |
confirmed_at |
Set once, when the deposit reached confirmed. |
contract_address is nullable in the schema and empty only for a native coin. No native coin is an accepted asset, so every deposit you can read carries a value there. GET /v1/invoices/:id applies the same rule to payment.contract_address, so one code path covers both resources.
Statuses
| Status | Meaning | Final |
|---|---|---|
confirming |
Seen on chain, waiting for the confirmations that network requires | No |
reorged |
The transaction was dropped by a chain reorganization | No |
confirmed |
Settled. The net amount is credited to your balance | Yes |
confirmed is absorbing: once a deposit reaches it, nothing moves it back. reorged is quiescent but not final — if the same transaction is re-included in a later block, the same deposit returns to confirming and can go on to confirm. It keeps its pcd_ identifier throughout, so you never see a second deposit for one payment.
There is no failed state. A deposit that reorgs and is never re-included simply stays reorged.
Money is recorded, not recalculated
applied_fee_percent and customer_fee_percent are a snapshot taken when the deposit was attributed. Changing your pricing afterwards does not alter a deposit that already exists, and re-reading an old deposit returns the same gross, fee and net it always had.
For a confirmed production deposit those three amounts are read back from the accounting entry that credited your balance — they are the same numbers your statement shows, not a recomputation. With a 1% rate, a 100 USDT deposit reports gross 100, fee 1, net 99.
Amounts are decimal strings with trailing zeros trimmed. Parse them with a decimal type; binary floating point loses precision at stablecoin scale.
Errors
| Code | HTTP | When |
|---|---|---|
payment_channels_disabled |
503 | Payment channels are not enabled for your account in this environment. |
payment_key_required |
403 | The request was signed with a Payout (rk_) key. |
payment_channel_deposit_not_found |
404 | The id resolves to nothing this credential may see. |
field_invalid_format |
400 | The path segment is not a valid pcd_ identifier. |
See Error Codes for the full catalogue.