<h2>Instructions for the Command-Line Interface</h2>
</div>
</div>
<divmarkdown="1">
### The Basics
Monero works a little differently to what you may have become accustomed to from other @cryptocurrencies. In the case of a digital currency like Bitcoin and its many derivatives merchant payment systems will usually create a new recipient @address for each payment or user.
However, because Monero has @stealth-addresses there is no need to have separate recipient addresses for each payment or user, and a single @account address can be published. Instead, when receiving payments a merchant will provide the person paying with a "payment ID".
A @payment-ID is a hexadecimal string that is 64 characters long, and is normally randomly created by the merchant. An example of a payment ID is: `666c75666679706f6e7920697320746865206265737420706f6e792065766572`
### Checking for a Payment in monero-wallet-cli
If you want to check for a payment using monero-wallet-cli you can use the "payments" command followed by the payment ID or payment IDs you want to check. For example:
*get_payments*: this requires a payment_id parameter with a single payment ID.
*get_bulk_payments*: this is the preferred method, and requires two parameters, payment_ids - a JSON array of payment IDs - and an optional min_block_height - the block height to scan from.
It is important to note that the amounts returned are in base Monero units and not in the display units normally used in end-user applications. Also, since a transaction will typically have multiple outputs that add up to the total required for the payment, the amounts should be grouped by the tx_hash or the payment_id and added together. Additionally, as multiple outputs can have the same amount, it is imperative not to try and filter out the returned data from a single get_bulk_payments call.
Before scanning for payments it is useful to check against the daemon RPC API (the get_info RPC call) to see if additional blocks have been received. Typically you would want to then scan only from that received block on by specifying it as the min_block_height to get_bulk_payments.
### Programatically Scanning for Payments
* Get the current block height from the daemon, only proceed if it has increased since our last scan
* Call the get_bulk_payments RPC API call with our last scanned height and the list of all payment IDs in our system
* Store the current block height as our last scanned height
* Remove duplicates based on transaction hashes we have already received and processed