openapi: 3.0.0 info: title: BTCPay Greenfield API Keys Apps 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: Apps description: App operations paths: /api/v1/stores/{storeId}/apps/pos: parameters: - $ref: '#/components/parameters/StoreId' post: operationId: Apps_CreatePointOfSaleApp summary: Create a new Point of Sale app description: Point of Sale app allows accepting payments for items in a virtual store requestBody: x-name: request content: application/json: schema: $ref: '#/components/schemas/PointOfSaleAppRequest' required: true x-position: 1 responses: '200': description: Created app details content: application/json: schema: $ref: '#/components/schemas/PointOfSaleAppData' '422': description: Unable to validate the request content: application/json: schema: $ref: '#/components/schemas/ValidationProblemDetails' tags: - Apps security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/apps/pos/{appId}: parameters: - $ref: '#/components/parameters/AppId' put: operationId: Apps_PutPointOfSaleApp summary: Update a Point of Sale app description: Use this endpoint for updating the properties of a POS app requestBody: x-name: request content: application/json: schema: $ref: '#/components/schemas/PointOfSaleAppRequest' required: true x-position: 1 responses: '200': description: App details content: application/json: schema: $ref: '#/components/schemas/PointOfSaleAppData' '422': description: Unable to validate the request content: application/json: schema: $ref: '#/components/schemas/ValidationProblemDetails' tags: - Apps security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] get: tags: - Apps operationId: Apps_GetPointOfSaleApp summary: Get Point of Sale app data description: Returns POS app data responses: '200': description: POS app data content: application/json: schema: $ref: '#/components/schemas/PointOfSaleAppData' '404': description: POS app with specified ID was not found /api/v1/apps/crowdfund/{appId}: parameters: - $ref: '#/components/parameters/AppId' put: operationId: Apps_PutCrowdfundApp summary: Update a Crowdfund app description: Full update. GET the app first, modify the data, then PUT the complete payload. requestBody: x-name: request content: application/json: schema: $ref: '#/components/schemas/CrowdfundAppRequest' required: true x-position: 1 responses: '200': description: App details content: application/json: schema: $ref: '#/components/schemas/CrowdfundAppData' '404': description: Crowdfund app with specified ID was not found '422': description: Unable to validate the request content: application/json: schema: $ref: '#/components/schemas/ValidationProblemDetails' tags: - Apps security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] get: tags: - Apps operationId: Apps_GetCrowdfundApp summary: Get crowdfund app data description: Returns crowdfund app data responses: '200': description: Crowdfund app data content: application/json: schema: $ref: '#/components/schemas/CrowdfundAppData' '404': description: Crowdfund app with specified ID was not found /api/v1/stores/{storeId}/apps/crowdfund: parameters: - $ref: '#/components/parameters/StoreId' post: operationId: Apps_CreateCrowdfundApp summary: Create a new Crowdfund app requestBody: x-name: request content: application/json: schema: $ref: '#/components/schemas/CrowdfundAppRequest' required: true x-position: 1 responses: '200': description: Created app details content: application/json: schema: $ref: '#/components/schemas/CrowdfundAppData' '422': description: Unable to validate the request content: application/json: schema: $ref: '#/components/schemas/ValidationProblemDetails' tags: - Apps security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/apps/{appId}: get: tags: - Apps operationId: Apps_GetApp summary: Get basic app data description: Returns basic app data shared between all types of apps parameters: - $ref: '#/components/parameters/AppId' responses: '200': description: Basic app data content: application/json: schema: $ref: '#/components/schemas/AppBaseData' '404': description: App with specified ID was not found security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] delete: tags: - Apps operationId: Apps_DeleteApp summary: Delete app description: Deletes app with specified ID parameters: - $ref: '#/components/parameters/AppId' responses: '200': description: App was deleted '404': description: App with specified ID was not found security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/apps/{appId}/image: post: tags: - Apps summary: Uploads an image for an app item description: Uploads an image for an app item parameters: - $ref: '#/components/parameters/AppId' requestBody: content: multipart/form-data: schema: type: object additionalProperties: false properties: file: type: string description: The image format: binary operationId: Apps_UploadAppItemImage responses: '200': description: Uploads an image for an app item content: application/json: schema: $ref: '#/components/schemas/FileData' '404': description: The app could not be found security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/apps/{appId}/image/{fileId}: delete: tags: - Apps summary: Deletes the app item image description: Deletes the app item image operationId: App_DeleteAppItemImage parameters: - $ref: '#/components/parameters/AppId' - name: fileId in: path required: true description: The file ID schema: type: string responses: '200': description: App item image deleted successfully '404': description: The app could not be found security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/apps/{appId}/sales: get: tags: - Apps operationId: Apps_GetAppSales summary: Get app sales statistics description: Returns sales statistics for the app parameters: - $ref: '#/components/parameters/AppId' - name: numberOfDays in: query required: false description: How many of the last days schema: nullable: true type: number default: 7 responses: '200': description: App sales statistics content: application/json: schema: $ref: '#/components/schemas/AppSalesStats' '404': description: App with specified ID was not found security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/apps/{appId}/top-items: get: tags: - Apps operationId: Apps_GetAppTopItems summary: Get app top items statistics description: Returns top items statistics for the app parameters: - $ref: '#/components/parameters/AppId' - name: count in: query required: false description: How many of the items schema: nullable: true type: number default: 5 - name: offset in: query required: false description: Offset for paging schema: nullable: true type: number default: 0 responses: '200': description: App top items statistics content: application/json: schema: type: array items: $ref: '#/components/schemas/AppItemStats' '404': description: App with specified ID was not found security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/stores/{storeId}/apps: parameters: - $ref: '#/components/parameters/StoreId' get: tags: - Apps operationId: Apps_GetAllAppsForStore summary: Get basic app data for all apps for a store description: Returns basic app data for all apps for a store responses: '200': description: Array of basic app data object content: application/json: schema: type: array items: $ref: '#/components/schemas/AppBaseData' '403': description: If you are authenticated but forbidden to get the data security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] /api/v1/apps: get: tags: - Apps operationId: Apps_GetAllApps summary: Get basic app data for all apps for all stores for a user description: Returns basic app data for all apps for all stores responses: '200': description: Array of basic app data object content: application/json: schema: type: array items: $ref: '#/components/schemas/AppBaseData' '403': description: If you are authenticated but forbidden to get the data security: - API_Key: - btcpay.store.canmodifystoresettings Basic: [] components: schemas: AppItemStats: type: object properties: itemCode: type: string description: Item ID title: type: string description: Item Name salesCount: type: integer example: 21 description: Total sales of that item total: type: string format: decimal description: The total amount of sales of that item totalFormatted: type: string description: The formatted total amount of sales of that item example: 615.21 USD UnixTimestamp: type: number format: int32 example: 1592312018 description: A unix timestamp in seconds AppItem: type: object properties: id: type: string example: green-tea description: Unique ID of the item title: type: string example: Green Tea description: The display name of the item description: type: string example: Lovely, fresh and tender. description: A description text for the item image: type: string example: http://teashop.com/img/green-tea.jpg description: An image URL for the item price: type: string format: decimal nullable: true example: '21.0' priceType: type: string x-enumNames: - Fixed - Topup - Minimum enum: - Fixed - Topup - Minimum buyButtonText: type: string example: Buy me! description: A custom text for the buy button for the item inventory: type: integer nullable: true example: 21 description: The remaining stock the item disabled: type: boolean description: If true, the item does not appear in the list by default. default: false PointOfSaleAppRequest: allOf: - $ref: '#/components/schemas/PointOfSaleBaseData' - type: object properties: template: type: string description: JSON of item available in the app FileData: type: object additionalProperties: false properties: id: type: string description: The id of the file nullable: false userId: type: string description: The id of the user that uploaded the file nullable: false uri: type: string description: The internal URI of the file nullable: false url: type: string description: The full URL of the file nullable: true originalName: type: string description: The original name of the file nullable: true storageName: type: string description: The storage name of the file nullable: true created: type: number nullable: true description: The creation date of the file as a unix timestamp allOf: - $ref: '#/components/schemas/UnixTimestamp' AppSalesStatsItem: type: object properties: date: type: integer description: UNIX timestamp of the beginning of that day label: type: string description: Short date as label example: Jul 21 salesCount: type: integer example: 21 description: Total sales on that day CrowdfundAppRequest: allOf: - $ref: '#/components/schemas/CrowdfundBaseData' - type: object properties: perksTemplate: type: string description: JSON of perks available in the app StoreId: type: string description: Store ID of the item example: 9CiNzKoANXxmk5ayZngSXrHTiVvvgCrwrpFQd4m2K776 PointOfSaleBaseData: allOf: - $ref: '#/components/schemas/AppBaseData' - type: object properties: title: type: string description: Display title of the app example: My PoS app nullable: true description: type: string description: App description example: This is my amazing PoS app nullable: true defaultView: type: string description: App view type (e.g., static, cart, etc...) example: Cart x-enumNames: - Static - Cart - Light - Print enum: - Static - Cart - Light - Print nullable: true showItems: type: boolean default: false description: Display item selection for keypad example: true nullable: true showCustomAmount: type: boolean description: Whether the option to enter a custom amount is shown example: true nullable: true showDiscount: default: false type: boolean description: Whether the option to enter a discount is shown example: false nullable: true showSearch: type: boolean description: Display the search bar example: false default: true nullable: true showCategories: type: boolean description: Display the list of categories example: false default: true nullable: true enableTips: default: false type: boolean description: Whether the option to enter a tip is shown example: true nullable: true currency: type: string description: Currency used for the app example: BTC nullable: true fixedAmountPayButtonText: type: string description: Payment button text template for items with a set price example: Buy for {0} nullable: true customAmountPayButtonText: type: string description: Payment button text which appears for items which allow user to input a custom amount example: Pay nullable: true tipText: type: string description: Prompt which appears next to the tip amount field if tipping is enabled example: Do you want to leave a tip? nullable: true customTipPercentages: type: array description: Array of predefined tip percentage amounts items: type: number default: - 15 - 18 - 20 nullable: true notificationUrl: type: string description: Callback notification url to POST to once when invoice is paid for and once when there are enough blockchain confirmations nullable: true redirectUrl: type: string description: URL user is redirected to once invoice is paid nullable: true redirectAutomatically: type: boolean description: Whether user is redirected to specified redirect URL automatically after the invoice is paid example: true nullable: true htmlLang: type: string description: Used for SEO, the [HTML Lang](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang) of the page nullable: true example: en htmlMetaTags: type: string description: Used for SEO, the [Meta tags](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta) of the page nullable: true example: formId: type: string description: Form ID to request customer data nullable: true 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 CrowdfundBaseData: allOf: - $ref: '#/components/schemas/AppBaseData' - type: object properties: title: type: string description: Display title of the app example: My crowdfund app nullable: true description: type: string description: App description example: My crowdfund description nullable: true enabled: type: boolean description: Whether the app is enabled to be viewed by everyone example: true nullable: true enforceTargetAmount: type: boolean description: Whether contributions over the set target amount are allowed example: false nullable: true startDate: type: number description: UNIX timestamp for crowdfund start time (https://www.unixtimestamp.com/) allOf: - $ref: '#/components/schemas/UnixTimestamp' example: 768658369 nullable: true endDate: type: number description: UNIX timestamp for crowdfund end time (https://www.unixtimestamp.com/) allOf: - $ref: '#/components/schemas/UnixTimestamp' example: 771336769 nullable: true targetCurrency: type: string description: Target currency for the crowdfund example: BTC nullable: true targetAmount: type: number description: Target amount for the crowdfund example: 420.69 nullable: true mainImageUrl: type: string description: URL for image used as a cover image for the app nullable: true notificationUrl: type: string description: Callback notification url to POST to once when invoice is paid for and once when there are enough blockchain confirmations nullable: true tagline: type: string description: Tagline for the app displayed to user example: I can't believe it's not butter nullable: true disqusEnabled: type: boolean description: Whether Disqus is enabled for the app nullable: true disqusShortname: type: string description: Disqus shortname to used for the app nullable: true soundsEnabled: type: boolean description: Whether sounds on new contributions are enabled example: false nullable: true animationsEnabled: type: boolean description: Whether background animations on new contributions are enabled example: true nullable: true resetEveryAmount: type: number description: Contribution goal reset frequency amount example: 1 nullable: true resetEvery: type: string description: Contribution goal reset frequency example: Day nullable: true displayPerksValue: type: boolean description: Whether perk values are displayed example: false nullable: true displayPerksRanking: type: boolean description: Whether perk ranking is displayed example: false nullable: true sortPerksByPopularity: type: boolean description: Whether perks are sorted by popularity default: true nullable: true sounds: type: array description: Array of custom sounds which can be used on new contributions items: type: string example: - https://github.com/ClaudiuHKS/AdvancedQuakeSounds/raw/master/sound/AQS/doublekill.wav nullable: true animationColors: type: array description: Array of custom HEX colors which can be used for background animations on new contributions items: type: string example: - '#FF0000' - '#00FF00' - '#0000FF' nullable: true htmlLang: type: string description: Used for SEO, the [HTML Lang](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang) of the page nullable: true example: en htmlMetaTags: type: string description: Used for SEO, the [Meta tags](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta) of the page nullable: true example: formId: type: string description: Form ID to request customer data nullable: true AppSalesStats: type: object properties: salesCount: type: integer example: 615 description: Total sales in that period series: type: array items: $ref: '#/components/schemas/AppSalesStatsItem' CrowdfundAppData: allOf: - $ref: '#/components/schemas/CrowdfundBaseData' - type: object properties: perks: type: object description: JSON of perks available in the app example: - description: null id: test perk image: null price: type: 2 formatted: $100.00 value: 100.0 title: test perk buyButtonText: null inventory: null paymentMethods: null disabled: false - description: this is an amazing perk id: test test image: https://mainnet.demo.btcpayserver.org/img/errorpages/404_nicolas.jpg price: type: 1 formatted: $69.42 value: 69.42 title: test test buyButtonText: null inventory: 5 paymentMethods: null disabled: false - description: null id: f$t45hj764325 image: null price: type: 0 formatted: null value: null title: amazing perk buyButtonText: button text inventory: null paymentMethods: null disabled: true PointOfSaleAppData: allOf: - $ref: '#/components/schemas/PointOfSaleBaseData' - type: object properties: items: type: array items: $ref: '#/components/schemas/AppItem' description: JSON object of app items example: - id: green tea title: Green Tea description: Lovely, fresh and tender, Meng Ding Gan Lu ('sweet dew') is grown in the lush Meng Ding Mountains of the southwestern province of Sichuan where it has been cultivated for over a thousand years. image: ~/img/pos-sample/green-tea.jpg price: '1.0' priceType: Fixed buyButtonText: null inventory: 5 paymentMethods: null disabled: false - id: black tea title: Black Tea description: Tian Jian Tian Jian means 'heavenly tippy tea' in Chinese, and it describes the finest grade of dark tea. Our Tian Jian dark tea is from Hunan province which is famous for making some of the best dark teas available. image: ~/img/pos-sample/black-tea.jpg price: '2.0' priceType: Fixed buyButtonText: Test Buy Button Text inventory: null paymentMethods: null disabled: false AppBaseData: type: object properties: id: type: string description: Id of the app example: 3ki4jsAkN4u9rv1PUzj1odX4Nx7s appName: type: string description: Name given to the app when it was created example: my test app storeId: description: Id of the store to which the app belongs allOf: - $ref: '#/components/schemas/StoreId' created: type: integer example: 1651554744 description: UNIX timestamp for when the app was created appType: type: string example: PointOfSale description: Type of the app which was created archived: type: boolean description: If true, the app does not appear in the apps list by default. default: false nullable: true parameters: StoreId: name: storeId in: path required: true description: The store ID schema: $ref: '#/components/schemas/StoreId' AppId: name: appId in: path required: true description: App ID schema: type: string 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/