{"id":35744965,"url":"https://github.com/vsys-host/shkeeper.io","last_synced_at":"2026-04-07T13:02:17.399Z","repository":{"id":37771339,"uuid":"488519742","full_name":"vsys-host/shkeeper.io","owner":"vsys-host","description":"SHKeeper is a self-hosted and open-source cryptocurrency gateway payment processor. It's integrate with popular CMS, any e-commerce, your own code or product","archived":false,"fork":false,"pushed_at":"2026-02-12T16:52:12.000Z","size":1203,"stargazers_count":516,"open_issues_count":24,"forks_count":132,"subscribers_count":9,"default_branch":"main","last_synced_at":"2026-02-12T21:38:14.785Z","etag":null,"topics":["accept-crypto","accept-crypto-payments","crypto","crypto-gateway","crypto-payment","crypto-payment-api","crypto-payment-gateway","crypto-payments","crypto-processor","cryptocurrency-payments","gateway","gateway-api","gateway-service","gateway-services","open-source","payment-gateway","payment-processing","payment-processor","self-hosted","self-hosted-api"],"latest_commit_sha":null,"homepage":"https://shkeeper.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vsys-host.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-05-04T09:04:43.000Z","updated_at":"2026-02-12T16:46:49.000Z","dependencies_parsed_at":"2022-07-15T21:48:17.766Z","dependency_job_id":"b4abd6a4-c7d4-4873-92e6-5715d938f291","html_url":"https://github.com/vsys-host/shkeeper.io","commit_stats":null,"previous_names":[],"tags_count":118,"template":false,"template_full_name":null,"purl":"pkg:github/vsys-host/shkeeper.io","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vsys-host%2Fshkeeper.io","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vsys-host%2Fshkeeper.io/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vsys-host%2Fshkeeper.io/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vsys-host%2Fshkeeper.io/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vsys-host","download_url":"https://codeload.github.com/vsys-host/shkeeper.io/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vsys-host%2Fshkeeper.io/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30081043,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T12:28:08.313Z","status":"ssl_error","status_checked_at":"2026-03-04T12:27:28.210Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accept-crypto","accept-crypto-payments","crypto","crypto-gateway","crypto-payment","crypto-payment-api","crypto-payment-gateway","crypto-payments","crypto-processor","cryptocurrency-payments","gateway","gateway-api","gateway-service","gateway-services","open-source","payment-gateway","payment-processing","payment-processor","self-hosted","self-hosted-api"],"created_at":"2026-01-06T17:18:58.085Z","updated_at":"2026-04-07T13:02:17.391Z","avatar_url":"https://github.com/vsys-host.png","language":"Python","readme":"# SHKeeper.io\u003c!-- omit in toc --\u003e\n\n![SHKeeper logo](https://github.com/user-attachments/assets/dd573f14-1b8e-47d7-86e5-59f24b67b027)\n\n- [About SHKeeper](#about-shkeeper)\n - [Demo](#demo)\n - [Helpful links](#helpful-links)\n- [Available coins](#available-coins)\n- [Features](#features)\n- [Installation](#installation)\n- [Developing](#developing)\n  - [Payment flow](#payment-flow)\n  - [API](#api)\n     - [Auth](#auth)\n        - [ApiKey](#apikey)\n        - [Basic (used only for Payout)](#basic-used-only-for-payout)\n        - [Supported fiat currencies](#supported-fiat-currencies)\n     - [Retrieve the list of available cryptocurrencies](#retrieve-the-list-of-available-cryptocurrencies)\n     - [Invoice creation](#invoice-creation)\n     - [Retrieve created addresses](#retrieve-created-addresses)\n     - [Retrieve transactions by address](#retrieve-transactions-by-address)\n     - [Retrieve information by external_id](#retrieve-information-by-external_id)\n     - [Retrieve information by the pair of transaction_id and external_id](#retrieve-information-by-the-pair-of-transaction_id-and-external_id)\n     - [Wallet encryption (Enter decryption_key via API)](#wallet-encryption-enter-decryption_key-via-api)\n     - [Retrieving metrics](#retrieving-metrics)\n     - [Payout](#payout)\n     - [Payout related endpoints](#payout-related-endpoints)\n        - [Creating a payout task](#creating-a-payout-task)\n        - [Creating a multipayout task](#creating-a-multipayout-task)\n        - [Checking task status](#checking-task-status)\n        - [Get crypto balance information](#get-crypto-balance-info)\n        - [Get fee deposit address](#get-fee-deposit-address)\n  - [Receiving callback](#receiving-callback)\n  - [Ready-made modules](#ready-made-modules)\n     - [WHMCS](#whmcs)\n     - [WooCommerce WordPress](#woocommerce-wordpress)\n     - [Opencart 3](#opencart-3)\n     - [Prestashop 8](#prestashop-8)\n- [Be involved](#be-involved)\n- [Contact us](#contact-us)\n\n\u003ca name=\"about-shkeeper\"\u003e\u003c/a\u003e\n## 1. About SHKeeper\n\nSHKeeper - is an open-source, self-hosted cryptocurrency payment processor. It uniquely serves as both a gateway and a merchant, enabling you to accept payments in various cryptocurrencies without fees and intermediaries.\n\n\u003ca name=\"demo\"\u003e\u003c/a\u003e\n### 1.1. Demo\n\nSHKeeper demo version is available from us (works in testnet network), so you can try it yourself without installing it:\n\nhttps://demo.shkeeper.io/\n\n**Login:** admin\n\n**Password:** admin\n\n\u003ca name=\"helpful-links\"\u003e\u003c/a\u003e\n### 1.2. Helpful links\n\n**Details of the latest version can be found here:** https://github.com/vsys-host/shkeeper.io/commits/main/\n\n**Find the comprehensive list of API endpoints here https://shkeeper.io/api/**\n\n**Tutorial video:** https://www.youtube.com/watch?v=yYK_JAm1_hg\n\n**Find the knowledge base here:** https://shkeeper.io/kb/launch/what-is-shkeeper\n\n**Latest announcements:** https://shkeeper.io/news\n\n\u003ca name=\"available-coins\"\u003e\u003c/a\u003e\n## 2. Available coins\nSHKeeper offers a direct way to receive BTC, ETH, LTC, DOGE, XMR, XRP, TRX, BNB, SOL, MATIC, AVAX, FIRO, USDT (ERC20, TRC20, BEP-20, Polygon, Avalanche), USDC (ERC20, TRC20, BEP-20, Polygon, Avalanche).\n\n\u003cimg width=\"2060\" height=\"800\" alt=\"Group 2614\" src=\"https://github.com/user-attachments/assets/d44d5343-cd90-473f-a63f-dd1b1b74e8c5\" /\u003e\n\n\u003ca name=\"features\"\u003e\u003c/a\u003e\n## 3. Features\n\n1. Non-custodial\n2. Multi-currency\n3. No transaction fees \u0026 third parties\n4. Direct crypto payments\n5. Easily embed payment buttons / QR-code\n6. Ability to set your exchange rates, commissions, or fees\n7. Crediting the overpayment to the balance\n8. Partial payments\n9. Setting auto-payments into a cold wallet\n10. Increased privacy and security\n11. No KYC or AML\n12. Multipayout\n\n![image](https://github.com/user-attachments/assets/e7c637af-8da6-455b-80f5-9b054cfff03b)\n\n\u003ca name=\"installation\"\u003e\u003c/a\u003e\n## 4. Installation\n\nInstall k3s and helm on a fresh server (tested on Ubuntu 22):\n\n```\n# curl -sfL https://get.k3s.io | sh -\n# mkdir /root/.kube \u0026\u0026 ln -s /etc/rancher/k3s/k3s.yaml /root/.kube/config\n# curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash\n```\n\nCreate Shkeeper chart configuration file `values.yaml` with BTC, LTC, DOGE, XMR enabled:\n\n```\n# cat \u003c\u003c EOF \u003e values.yaml\n\n#\n# General\n#\n\nstorageClassName: local-path\n\n#\n# BTC and forks\n#\n\nbtc:\n  enabled: true\nltc:\n  enabled: true\ndoge:\n  enabled: true\n\n#\n# Monero\n#\n\nmonero:\n  enabled: true\n  fullnode:\n    enabled: true\nEOF\n```\n\nInstall Shkepeer helm chart:\n\n```\n# helm repo add vsys-host https://vsys-host.github.io/helm-charts\n# helm repo add mittwald https://helm.mittwald.de\n# helm repo update\n# helm install kubernetes-secret-generator mittwald/kubernetes-secret-generator\n# helm install -f values.yaml shkeeper vsys-host/shkeeper\n```\n\nLogin to Shkeeper: http://\\\u003cip\u003e\\:5000/\n\n\n### Install auto SSL\n\nInstall cert-manager:\n\n```\n# helm repo add jetstack https://charts.jetstack.io\n# helm install \\\n  cert-manager jetstack/cert-manager \\\n  --namespace cert-manager \\\n  --create-namespace \\\n  --version v1.9.1 \\\n  --set installCRDs=true\n```\n\nCreate CRDs, replace \"demo.shkeeper.io\" and \"support@v-sys.org\" with your own domain and email address:\n\n```\ncat \u003c\u003c EOF \u003e ssl.yaml\n---\napiVersion: cert-manager.io/v1\nkind: Certificate\nmetadata:\n  name: shkeeper-cert\n  namespace: shkeeper\nspec:\n  commonName: demo.shkeeper.io\n  secretName: shkeeper-cert\n  dnsNames:\n    - demo.shkeeper.io\n  issuerRef:\n    name: letsencrypt-production\n    kind: ClusterIssuer\n---\napiVersion: cert-manager.io/v1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-production\nspec:\n  acme:\n    email: support@v-sys.org\n    server: https://acme-v02.api.letsencrypt.org/directory\n    privateKeySecretRef:\n      name: your-own-very-secretive-key\n    solvers:\n      - http01:\n          ingress:\n            class: traefik\n---\napiVersion: traefik.containo.us/v1alpha1\nkind: IngressRoute\nmetadata:\n  name: shkeeper\n  namespace: shkeeper\nspec:\n  entryPoints:\n    - web\n    - websecure\n  routes:\n    - match: Host(`demo.shkeeper.io`)\n      kind: Rule\n      services:\n        - name: shkeeper\n          port: 5000\n          namespace: shkeeper\n  tls:\n    secretName: shkeeper-cert\nEOF\n```\n\nApply CRDS:\n\n```\n# kubectl apply -f ssl.yaml\n```\n\nAfter a few minutes, your Shkeeper should be reachable on https://\\\u003cyour domain\\\u003e and have a valid SSL.\n\n### Additional configuration for Bitcoin Lightning (advanced users only)\n\nEnable autossl-enabled Ingress on port 9000 for LNURL:\n\n```\ncat \u003c\u003c EOF \u003e /var/lib/rancher/k3s/server/manifests/traefik-config.yaml\napiVersion: helm.cattle.io/v1\nkind: HelmChartConfig\nmetadata:\n  name: traefik\n  namespace: kube-system\nspec:\n  valuesContent: |-\n    additionalArguments:\n      - \"--certificatesresolvers.default.acme.email=acme@shkeeper.io\"\n      - \"--certificatesresolvers.default.acme.storage=/data/acme.json\"\n      - \"--certificatesresolvers.default.acme.httpchallenge.entrypoint=web\"\n    ports:\n      lnurl:\n        port: 9000\n        exposedPort: 9000\n        expose:\n          default: true\nEOF\n```\n\nPort `9000` should be publicly available for LNURL to work.\n\nEdit `values.yaml` to include `domain:` and `external_ip:` at the top level. The `domain` will be used for generating LNURL and `external_ip` is used for Lightning p2p communication.\n\n```\n#\n# General\n#\n\nstorageClassName: local-path\nexternal_ip: 1.2.3.4\ndomain: my-shkeeper.example.com\n\n...\n```\n\n\u003ca name=\"developing\"\u003e\u003c/a\u003e\n## 5. Developing\n\u003ca name=\"payment-flow\"\u003e\u003c/a\u003e\n**Find the comprehensive list of endpoints here https://shkeeper.io/api/**\n### 5.1. Payment flow\nThe process of accepting payments through SHKeeper works as follows:\nOnce you have installed SHKeeper and see active Wallets in the SHKeeper admin panel, you can start configuring your store to work with SHKeeper. SHKeeper operates on an invoice-based system, where each created invoice in SHKeeper corresponds to a unique address for the respective cryptocurrency. This allows you to identify the customer who made the payment.\n\nCreating an invoice requires passing the `X-Shkeeper-Api-Key` in the header, and you also need to know the cryptocurrency name to form the endpoint for the request.\n\nTo begin, you need to obtain a list of cryptocurrencies available for invoice creation from SHKeeper (these are the ones that are online and not disabled in the admin panel).\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/66374540-21de-4cb1-a07f-0813600b743c\" alt=\"image6\"\u003e\n\u003c/p\u003e\n\nTo do this, use the [endpoint](#retrieve-the-list-of-available-cryptocurrencies) `/api/v1/crypto`. This endpoint does not require authorization. The retrieved list can be displayed to the customer to choose the desired cryptocurrency for payment.\n\nNext, create an invoice for the selected cryptocurrency using the [endpoint](#invoice-creation) `/api/v1/{crypto_name}/payment_request`. An invoice in SHKeeper should be created at the stage when you already know the unique `order_id /invoice_id` in your system, and only for the cryptocurrency chosen by the customer (do not create invoices for all cryptocurrencies received from SHKeeper immediately, as this will generate excess addresses that will not be used later). Invoices in SHKeeper are unique, one invoice will be created in the SHKeeper system for one `external_id`. The customer can change their mind and generate an address for another cryptocurrency; in this case, simply create an invoice for the new cryptocurrency as usual, and SHKeeper will automatically update the information in the already created invoice and provide you with a new payment address. If the customer pays to the previously generated address, SHKeeper will process the payment, and you will receive a notification (callback) about this payment, as SHKeeper saves all addresses generated by the customer. For each cryptocurrency, the customer receives a unique cryptocurrency address linked to their specific `order_id` (invoice_id). This address remains the same even if you send another request to SHKeeper to create the same invoice.\n\nWhen creating an invoice in SHKeeper, provide a `callback_url` to indicate where SHKeeper should send a notification (callback) upon receiving a transaction associated with this invoice. When transactions are received for the corresponding invoice, SHKeeper updates the status of the invoice. An invoice in SHKeeper can be in one of the following statuses: UNPAID, PARTIAL, PAID, OVERPAID. You receive the current status of the invoice in the callback.\n\n- **UNPAID**: The initial status for a newly created invoice, where no transactions have been made.\n- **PARTIAL**: The status for an invoice that has received a transaction, but the amount is insufficient for full payment.\n- **PAID**: A fully paid invoice in SHKeeper. You can influence the thresholds for when an invoice is considered fully paid by using the appropriate setting in the wallet.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/7c04fd4f-d04f-4112-b5c0-468ba98b4686\" alt=\"image5\"\u003e\n\u003c/p\u003e\n\n- **OVERPAID**: The status when the client has sent a total amount in transactions that exceed the sum of the generated invoice. You can influence the thresholds for when an invoice is considered overpaid by using the appropriate setting in the wallet.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/ea1f48be-00bf-4fc2-beaa-bcd90789025e\" alt=\"image2\"\u003e\n\u003c/p\u003e\n\nYou can consider the SHKeeper invoice status when developing a payment module for your store, but be mindful when using the `overpaid_fiat`  value from the callback in the OVERPAID status.\nBy default, when adding a transaction and calculating the amount in fiat, SHKeeper uses the cryptocurrency exchange rate that was in effect at the time the invoice was created or updated. However, you can adjust this behavior by configuring the relevant field in the wallet settings.\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/4ad2ee1f-652a-43da-81f3-8e913d931144\" alt=\"image3\"\u003e\n\u003c/p\u003e\n\nIf you have set “Recalculate invoice rate” to a value other than 0, then in the case of an invoice being paid after the specified time, the exchange rate will be the one at the moment the transaction is credited. When creating an invoice in SHKeeper, an object is returned that includes the `recalculate_after` field, allowing you to inform the customer of how long the current exchange rate will be held for them.\n\n#### Static address mode (advanced)\n\nFor businesses that need a permanent deposit address per customer (e.g., exchanges, custodial flows, recurring deposits), SHKeeper supports a “static address” usage pattern **without** changing the core invoice mechanics:\n\n1. **Create a “large” reusable invoice per customer and per coin.**\n   Set an intentionally high target amount so the invoice never reaches the “fully paid” state during normal operation. This lets you reuse the **same address** for many deposits from the same customer.\n\n2. **Keep the address static by reusing the same invoice.**\n   Each invoice in SHKeeper maps to a unique blockchain address. By reusing that invoice, you keep the deposit address unchanged for the customer.\n\n3. **Control pricing exposure with “Recalculate invoice rate after”.**\n   Set a minimal recalculation period (e.g., 1 hour) so fiat/crypto conversion snapshots are refreshed at your cadence. Within the configured period, the rate remains fixed; after it expires, the next transactions will use the updated rate snapshot automatically.\n\n**Notes \u0026 caveats**\n\n- This approach preserves a **static deposit address** while keeping rate handling predictable via the recalculation window.\n- Standard invoice thresholds (under/overpayment windows) and confirmations still apply.\n- Accounting \u0026 reconciliation remain invoice-centric: you attribute multiple deposits to the same customer by keeping a dedicated invoice per customer/coin.\n\n\u003ca name=\"api\"\u003e\u003c/a\u003e\n### 5.2. API\n\u003ca name=\"auth\"\u003e\u003c/a\u003e\n#### 5.2.1. Auth\n\u003ca name=\"apikey\"\u003e\u003c/a\u003e\n##### 5.2.1.1. ApiKey\n\nGo to SHKeeper and either view or generate a new API Key.\n![image4](https://github.com/user-attachments/assets/2d97d861-f5f5-44de-9b44-3be913d165d2)\n![image1](https://github.com/user-attachments/assets/1737bc56-2531-4e03-9d47-15af080da336)\n\n\nThe API key is the same for each wallet, so you can perform this procedure on any available one.\n\nSHKeeper supports user authentication and authorization through an API Key generated by the user. Send the API Key as a header value to Authorization with the format: `X-Shkeeper-Api-Key {API Key}`\n\nThe only request that does not require authorization is the one for retrieving the list of active cryptocurrencies: `GET /api/v1/crypto`\n\u003ca name=\"basic-used-only-for-payout\"\u003e\u003c/a\u003e\n##### 5.2.1.2. Basic (used only for Payout)\nSHKeeper supports authenticating and authorizing user through the Basic HTTP authentication scheme only for Payout related API calls. Send the user and password encoded in base64 with the format `Basic {base64(username:password)}`. Using this authentication is required for payout-related [endpoints](#payout-related-endpoints).\n\n\u003ca name=\"supported-fiat-currencies\"\u003e\u003c/a\u003e\n##### 5.2.1.3. Supported fiat currencies\nSHKeeper always supports `USD` and `EUR`.\n\nYou can add more fiat currencies using the `EXTRA_CURRENCIES` environment variable.\n\nExamples:\n- `EXTRA_CURRENCIES=\"\"` -\u003e `USD`, `EUR`\n- `EXTRA_CURRENCIES=\"TRY,CAD\"` -\u003e `USD`, `EUR`, `TRY`, `CAD`\n\n\u003ca name=\"retrieve-the-list-of-available-cryptocurrencies\"\u003e\u003c/a\u003e\n#### 5.2.2. Retrieve the list of available cryptocurrencies\n\n**Endpoint:** `/api/v1/crypto`\n**Authorization:** No authorization is required.\n**HTTP request method:** GET\n**Example Curl request:**\n\n```\ncurl --location --request GET\n'https://demo.shkeeper.io/api/v1/crypto'\n```\n**Successful response:**\n```\n{\n    \"crypto\": [\n        \"BNB\",\n        \"ETH\",\n        ...\n    ],\n    \"crypto_list\": [\n        {\n            \"display_name\": \"BNB\",\n            \"name\": \"BNB\"\n        },\n        {\n            \"display_name\": \"Ethereum\",\n            \"name\": \"ETH\"\n        },\n        ...\n    ],\n    \"status\": \"success\"\n}\n```\nUse the `crypto_list` array; the `crypto` array exists only for backward compatibility. In the `crypto_list` array:\n- `name` is used when forming the endpoint for invoice creation requests,\n- `display_name` is the cryptocurrency human-readable format.\n\n**Notes \u0026 caveats**\n\nSHKeeper uses a short-lived in-memory TTL cache to speed up the /crypto endpoints. Cached data about available cryptocurrencies and node status may be slightly outdated (up to 60 seconds). In multi-process deployments, each instance keeps its own cache, which may cause minor differences between responses. The cache reduces short-term node or network fluctuations but may briefly delay reflecting real-time status changes.\n\n\u003ca name=\"invoice-creation\"\u003e\u003c/a\u003e\n#### 5.2.3. Invoice Creation\n\n**Endpoint:** `/api/v1/\u003ccrypto_name\u003e/payment_request`\n**Authorization:** ApiKey.\n**HTTP request method:**  POST request with a JSON object in the following format:\n```\n{\n    \"external_id\":\u003corder_id\u003e,\n    \"fiat\":\"USD\",\n    \"amount\":\"\u003corder_amount\u003e\",\n    \"callback_url\":\"\u003ccallback_script_url\u003e\"\n}\n```\n\n- `external_id`: A unique order_id or invoice_id from your store.\n- `fiat`: Currency code in ISO 4217 format for conversion. `USD` and `EUR` are enabled by default; additional currencies can be enabled with `EXTRA_CURRENCIES`.\n- `amount`: The amount for which the invoice should be created in SHKeeper.\n- `callback_url`: The URL to which SHKeeper will send notifications in the event of transactions related to the created invoices.\n\nSHKeeper uses pair  `external_id` and `callback_url` as invoice identificator and update invoice in case repeating it on the next invoice creation requests.\n**Example Curl request:**\n```\ncurl --location --request POST 'https://demo.shkeeper.io/api/v1/ETH/payment_request' \\\n--header 'X-Shkeeper-API-Key: nApijGv8djih7ozY' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\"external_id\":107,\"fiat\":\"USD\",\"amount\":\"18.25\",\"callback_url\":\"https://my-billing/callback.php\"}'\n```\n**Success Example Response:**\n```\n{\n    \"amount\": \"0.01080125\",\n    \"display_name\": \"Ethereum\",\n    \"exchange_rate\": \"3379.24\",\n    \"id\": 61,\n    \"recalculate_after\": 0,\n    \"status\": \"success\",\n    \"wallet\": \"0x8695f1a224e28adf362E6f8a8E695EDCc5D64960\"\n}\n```\n**Unavailable Crypto Response:**\n```\n{\n    \"message\": \"BTC payment gateway is unavailable\",\n    \"status\": \"error\"\n}\n```\n\u003ca name=\"quote-generation\"\u003e\u003c/a\u003e\n#### 5.2.3.1 Quote Generation\n\n**Endpoint:** `/api/v1/\u003ccrypto_name\u003e/quote`\n**Authorization:** ApiKey.\n**HTTP request method:** POST request with a JSON object in the following format:\n```json\n{\n    \"fiat\": \"USD\",\n    \"amount\": \"100.00\"\n}\n```\n\n- `fiat`: Currency code in ISO 4217 format for conversion. `USD` and `EUR` are enabled by default; additional currencies can be enabled with `EXTRA_CURRENCIES`.\n- `amount`: The amount for which the crypto quote should be generated.\n\nThis endpoint returns the crypto amount equivalent and the exchange rate used for the conversion. It does **not** create an invoice and is intended for informational purposes (e.g., showing the user how much crypto they'll need to pay before generating a real invoice).\n\n**Example Curl request:**\n```bash\ncurl --location --request POST 'https://demo.shkeeper.io/api/v1/ETH/quote' \\\n--header 'X-Shkeeper-API-Key: nApijGv8djih7ozY' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\"fiat\":\"USD\",\"amount\":\"100.00\"}'\n```\n\n**Success Example Response:**\n```json\n{\n    \"crypto_amount\": \"0.02981237\",\n    \"exchange_rate\": \"3353.26\",\n    \"status\": \"success\"\n}\n```\n\n**Unavailable Crypto Response:**\n```json\n{\n    \"message\": \"BTC payment gateway is unavailable\",\n    \"status\": \"error\"\n}\n```\n\u003ca name=\"retrieve-created-addresses\"\u003e\u003c/a\u003e\n#### 5.2.4. Retrieve created addresses\n\n**Endpoint:** `/api/v1/\u003ccrypto_name\u003e/addresses`\n**Authorization:** ApiKey.\n**HTTP request method:** GET\n**Example Curl request:**\n```\ncurl --location --request GET 'https://demo.shkeeper.io/api/v1/ETH-USDC/addresses' \\\n--header 'X-Shkeeper-Api-Key: nApijGv8djih7ozY'\n```\n**Successful Response:**\n```\n{\n    \"addresses\": [\n        \"0x0A71f4741DcaD3C06AA51eE6cF0E22675507d0d0\",\n        …\n        \"0x8695f1a224e28adf362E6f8a8E695EDCc5D64960\"\n    ],\n    \"status\": \"success\"\n}\n```\n\u003ca name=\"retrieve-transactions-by-address\"\u003e\u003c/a\u003e\n#### 5.2.5. Retrieve transactions by address\n**Endpoint:** `/api/v1/transactions/\u003ccrypto_name\u003e/\u003caddr\u003e`\n**Authorization:** ApiKey.\n**HTTP request method:** GET\n**Curl Example:**\n```\ncurl --location --request GET 'https://demo.shkeeper.io/api/v1/transactions/ETH/0xDCA83F12D963c7233E939a32e31aD758C7cCF307' \\\n--header 'X-Shkeeper-API-Key: nApijGv8djih7ozY'\n```\n**Successful Response:**\n```\n{\n    \"status\": \"success\",\n    \"transactions\": [\n        {\n            \"addr\": \"0xDCA83F12D963c7233E939a32e31aD758C7cCF307\",\n            \"amount\": \"0.0001000000\",\n            \"crypto\": \"ETH\",\n            \"status\": \"CONFIRMED\",\n            \"txid\": \"0xbcf68720db79454f40b2acf6bfb18897d497ab4d8bc9faf243c859d14d5d6b66\"\n        }\n    ]\n}\n```\n**Not Found Response:**\n```\n{\n    \"status\": \"success\",\n    \"transactions\": []\n}\n```\n\u003ca name=\"retrieve-information-by-external_id\"\u003e\u003c/a\u003e\n#### 5.2.6. Retrieve information by external_id\n**Endpoint:** `/api/v1/invoices/\u003cexternal_id\u003e`\n**Authorization:** ApiKey.\n**HTTP request method:** GET\n**Curl Example:**\n```\ncurl --location --request GET 'https://demo.shkeeper.io/api/v1/invoices/107' \\\n--header 'X-Shkeeper-API-Key: nApijGv8djih7ozY'\n```\n**Successful Response:**\n```\n{\n    \"invoices\": [\n        {\n            \"amount_fiat\": \"18.2500000000\",\n            \"balance_fiat\": \"0E-10\",\n            \"external_id\": \"107\",\n            \"fiat\": \"USD\",\n            \"status\": \"UNPAID\",\n            \"txs\": []\n        }\n    ],\n    \"status\": \"success\"\n}\n```\n**Not Found Response:**\n```\n{\n    \"invoices\": [],\n    \"status\": \"success\"\n}\n```\n\u003ca name=\"retrieve-information-by-the-pair-of-transaction_id-and-external_id\"\u003e\u003c/a\u003e\n#### 5.2.7. Retrieve information by the transaction_id and external_id\n**Endpoint:** `/api/v1/tx-info/\u003ctx_id\u003e/\u003cexternal_id\u003e`\n**Authorization:** ApiKey.\n**HTTP request method:** GET\n**Curl Example:**\n```\ncurl --location --request GET 'https://demo.shkeeper.io/api/v1/tx-info/0xbcf68720db79454f40b2acf6bfb18897d497ab4d8bc9faf243c859d14d5d6b66/240' \\\n--header 'X-Shkeeper-API-Key: nApijGv8djih7ozY'\n```\n**Successful Response:**\n```\n{\n    \"info\": {\n        \"addr\": \"0xDCA83F12D963c7233E939a32e31aD758C7cCF307\",\n        \"amount\": \"0.295503\",\n        \"crypto\": \"ETH\"\n    },\n    \"status\": \"success\"\n}\n```\n**Not Found Response:**\n```\n{\n    \"info\": {},\n    \"status\": \"success\"\n}\n```\n\u003ca name=\"wallet-encryption-enter-decryption_key-via-api\"\u003e\u003c/a\u003e\n#### 5.2.8. Wallet encryption (Enter decryption_key via API)\n**Endpoint:** `/api/v1/decryption-key`\n**Authorization:** ApiKey.\n**HTTP request method:**  POST request with a formdata body in the following format:\n```\nkey=\u003cdecryption_key\u003e\n```\n**Curl Example:**\n```\ncurl --location --request POST 'https://demo.shkeeper.io/api/v1/decryption-key' \\\n--header 'X-Shkeeper-API-Key: nApijGv8djih7ozY' \\\n--form 'key=\"asdfasfasgasgasgasgdeagweg\"'\n```\n**Successful Decrypt Response:**\n```\n{\n    \"status\": \"success\"\n}\n```\n**Successful Response (Decryption is not needed):**\n```\n{\n    \"message\": \"Decryption key was already entered\",\n    \"status\": \"success\"\n}\n```\n**Error Responses:**\n```\n{\n    \"message\": \"Decryption key is required\",\n    \"status\": \"error\"\n}\n{\n    \"message\": \"Invalid decryption key\",\n    \"status\": \"error\"\n}\n{\n    \"message\": \"Wallet is not encrypted\",\n    \"status\": \"error\"\n}\n```\n\u003ca name=\"retrieving-metrics\"\u003e\u003c/a\u003e\n#### 5.2.9. Retrieving Metrics\n\n**Endpoint:** `/metrics`\n**Authorization:** HTTP Basic Auth using metric credentials. Metric credentials can be set by environment variables: `METRICS_USERNAME, METRICS_PASSWORD`. The default username/password is `shkeeper/shkeeper`.\n**HTTP request method:**  GET\n**Example Curl Request:**\n```\ncurl --location --request GET 'https://demo.shkeeper.io/metrics' \\\n--header 'Authorization: Basic c2hrZWVwZXI6c2hrZWVwZXI='\n```\n**Successful Response:**\n```\n# HELP geth_last_release_info Version of the latest release from https://github.com/ethereum/go-ethereum/releases\n# TYPE geth_last_release_info gauge\ngeth_last_release_info{name=\"Bothros (v1.14.5)\",published_at=\"2024-06-06T13:41:53Z\",tag_name=\"v1.14.5\",version=\"1.14.5\"} 1.0\n# HELP prysm_last_release_info Version of the latest release from https://github.com/prysmaticlabs/prysm/releases\n# TYPE prysm_last_release_info gauge\nprysm_last_release_info{name=\"v5.0.4\",published_at=\"2024-06-21T16:13:40Z\",tag_name=\"v5.0.4\",version=\"5.0.4\"} 1.0\n# HELP geth_fullnode_version_info Current geth version in use\n# TYPE geth_fullnode_version_info gauge\ngeth_fullnode_version_info{version=\"1.14.6\"} 1.0\n# HELP prysm_fullnode_version_info Current prysm version in use\n# TYPE prysm_fullnode_version_info gauge\nprysm_fullnode_version_info 1.0\n# HELP ethereum_fullnode_status Connection status to ethereum fullnode\n# TYPE ethereum_fullnode_status gauge\nethereum_fullnode_status 1.0\n# HELP ethereum_fullnode_last_block the Last block loaded to the fullnode\n# TYPE ethereum_fullnode_last_block gauge\nethereum_fullnode_last_block 6.415394e+06\n# HELP ethereum_wallet_last_block Last checked block\n# TYPE ethereum_wallet_last_block gauge\nethereum_wallet_last_block 6.415392e+06\n# HELP ethereum_fullnode_last_block_timestamp Last block timestamp loaded to the fullnode\n# TYPE ethereum_fullnode_last_block_timestamp gauge\nethereum_fullnode_last_block_timestamp 1.722503064e+09\n# HELP ethereum_wallet_last_block_timestamp Last checked block timestamp\n# TYPE ethereum_wallet_last_block_timestamp gauge\nethereum_wallet_last_block_timestamp 1.72250304e+09\n```\n\u003ca name=\"payout\"\u003e\u003c/a\u003e\n#### 5.2.10. Payout\n\nSHKeeper allows you to make payouts through the API. The API calls related to payouts are somewhat different from those described earlier, as they use HTTP Basic Auth for authentication and authorization, utilizing your SHKeeper login and password.\n\n**Payouts Flow**\n- Creating a payout task (Payout or Multipayout)\n- Checking the task result\n\nThere are two methods for creating a payout: **Payout** and **Multipayout**, with some differences between them. Currently, Multipayout is not supported for the following cryptocurrencies: XMR, BTC, LTC, and DOGE. For these, you need to use the Payout method.\n\n**Check the Task Results** After you submit the payout task, you should poll for the task status:\n- **PENDING** means the task is in progress, and no result is available at this point yet.\n- **SUCCESS** means the task is complete, and you are presented with the results.\n\nThe task results are an array of objects, each containing the original payout request, the transaction status (success or error), and a list of transaction IDs related to the payout. If the transfer status happens to be an error, there will be a text description of the error in the `message` field.\n\u003ca name=\"payout-related-endpoints\"\u003e\u003c/a\u003e\n#### 5.2.11. Payout Related Endpoints\n\u003ca name=\"creating-a-payout-task\"\u003e\u003c/a\u003e\n##### 5.2.11.1. Creating a Payout Task\n\n**Endpoint:** `/api/v1/\u003ccrypto_name\u003e/payout`\n**Authorization:** HTTP Basic Auth.\n**HTTP request method:**  POST request with a JSON object in the following format:\n```\n{\n  \"amount\": \u003camount_to_send\u003e,\n  \"destination\": \"\u003caddr\u003e\",\n  \"fee\": \"\u003ctransaction_fee\u003e\",\n  \"callback_url\": \"\u003ccallback_url\u003e\", (OPTIONAL)\n  \"external_id\": \"\u003cexternal_id\u003e\" (OPTIONAL)\n}\n```\n- `amount`: The amount to be sent.\n- `destination`: The address to which the amount should be sent.\n  - For XRP, the address must be provided in the X-address format. The X-address format replaces the use of a separate destination tag when sending funds to a multi-user wallet on the XRP ledger, such as those of exchanges and custodial services.\n- `callback_url`: (optional) The URL to which SHKeeper will send notifications when payouts occur.\n- `external_id`: (optional) A unique order_id from your store.\n- `fee`: The transaction fee.\n  - This must always be specified, even for cryptocurrencies with automatically determined fees.\n  - For BTC, it is specified in sat/vByte; for LTC and DOGE, it is in sat/Byte.\n  - For XMR, an integer (1-4) is passed to set the transaction priority:\n    - 1 - Unimportant\n    - 2 - Normal\n    - 3 - Elevated\n    - 4 - Priority\n  - For other cryptocurrencies, any value can be passed; the optimal fee is calculated and set automatically, and this field is ignored.\n\nSince the payout task is an asynchronous process, the call will always complete successfully (except in cases where required parameters are missing or Basic authentication fails), returning a `task_id` which is used to check the status of the task later.\n\n**Curl Example:**\n```\ncurl --location --request POST 'https://demo.shkeeper.io/api/v1/ETH-USDC/payout' \\\n--header 'Authorization: Basic  nApijGv8djih7ozY' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\"amount\":107,\"destination\":\"0xBD26e3512ce84F315e90E3FE75907bfbB5bD0c44\",\"fee\":\"10\", \"callback_url\": \"https://my.payout.com/notification\", \"external_id\": \"435345534\"}'\n```\n**Successful Response:**\n```\n{\"task_id\":\"b2a01bb0-8abe-403b-a3fa-8124c84bcf23\", \"external_id\": \"435345534\"}\n```\nNote:\nIf enable_payout_callback is enabled in SHKeeper, a callback will be sent automatically upon a successful payout.\nIf a callback_url is provided in the request, SHKeeper will send the notification to that URL.\nCallback Notification Example:\n```\n{\n  \"payout_id\": 14,\n  \"external_id\": \"435345534\",\n  \"tx_hash\": \"AF732D1D1254C97A77F4DD08553725E6ECC011CA6DCD12BC65FA1D8551E54E6D\",\n  \"status\": \"SUCCESS\",\n  \"amount\": \"2.0000000000\",\n  \"crypto\": \"XRP\",\n  \"amount_fiat\": \"4.364200000000000000\",\n  \"currency_fiat\": \"USD\",\n  \"timestamp\": \"2024-11-27T13:49:22\"\n}\n```\n\u003ca name=\"creating-a-multipayout-task\"\u003e\u003c/a\u003e\n##### 5.2.11.2. Creating a Multipayout Task\n\n**Endpoint:** `/api/v1/\u003ccrypto_name\u003e/multipayout`\n**Authorization:** HTTP Basic Auth.\n**HTTP request method:**  POST request with a JSON object in the following format:\n```\n[{\n  \"amount\": \u003camount_to_send\u003e,\n  \"dest\": \"\u003caddr\u003e\",\n  \"callback_url\": \"\u003ccallback_url\u003e\", (OPTIONAL)\n  \"external_id\": \"\u003cexternal_id\u003e\" (OPTIONAL)\n}]\n```\nFor sending XRP, you can optionally pass a `dest_tag`. If provided, the address should be given in the regular format, and SHKeeper will automatically convert it to X-address format. Alternatively, you can manually convert the XRP address to X-address format and pass it in the `dest` field; in this case, `dest_tag` does not need to be provided.\n\n\nNote:\nIf enable_payout_callback is enabled in SHKeeper, a callback will be sent automatically upon a successful payout.\nIf a callback_url is provided in the request, SHKeeper will send the notification to that URL.\n\n**Curl Example:**\n```\ncurl --location --request POST 'https://demo.shkeeper.io/api/v1/ETH-USDT/multipayout' \\\n--header 'Authorization: Basic  nApijGv8djih7ozY' \\\n--header 'Content-Type: application/json' \\\n--data-raw '[{\"dest\":\"0xE77895BAda700d663f033510f73f1E988CF55756\",\"amount\":\"100\", \"external_id\": \"43234\", \"callback_url\": \"https://my.payout.com/notification\"},{\"dest\":\"0x7C4C7D3010d31329dd8244617C46e460E5EF8a6F\",\"amount\":\"200.11\", \"external_id\": \"43235\", \"callback_url\": \"https://my.payout.com/notification\"}]'\n```\n**Successful Response:**\n```\n{\n  \"task_id\": \"0471adec-5de5-4668-bc1d-e8e7729cb676\",\n  \"external_ids\": [\n    \"43234\",\n    \"43235\"\n  ]\n}\n```\n\nNote:\nThe order of the external_ids array is guaranteed to match the exact order in which the payout items were provided in the request.\n\n**Error Response:**\n```\n{\n    \"msg\": \"Bad destination address in {'dest': 'wrong_address', 'amount': '100'}\",\n    \"status\": \"error\"\n}\n```\n\u003ca name=\"checking-task-status\"\u003e\u003c/a\u003e\n##### 5.2.11.3. Checking Task Status\n\n**Endpoint:** `/api/v1/\u003ccrypto_name\u003e/task/\u003ctask_id\u003e`\n**Authorization:** HTTP Basic Auth.\n**HTTP request method:**  GET\n**Curl Example:**\n```\ncurl --location --request GET 'https://demo.shkeeper.io/api/v1/ETH-USDC/task/7028c45b-0c88-483e-b703-dd455a361b2e' \\\n--header 'Authorization: Basic  nApijGv8djih7ozY' \\\n--header 'Content-Type: application/json'\n```\n**Successful Response:**\n```\nWhen the task is in progress:\n{\n  \"result\": null,\n  \"status\": \"PENDING\"\n}\n```\n**When the task is complete:**\n```\n{\n  \"result\": [\n    {\n      \"amount\": \"100\",\n      \"dest\": \"TGusXhweqkJ1aJftjmAfLqA1rfEWD4hSGZ\",\n      \"status\": \"success\",\n      \"txids\": [\n        \"4c32969220743644e3480d96e95a423d351049ac6296b8315103225709881ae3\",\n        \"da2996bae7a8a4d655a1288f8f4c79ce0aa3640e61f8ae8de08ae9c70c72d90d\"\n      ]\n    },\n    {\n      \"amount\": \"200.11\",\n      \"dest\": \"TYtD9md7cHuB4P6kDd362jhcUGP7cJybF7\",\n      \"status\": \"success\",\n      \"txids\": [\n        \"e155f80221bf73a127ec8a9a5d1b6989edd38e7583e7747f128152833ff49090\",\n        \"0f999d988641395b38943d8a9c01581c19fcaa4dcdd4bb35f99e16510fdd10d6\",\n        \"8cbfe9131d406a1bcfca403f4318b9592e7c08c04ea9b20629f430762d4eb7a4\",\n        \"0036fbeadcb8cec278754f9fb7b18a3e9b57c71eb743115a8338d72b552a3dd4\",\n        \"d8972ac9c964adbc25486d2cfdf2de7b61c3f0ca7510aa7cddc832a9bccdf551\"\n      ]\n    }\n  ],\n  \"status\": \"SUCCESS\"\n}\n```\n**Failure Response:**\n```\n{\n    \"result\": \"Have not enough tokens on fee account, need 107 have 0\",\n    \"status\": \"FAILURE\"\n}\n```\n\n\u003ca name=\"get-crypto-balance-info\"\u003e\u003c/a\u003e\n##### 5.2.11.4. Get crypto balance information\n\n**Endpoint:** `/api/v1/\u003ccrypto_name\u003e/balance`\n**Authorization:** ApiKey.\n**HTTP request method:**  GET\n**Curl Example:**\n```\ncurl --location --request GET 'https://demo.shkeeper.io/api/v1/ETH/balance' \\\n--header 'X-Shkeeper-Api-Key: nApijGv8djih7ozY'\n```\n\n**Successful Response:**\n```\n{\n  \"amount_crypto\":\"0.0213590094\",\n  \"amount_fiat\":\"88.8201590493\",\n  \"display_name\":\"Ethereum\",\n  \"fiat\":\"USD\",\n  \"name\":\"ETH\",\n  \"rate\":\"4158.44000000\",\n  \"server_status\":\"Synced\"\n}\n```\n\n**Error Response:**\n```\n{\n  \"message\":\"Crypto XRP is not enabled\",\n  \"status\":\"error\"\n}\n```\n\n\u003ca name=\"get-fee-deposit-address\"\u003e\u003c/a\u003e\n##### 5.2.11.5. Get fee deposit address (if supported by crypto)\n\n**Endpoint:** `/api/v1/\u003ccrypto_name\u003e/fee-deposit-address`\n**Authorization:** ApiKey.\n**HTTP request method:**  GET\n**Curl Example:**\n```\ncurl --location --request GET 'https://demo.shkeeper.io/api/v1/ETH-USDT/fee-deposit-address' \\\n--header 'X-Shkeeper-Api-Key: nApijGv8djih7ozY'\n```\n\n**Successful Response:**\n```\n{\n  \"status\": \"success\",\n  \"crypto\": \"ETH-USDT\",\n  \"fee_deposit_address\": \"0x1234567890abcdef1234567890abcdef12345678\"\n}\n```\n\n**Error Response:**\n```\n{\n  \"status\": \"error\",\n  \"message\": \"Crypto XYZ is not enabled\"\n}\n```\n\n\u003ca name=\"get-all-balances\"\u003e\u003c/a\u003e\n##### 5.2.11.6. Get All Crypto Balances\n\n**Endpoint:** `/api/v1/crypto/balances`.\n**Authorization:** ApiKey.\n**HTTP request method:** GET.\n**Query Parameters: (optional)**.\nincludes — Comma-separated list of crypto identifiers to return balances for (e.g., BTC,ETH,TRX). Case-insensitive. If omitted or empty, returns balances for all enabled cryptos. Unknown/disabled cryptos are ignored.\n\n**Curl Example:**\n```\ncurl --location --request GET 'https://demo.shkeeper.io/api/v1/crypto/balances' \\\n--header 'X-Shkeeper-API-Key: nApijGv8djih7ozY' \\\n--header 'Content-Type: application/json'\n```\nExample Request (subset of cryptos):\n```\ncurl --location --request GET 'https://demo.shkeeper.io/api/v1/crypto/balances?includes=BTC,ETH'\n--header 'X-Shkeeper-API-Key: nApijGv8djih7ozY' \\\n--header 'Content-Type: application/json'\n```\nSuccessful Response:\n```\n[\n  {\n    \"name\": \"BTC\",\n    \"display_name\": \"Bitcoin\",\n    \"amount_crypto\": \"0.12345678\",\n    \"rate\": \"70616.07\",\n    \"fiat\": \"USD\",\n    \"amount_fiat\": \"8700.12\",\n    \"server_status\": \"online\"\n  },\n  {\n    \"name\": \"ETH\",\n    \"display_name\": \"Ethereum\",\n    \"amount_crypto\": \"1.2345\",\n    \"rate\": \"3015.50\",\n    \"fiat\": \"USD\",\n    \"amount_fiat\": \"3721.05\",\n    \"server_status\": \"online\"\n  }\n]\n```\nFailure Response (invalid includes / no valid cryptos requested):\n```\n{\n    \"status\": \"error\",\n    \"message\": \"No valid cryptos requested\"\n}\n```\n\n**Notes \u0026 caveats**\n\nThe response is always a plain JSON array, no extra envelope or metadata.\nThe order of items is deterministic:\nIf includes is provided → preserves order from request (valid entries only)\nIf includes is absent → sorted alphabetically by name.\nPartial failures (e.g., RPC error for a coin) result in that coin being omitted; no new error fields are introduced.\n\nSHKeeper uses a short-lived in-memory TTL cache to speed up the /crypto/balances endpoints. Cached data about available cryptocurrencies and node status may be slightly outdated (up to 60 seconds). In multi-process deployments, each instance keeps its own cache, which may cause minor differences between responses. The cache reduces short-term node or network fluctuations but may briefly delay reflecting real-time status changes.\n\n\u003ca name=\"checking-payout-status\"\u003e\u003c/a\u003e\n5.2.11.5. Checking Payout Status\n\n**Endpoint:** `/api/v1/\u003ccrypto_name\u003e/payout/status`\n**Authorization:** ApiKey.\n**HTTP request method:**  GET\n\n**Query Parameters:**\nexternal_id\tis Required.\tExternal ID assigned to the payout. Used to query its status.\n```\ncurl --location --request GET 'https://demo.shkeeper.io/api/v1/BTC/payout/status?external_id=abc123' \\\n--header 'X-Shkeeper-API-Key: nApijGv8djih7ozY' \\\n--header 'Content-Type: application/json'\n```\n**Successful Response:**\n```\n{\n  \"id\": 114,\n  \"external_id\": \"abc123\",\n  \"crypto\": \"BTC\",\n  \"status\": \"SUCCESS\",\n  \"amount\": \"100.50\",\n  \"destination\": \"0x1234567890abcdef...\",\n  \"txid\": \"0f999d988641395b38943d8a9c01581c19fcaa4dcdd4bb35f99e16510fdd10d6\"\n}\n```\nWhen the payout is in progress:\n```\n{\n  \"id\": 115,\n  \"external_id\": \"abc124\",\n  \"crypto\": \"BTC\",\n  \"status\": \"IN_PROGRESS\",\n  \"amount\": \"50.25\",\n  \"destination\": \"0xabcdef1234567890\",\n  \"txid\": null\n}\n```\nFailure Response:\n\n```\n{\n    \"amount\": \"0.0500000000\",\n    \"crypto\": \"BTC\",\n    \"destination\": \"bcrt1qagdwааааааааlkzc3gn05q3t8v3qrw4saptql8nz8fvt7l\",\n    \"external_id\": \"dhjdrewds\",\n    \"id\": 4,\n    \"status\": \"FAIL\",\n    \"txid\": null\n}\n```\n\u003ca name=\"receiving-callback\"\u003e\u003c/a\u003e\n### 5.3 Receiving callback\n\nThe callback is sent to the specified `callback_url` provided during the invoice creation process. Typically, this is a script that receives the notification from SHKeeper, validates and processes it.\n\nOnce SHKeeper receives a payment, it will send a payment notification to the `\u003ccallback_url\u003e` using a POST request with a JSON-encoded body and the `X-Shkeeper-Api-Key` HTTP header to authenticate with your system.\n\nIf a payment notification is successfully processed by your server, it should return the HTTP code `202 Accepted`. Any other response or connection failure will cause SHKeeper to resend the payment notification every 60 seconds.\n\nSHKeeper will send a notification for each transaction related to the invoice, even if the invoice is already in the PAID/OVERPAID status. The transaction that triggered the callback is marked with the `trigger` field.\n\n**Structure of the Callback Object:**\n```\n{\n  \"external_id\": \"1\",  // Invoice or Order ID in the external system\n  \"crypto\": \"BTC\",  // cryptocurrency (provided during payment request creation)\n  \"addr\": \"AAAAAAAAAAAAAA\", // wallet address that receives payments\n  \"fiat\":   \"USD\",  // fiat currency (provided during payment request creation)\n  \"balance_fiat\":      \"100\",  // amount in fiat currency\n  \"balance_crypto\": \"0.0025\",  // amount in cryptocurrency\n  \"paid\": true,  // true if the payment request is fully paid\n                      // false if only a partial payment is received\n  \"status\": \"PAID\",  // PARTIAL - partial invoice payment\n                              // PAID - full invoice payment\n                              // OVERPAID - overpaid invoice payment\n  \"transactions\": [  // list of transactions related to the payment request\n    {\n      \"txid\": \"ZZZZZZZZZZZZZZZZZZZ\",  // blockchain transaction ID\n      \"date\": \"2022-04-01 11:22:33\",  // transaction date\n      \"amount_crypto\": \"0.0025\",      // transaction amount in cryptocurrency\n      \"amount_fiat\": \"50\",           // transaction amount in fiat currency\n      \"trigger\": false,  // true if this transaction was the trigger for the payment notification\n      \"crypto\": \"ETH-USDT\" // transaction cryptocurrency\n    },\n    {\n      \"txid\": \"CCCCCCCCCCCC\",  // blockchain transaction ID\n      \"date\": \"2022-04-01 11:42:33\",  // transaction date\n      \"amount_crypto\": \"0.0025\",      // transaction amount in cryptocurrency\n      \"amount_fiat\": \"50\",           // transaction amount in fiat currency\n      \"trigger\": true,  // true if this transaction was the trigger for the payment notification\n      \"crypto\": \"ETH-USDT\" // transaction cryptocurrency\n    }\n  ],\n \"fee_percent\": \"2\", // fee percentage added to the invoice amount\n \"overpaid_fiat\": \"0.00\" // In case of overpayment, the overpaid amount will be shown here\n}\n```\n**Callback Example:**\n```\n{\n  \"external_id\": \"147\",\n  \"crypto\": \"ETH-USDT\",\n  \"addr\": \"0x6f2Fc9D7205B7D9037dDE45B5f9e12B18EA07e27\",\n  \"fiat\": \"USD\",\n  \"balance_fiat\": \"7.80\",\n  \"balance_crypto\": \"7.80000000\",\n  \"paid\": true,\n  \"status\": \"PAID\",\n  \"transactions\": [\n    {\n      \"txid\": \"0x518a10b13a708fd11aa98db88c625dd45130db6656ba822600b01d0c53c85078\",\n      \"date\": \"2024-06-25 15:45:38\",\n      \"amount_crypto\": \"7.80000000\",\n      \"amount_fiat\": \"7.80\",\n      \"trigger\": true,\n      \"crypto\": \"ETH-USDT\"\n    }\n  ],\n  \"fee_percent\": \"2\",\n  \"overpaid_fiat\": \"0.00\"\n}\n```\n\u003ca name=\"ready-made-modules\"\u003e\u003c/a\u003e\n### 5.4. Ready-made modules\n\u003ca name=\"whmcs\"\u003e\u003c/a\u003e\n#### 5.4.1. WHMCS\n\nShkeeper payment gateway module for WHMCS\n\nModule has been tested on WHMCS Version: 8.10.1\n\nFind module for WHMCS here: https://github.com/vsys-host/whmcs-shkeeper-gateway-module\n\n\u003ca name=\"woocommerce-wordpress\"\u003e\u003c/a\u003e\n#### 5.4.2. WooCommerce WordPress\n\nShkeeper payment gateway plugin for CMS WordPress + WooCommerce\n\nPlugin has been tested on CMS WordPress 5.9.3 + WooCommerce 6.3.1\n\nFind module for WooCommerce / WordPress here: https://github.com/vsys-host/wp-shkeeper-plugin\n\n\u003ca name=\"opencart-3\"\u003e\u003c/a\u003e\n#### 5.4.3. Opencart 3\n\nSHKeeper payment gateway module for OpenCart 3\n\nThe module has been tested on CMS OpenCart Version 3.0.3.9\n\nFind the module for Opencart 3 here: https://github.com/vsys-host/opencart-3-shkeeper-payment-module\n\n\u003ca name=\"prestashop-8\"\u003e\u003c/a\u003e\n#### 5.4.4. Prestashop 8\n\nSHKeeper payment gateway module for Prestashop 8\n\nThe module has been tested on CMS Prestashop Version  8.1.7\n\nFind the module for Prestashop 8 here: https://github.com/vsys-host/prestashop-8-shkeeper-payment-module\n\n\u003ca name=\"be-involved\"\u003e\u003c/a\u003e\n## 6. Be involved\n\n![image](https://github.com/user-attachments/assets/2749c1b4-ed8f-4dd1-b186-903e3d4c7c84)\n\nSHKeeper features open-source code available from GitHub, which also means an excellent opportunity to be involved in the community. You can contribute to us, and if you do, we will appreciate it very much. After the validation, review, and test, we will publish your data. Should you consider this opportunity, please get in touch here.\n\n\u003ca name=\"contact-us\"\u003e\u003c/a\u003e\n## 7. Contact us\n\n![image](https://github.com/user-attachments/assets/2d75394d-5efe-48ac-98c0-8692253ad0ad)\n\nIf you have experienced any problems using SHKeeper, you can contact the community listed on the [official website](https://shkeeper.io/). However, please ask questions on [Github Issues](https://github.com/vsys-host/shkeeper.io/issues) related to technical issues only. Thank you.\n\n\n\n\n### CREATED BY\n\n![VSYS logo](https://github.com/user-attachments/assets/719e1f58-a6b4-455d-b4e6-531a777c52f0)\n\n\n\n\n### JOIN OUR COMMUNITY\n\n[![Group 1790](https://github.com/user-attachments/assets/9829e615-2f22-4340-8d5d-eb5c156fcbcf)](https://www.reddit.com/user/shkeeper_io/)\n[![Group 1795](https://github.com/user-attachments/assets/24ee0fac-9f4d-4274-a482-18663f8a8f3f)](https://medium.com/@shkeeper.io)\n[![Group 1794](https://github.com/user-attachments/assets/e6803fff-7738-4148-a4d4-ed7d40faeeda)](https://x.com/shkeeper_io)\n[![Group 1793](https://github.com/user-attachments/assets/bba26cfd-fcdf-44ac-8046-6a03e06648b3)](https://www.facebook.com/shkeeper.io)\n[![Group 1792](https://github.com/user-attachments/assets/62be0ba8-6658-4822-a3f5-de445299eb32)](https://www.linkedin.com/company/86576569/admin/feed/posts/)\n[![Group 1791](https://github.com/user-attachments/assets/dc12acee-6d70-489e-a351-750ca4d92e06)](https://www.youtube.com/channel/UCfJp6tIaiJ2bchDyF-LFnaw)\n\n\nStay informed with the latest SHKeeper news, updates, and technical announcements. Follow our Telegram to never miss important changes and improvements:\nhttps://t.me/shkeeper_updates\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvsys-host%2Fshkeeper.io","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvsys-host%2Fshkeeper.io","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvsys-host%2Fshkeeper.io/lists"}