openapi: 3.0.0 info: title: BTCPay Greenfield API Keys Stores API version: v1 description: "# Introduction\n\nThe BTCPay Server Greenfield API is a REST API. Our API has predictable resource-oriented URLs, accepts form-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.\n\n# Authentication\n\nYou can authenticate either via Basic Auth or an API key. It's recommended to use an API key for better security. You can create an API key in the BTCPay Server UI under `Account` -> `Manage Account` -> `API keys`. You can restrict the API key for one or multiple stores and for specific permissions. For testing purposes, you can give it the 'Unrestricted access' permission. On production you should limit the permissions to the actual endpoints you use, you can see the required permission on the API docs at the top of each endpoint under `AUTHORIZATIONS`.\n\nIf you want to simplify the process of creating API keys for your users, you can use the [Authorization endpoint](https://docs.btcpayserver.org/API/Greenfield/v1/#tag/Authorization) to predefine permissions and redirect your users to the BTCPay Server Authorization UI. You can find more information about this on the [API Authorization Flow docs](https://docs.btcpayserver.org/BTCPayServer/greenfield-authorization/) page.\n\n# Usage examples\n\nUse **Basic Auth** to read store information with cURL:\n```bash\nBTCPAY_INSTANCE=\"https://mainnet.demo.btcpayserver.org\"\nUSER=\"MyTestUser@gmail.com\"\nPASSWORD=\"notverysecurepassword\"\nPERMISSION=\"btcpay.store.canmodifystoresettings\"\nBODY=\"$(echo \"{}\" | jq --arg \"a\" \"$PERMISSION\" '. + {permissions:[$a]}')\"\n\nAPI_KEY=\"$(curl -s \\\n -H \"Content-Type: application/json\" \\\n --user \"$USER:$PASSWORD\" \\\n -X POST \\\n -d \"$BODY\" \\\n \"$BTCPAY_INSTANCE/api/v1/api-keys\" | jq -r .apiKey)\"\n```\n\n\nUse an **API key** to read store information with cURL:\n```bash\nSTORE_ID=\"yourStoreId\"\n\ncurl -s \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: token $API_KEY\" \\\n -X GET \\\n \"$BTCPAY_INSTANCE/api/v1/stores/$STORE_ID\"\n```\n\nYou can find more examples on our docs for different programming languages:\n- [cURL](https://docs.btcpayserver.org/Development/GreenFieldExample/)\n- [Javascript/Node.Js](https://docs.btcpayserver.org/Development/GreenFieldExample-NodeJS/)\n- [PHP](https://docs.btcpayserver.org/Development/GreenFieldExample-PHP/)\n\n" contact: name: BTCPay Server url: https://btcpayserver.org license: name: MIT url: https://github.com/btcpayserver/btcpayserver/blob/master/LICENSE servers: - url: https://{btcpay-host} description: Your BTCPay Server instance variables: btcpay-host: default: mainnet.demo.btcpayserver.org description: The hostname of your BTCPay Server instance security: - API_Key: [] Basic: [] tags: - name: Stores description: Store operations paths: /api/v1/stores: get: tags: - Stores summary: Get stores description: View information about the available stores operationId: Stores_GetStores responses: '200': description: list of stores content: application/json: schema: $ref: '#/components/schemas/StoreDataList' '401': description: Missing authorization content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' security: - API_Key: - btcpay.store.canviewstoresettings Basic: [] post: operationId: Stores_CreateStore tags: - Stores summary: Create a new store description: Create a new store (default values can be different if the server settings use a default store template) requestBody: x-name: request content: application/json: schema: $ref: '#/components/schemas/StoreBaseData' required: true x-position: 1 responses: '200': description: Information about the new store content: application/json: schema: $ref: '#/components/schemas/StoreData' '400': description: A list of errors that occurred when creating the store content: application/json: schema: $ref: '#/components/schemas/ValidationProblemDetails' '403': description: If you are authenticated but forbidden to add new stores security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/stores/{storeId}: get: tags: - Stores summary: Get store parameters: - $ref: '#/components/parameters/StoreId' description: View information about the specified store operationId: Stores_GetStore responses: '200': description: specified store content: application/json: schema: $ref: '#/components/schemas/StoreData' '403': description: If you are authenticated but forbidden to view the specified store '404': description: The key is not found for this store security: - API_Key: - btcpay.store.canviewstoresettings Basic: [] put: tags: - Stores summary: Update store parameters: - $ref: '#/components/parameters/StoreId' description: Update the specified store (default values can be different if the server settings use a default store template) requestBody: x-name: request content: application/json: schema: $ref: '#/components/schemas/StoreData' required: true x-position: 1 operationId: Stores_UpdateStore responses: '200': description: updated specified store content: application/json: schema: $ref: '#/components/schemas/StoreData' '400': description: A list of errors that occurred when updating the store content: application/json: schema: $ref: '#/components/schemas/ValidationProblemDetails' '403': description: If you are authenticated but forbidden to update the specified store '404': description: The key is not found for this store security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] delete: operationId: Stores_DeleteStore tags: - Stores summary: Remove Store description: Removes the specified store. If there is another user with access, only your access will be removed. parameters: - $ref: '#/components/parameters/StoreId' responses: '200': description: The store has been removed '400': description: A list of errors that occurred when removing the store content: application/json: schema: $ref: '#/components/schemas/ValidationProblemDetails' '403': description: If you are authenticated but forbidden to remove the specified store '404': description: The key is not found for this store security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/stores/{storeId}/logo: post: tags: - Stores summary: Uploads a logo for the store description: Uploads a logo for the store parameters: - $ref: '#/components/parameters/StoreId' requestBody: content: multipart/form-data: schema: type: object additionalProperties: false properties: file: type: string description: The logo format: binary operationId: Stores_UploadStoreLogo responses: '200': description: Uploads a logo for the store content: application/json: schema: $ref: '#/components/schemas/ApplicationUserData' '404': description: The store could not be found security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] delete: tags: - Stores summary: Deletes the store logo description: Delete the store's logo operationId: Stores_DeleteStoreLogo parameters: - $ref: '#/components/parameters/StoreId' responses: '200': description: Store logo deleted successfuly '404': description: The store could not be found security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/stores/{storeId}/roles: get: tags: - Stores summary: Get store's roles parameters: - $ref: '#/components/parameters/StoreId' description: View information about the specified store's roles operationId: Stores_GetStoreRoles responses: '200': description: The user roles available for this store content: application/json: schema: $ref: '#/components/schemas/RoleData' '403': description: If you are authenticated but forbidden to get the store's roles '404': description: Store not found security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] components: schemas: ValidationProblemDetails: type: array description: An array of validation errors of the request items: type: object description: A specific validation error on a json property properties: path: type: string nullable: false description: The json path of the property which failed validation message: type: string nullable: false description: User friendly error message about the validation ApplicationUserData: type: object additionalProperties: false properties: id: type: string description: The id of the user nullable: false email: type: string description: The email of the user nullable: false name: type: string description: The name of the user nullable: true imageUrl: type: string description: The profile picture URL of the user nullable: true invitationUrl: type: string description: The pending invitation URL of the user nullable: true emailConfirmed: type: boolean description: True if the email has been confirmed by the user requiresEmailConfirmation: type: boolean description: True if the email requires confirmation to log in approved: type: boolean description: True if an admin has approved the user requiresApproval: type: boolean description: True if the instance requires approval to log in storeQuota: type: number nullable: true description: Per-user override for the max number of stores this user can create. Null means the server default applies created: type: number nullable: true description: The creation date of the user as a unix timestamp. Null if created before v1.0.5.6 allOf: - $ref: '#/components/schemas/UnixTimestamp' disabled: type: boolean description: True if an admin has disabled the user roles: type: array nullable: false items: type: string description: The roles of the user UnixTimestamp: type: number format: int32 example: 1592312018 description: A unix timestamp in seconds TimeSpanSeconds: allOf: - $ref: '#/components/schemas/TimeSpan' format: seconds description: A span of times in seconds ProblemDetails: type: object description: Description of an error happening during processing of the request properties: code: type: string nullable: false description: An error code describing the error message: type: string nullable: false description: User friendly error message about the error TimeSpan: type: number format: int32 example: 90 RoleData: type: object properties: id: description: The role's Id (Same as role if the role is created at server level, if the role is created at the store level the format is `STOREID::ROLE`) type: string nullable: false example: Owner role: description: The role's name type: string nullable: false example: Owner permissions: description: The permissions attached to this role type: array items: type: string example: - btcpay.store.canmodifystoresettings isServerRole: description: Whether this role is at the scope of the store or scope of the server type: boolean example: true StoreDataList: type: array items: $ref: '#/components/schemas/StoreData' PaymentMethodCriteriaData: type: object properties: paymentMethodId: type: string allOf: - $ref: '#/components/schemas/PaymentMethodId' nullable: false currencyCode: type: string description: The currency default: USD example: USD amount: type: string format: decimal minimum: 0 description: The amount above: type: boolean default: false description: If the criterion is for above or below the amount StoreBaseData: type: object x-abstract: true additionalProperties: false properties: name: type: string description: The name of the store website: type: string nullable: true description: The absolute url of the store format: url supportUrl: type: string nullable: true description: The support URI of the store, can contain the placeholders `{OrderId}` and `{InvoiceId}`. Can be any valid URI, such as a website, email, and nostr. format: uri logoUrl: type: string nullable: true description: Absolute URL to a logo file or a reference to an uploaded file id with `fileid:ID` format: uri cssUrl: type: string nullable: true description: Absolute URL to CSS file to customize the public/customer-facing pages of the store. (Invoice, Payment Request, Pull Payment, etc.) or a reference to an uploaded file id with `fileid:ID` format: uri paymentSoundUrl: type: string nullable: true description: Absolute URL to a sound file or a reference to an uploaded file id with `fileid:ID` format: uri brandColor: type: string description: The brand color of the store in HEX format nullable: true example: '#F7931A' applyBrandColorToBackend: type: boolean default: false description: Apply the brand color to the store's backend as well defaultCurrency: type: string description: The default currency of the store default: USD example: USD additionalTrackedRates: type: array items: type: string description: 'Additional rates to track. The rates of those currencies, in addition to the default currency, will be recorded when a new invoice is created. The rates will then be accessible through reports.' default: [] example: - JPY - EUR invoiceExpiration: default: 900 minimum: 60 maximum: 2073600 description: The time after which an invoice is considered expired if not paid. The value will be rounded down to a minute. allOf: - $ref: '#/components/schemas/TimeSpanSeconds' refundBOLT11Expiration: default: 30 minimum: 0 maximum: 3650 description: The minimum expiry of BOLT11 invoices accepted for refunds by default. (in days) allOf: - $ref: '#/components/schemas/TimeSpanDays' displayExpirationTimer: default: 300 minimum: 60 maximum: 2073600 description: The time left that will trigger the countdown timer on the checkout page to be shown. The value will be rounded down to a minute. allOf: - $ref: '#/components/schemas/TimeSpanSeconds' monitoringExpiration: default: 86400 minimum: 600 maximum: 2073600 description: The time after which an invoice which has been paid but not confirmed will be considered invalid. The value will be rounded down to a minute. allOf: - $ref: '#/components/schemas/TimeSpanSeconds' speedPolicy: $ref: '#/components/schemas/SpeedPolicy' lightningDescriptionTemplate: type: string nullable: true description: The BOLT11 description of the lightning invoice in the checkout. You can use placeholders '{StoreName}', '{ItemDescription}' and '{OrderId}'. paymentTolerance: type: number format: double minimum: 0.0 maximum: 100.0 default: 0.0 description: Consider an invoice fully paid, even if the payment is missing 'x' % of the full amount. archived: type: boolean default: false description: If true, the store does not appear in the stores list by default. anyoneCanCreateInvoice: type: boolean default: false description: If true, then no authentication is needed to create invoices on this store. receipt: type: object nullable: true description: Additional settings to customize the public receipt allOf: - $ref: '#/components/schemas/ReceiptOptions' lightningAmountInSatoshi: type: boolean default: false description: If true, lightning payment methods show amount in satoshi in the checkout page. lightningPrivateRouteHints: type: boolean default: false description: Should private route hints be included in the lightning payment of the checkout page. onChainWithLnInvoiceFallback: type: boolean default: false description: Unify on-chain and lightning payment URL. redirectAutomatically: type: boolean default: false description: After successful payment, should the checkout page redirect the user automatically to the redirect URL of the invoice? showRecommendedFee: type: boolean default: true recommendedFeeBlockTarget: type: integer format: int32 default: 1 description: The fee rate recommendation in the checkout page for the on-chain payment to be confirmed after 'x' blocks. defaultLang: type: string default: en description: The default language to use in the checkout page. (The different translations available are listed [here](https://github.com/btcpayserver/btcpayserver/tree/master/BTCPayServer/wwwroot/locales) htmlTitle: type: string nullable: true description: The HTML title of the checkout page (when you over the tab in your browser) networkFeeMode: $ref: '#/components/schemas/NetworkFeeMode' payJoinEnabled: type: boolean default: false description: If true, payjoin will be proposed in the checkout page if possible. ([More information](https://docs.btcpayserver.org/Payjoin/)) autoDetectLanguage: type: boolean default: false description: If true, the language on the checkout page will adapt to the language defined by the user's browser settings showPayInWalletButton: type: boolean default: true description: If true, the "Pay in wallet" button will be shown on the checkout page (Checkout V2) showStoreHeader: type: boolean default: true description: If true, the store header will be shown on the checkout page (Checkout V2) celebratePayment: type: boolean default: true description: If true, payments on the checkout page will be celebrated with confetti (Checkout V2) playSoundOnPayment: type: boolean default: false description: If true, sounds on the checkout page will be enabled (Checkout V2) lazyPaymentMethods: type: boolean default: false description: If true, payment methods are enabled individually upon user interaction in the invoice defaultPaymentMethod: $ref: '#/components/schemas/PaymentMethodId' paymentMethodCriteria: type: object nullable: true items: $ref: '#/components/schemas/PaymentMethodCriteriaData' description: The criteria required to activate specific payment methods. NetworkFeeMode: type: string description: Check whether network fee should be added to the invoice if on-chain payment is used. ([More information](https://docs.btcpayserver.org/FAQ/Stores/#add-network-fee-to-invoice-vary-with-mining-fees)) x-enumNames: - MultiplePaymentsOnly - Always - Never enum: - MultiplePaymentsOnly - Always - Never TimeSpanDays: allOf: - $ref: '#/components/schemas/TimeSpan' format: days description: A span of times in days SpeedPolicy: type: string description: "This is a risk mitigation parameter for the merchant to configure how they want to fulfill orders depending on the number of block confirmations for the transaction made by the consumer on the selected cryptocurrency.\n`\"HighSpeed\"`: 0 confirmations (1 confirmation if RBF enabled in transaction) \n`\"MediumSpeed\"`: 1 confirmation \n`\"LowMediumSpeed\"`: 2 confirmations \n`\"LowSpeed\"`: 6 confirmations\n" x-enumNames: - HighSpeed - MediumSpeed - LowSpeed - LowMediumSpeed enum: - HighSpeed - MediumSpeed - LowSpeed - LowMediumSpeed StoreId: type: string description: Store ID of the item example: 9CiNzKoANXxmk5ayZngSXrHTiVvvgCrwrpFQd4m2K776 PaymentMethodId: type: string description: "Payment method IDs. Available payment method IDs for Bitcoin are: \n- `\"BTC-CHAIN\"`: Onchain \n-`\"BTC-LN\"`: Lightning \n- `\"BTC-LNURL\"`: LNURL" example: BTC-CHAIN StoreData: allOf: - $ref: '#/components/schemas/StoreBaseData' - type: object properties: id: type: string description: The id of the store nullable: false ReceiptOptions: type: object additionalProperties: false properties: enabled: type: boolean nullable: true description: A public page will be accessible once the invoice is settled. If null or unspecified, it will fallback to the store's settings. (The default store settings is true) showQR: type: boolean nullable: true default: null description: Show the QR code of the receipt in the public receipt page. If null or unspecified, it will fallback to the store's settings. (The default store setting is true) showPayments: type: boolean nullable: true default: null description: Show the payment list in the public receipt page. If null or unspecified, it will fallback to the store's settings. (The default store setting is true) parameters: StoreId: name: storeId in: path required: true description: The store ID schema: $ref: '#/components/schemas/StoreId' securitySchemes: API_Key: type: apiKey in: header name: Authorization description: 'BTCPay Server API key. Format: ''token {apiKey}''' Basic: type: http scheme: basic description: HTTP Basic Authentication with email and password externalDocs: description: Check out our examples on how to use the API url: https://docs.btcpayserver.org/Development/GreenFieldExample/