# AppDirect | Developer Portal > AppDirect powers millions of cloud subscriptions worldwide with marketplace, billing, reseller, and distribution solutions. - [AppDirect | Developer Portal](/index.md) ## ai-rest Open API Reference Docs for the API - [Devs.ai API (1.0)](/ai-rest.md): Open API Reference Docs for the API ## markdown-page You don't need React to write simple standalone pages. - [Markdown page example](/markdown-page.md): You don't need React to write simple standalone pages. ## rest The Companies API allows developers to manage marketplace companies and their user memberships. - [AppDirect API Reference](/rest.md): The Companies API allows developers to manage marketplace companies and their user memberships. ## search - [Search the documentation](/search.md) ## tools ### demo-graphql Description will go into a meta tag in - [Demo GraphQL Explorer](/tools/demo-graphql.md): Description will go into a meta tag in ### hosted-graphql Description will go into a meta tag in - [Hosted GraphQL Explorer](/tools/hosted-graphql.md): Description will go into a meta tag in ### introspection Description will go into a meta tag in - [Introspection App](/tools/introspection.md): Description will go into a meta tag in ## docs ### empty - [empty](/docs/empty.md) ## references-api API and References - [APIs and References](/references-api.md): API and References ### llms Use AppDirect’s LLMs-friendly docs with Cursor, Windsurf, ChatGPT/Claude, and Copilot. - [LLMs-ready documentation](/references-api/llms.md): Use AppDirect’s LLMs-friendly docs with Cursor, Windsurf, ChatGPT/Claude, and Copilot. ## storefront Custom Storefront Overview - [Customize your storefront](/storefront.md): Custom Storefront Overview ### category #### how-to-guides - [How-to Guides](/storefront/category/how-to-guides.md) ### developer-tools #### storefront-components Storefront Components Library - [Storefront Components Library](/storefront/developer-tools/storefront-components.md): Storefront Components Library #### storefront-plaza Storefront Plaza Theme - [Storefront Plaza Theme](/storefront/developer-tools/storefront-plaza.md): Storefront Plaza Theme #### storefront-toolbar Toolkit Toolbar Overview - [Using the developer toolbar](/storefront/developer-tools/storefront-toolbar.md): Toolkit Toolbar Overview #### toolkit Toolkits Overview - [Storefront Toolkit](/storefront/developer-tools/toolkit.md): Toolkits Overview ##### storefront-toolkit-changlog Storefront Toolkit Changelog - [Storefront Toolkit Changelog](/storefront/developer-tools/toolkit/storefront-toolkit-changlog.md): Storefront Toolkit Changelog ##### storefront-toolkit-upgrade Toolkits Overview - [Upgrading to 4.0 and later](/storefront/developer-tools/toolkit/storefront-toolkit-upgrade.md): Toolkits Overview ### getting-started Getting Started - [Getting Started](/storefront/getting-started.md): Getting Started ### how-tos #### components ##### storefront-custom-components Creating custom react components in your storefront theme - [Custom components](/storefront/how-tos/components/storefront-custom-components.md): Creating custom react components in your storefront theme ##### storefront-custom-components-add Add custom react components to your storefront theme - [Add components to your storefront theme](/storefront/how-tos/components/storefront-custom-components-add.md): Add custom react components to your storefront theme ##### storefront-custom-components-customize-ui-library Customize UI library components - [Customize UI library components](/storefront/how-tos/components/storefront-custom-components-customize-ui-library.md): Customize UI library components ##### storefront-custom-components-data Using Marketplace Data in your storefront components - [Using Marketplace Data](/storefront/how-tos/components/storefront-custom-components-data.md): Using Marketplace Data in your storefront components ##### storefront-custom-components-delete-ui-library Delete UI library components - [Delete UI library components](/storefront/how-tos/components/storefront-custom-components-delete-ui-library.md): Delete UI library components ##### storefront-custom-components-layout Storefront Components Layout Management - [Layout Management](/storefront/how-tos/components/storefront-custom-components-layout.md): Storefront Components Layout Management ##### storefront-custom-components-settings Default Component Theme Settings - [Default Component Theme Settings](/storefront/how-tos/components/storefront-custom-components-settings.md): Default Component Theme Settings ##### storefront-custom-components-styling Styling components in your storefront theme - [Styling components](/storefront/how-tos/components/storefront-custom-components-styling.md): Styling components in your storefront theme ##### storefront-custom-components-uninstall Uninstall Custom Components - [Uninstall Custom Components](/storefront/how-tos/components/storefront-custom-components-uninstall.md): Uninstall Custom Components ##### storefront-custom-components-update-ui-library Update UI library - [Update UI library](/storefront/how-tos/components/storefront-custom-components-update-ui-library.md): Update UI library #### data Using Marketplace Data in your Storefront Theme - [Using the Marketplace Data](/storefront/how-tos/data.md): Using Marketplace Data in your Storefront Theme ##### storefront-data-customized Customizing Marketplace Data in your Storefront Theme - [Customize Marketplace Data](/storefront/how-tos/data/storefront-data-customized.md): Customizing Marketplace Data in your Storefront Theme ##### storefront-data-customized-multiple Managing Data with Multiple Marketplaces - [Managing Data with Multiple Marketplaces](/storefront/how-tos/data/storefront-data-customized-multiple.md): Managing Data with Multiple Marketplaces #### import-theme Import a theme - [Import a theme](/storefront/how-tos/import-theme.md): Import a theme #### localization Localization, internationalization, and i18n for customizing theme storefronts - [Themes and Localization](/storefront/how-tos/localization.md): Localization, internationalization, and i18n for customizing theme storefronts ##### storefront-labels Customize Storefront Themes Labels - [Customize Storefront Themes Labels](/storefront/how-tos/localization/storefront-labels.md): Customize Storefront Themes Labels #### static-assets Adding Static Assets to Your Storefront Theme - [Themes and Static Assets](/storefront/how-tos/static-assets.md): Adding Static Assets to Your Storefront Theme ##### storefront-custom-ressources Using Custom Ressources in Your Storefront Theme - [Themes and Custom Ressources](/storefront/how-tos/static-assets/storefront-custom-ressources.md): Using Custom Ressources in Your Storefront Theme ##### storefront-grid Theme CSS Grid - [Theme CSS grid](/storefront/how-tos/static-assets/storefront-grid.md): Theme CSS Grid ##### storefront-platform-css Global Plaform CSS - [Global platform CSS](/storefront/how-tos/static-assets/storefront-platform-css.md): Global Plaform CSS #### storefront-checkout Integrate Checkout in your Storefront Theme - [Integrate Checkout in your Storefront Theme](/storefront/how-tos/storefront-checkout.md): Integrate Checkout in your Storefront Theme #### storefront-header Customize the admin header and footer - [Customize the admin header and footer](/storefront/how-tos/storefront-header.md): Customize the admin header and footer #### storefront-metatags Storefront Theme Metatags - [Themes and Metatags](/storefront/how-tos/storefront-metatags.md): Storefront Theme Metatags #### storefront-pages Create Pages in your Storefront Theme - [Create Custom Pages in your theme](/storefront/how-tos/storefront-pages.md): Create Pages in your Storefront Theme #### storefront-upload-theme Upload a theme in Theme Manager - [Upload a theme in Theme Manager](/storefront/how-tos/storefront-upload-theme.md): Upload a theme in Theme Manager ### reference #### custom-components Storefront Home Page Objects - [Custom Components](/storefront/reference/custom-components.md): Storefront Home Page Objects ##### custom-components-risks Risks of using Custom Components - [Introduction](/storefront/reference/custom-components/custom-components-risks.md): Risks of using Custom Components ##### legacy Legacy - [Custom Components (Legacy)](/storefront/reference/custom-components/legacy.md): Legacy - [Add components to your storefront theme](/storefront/reference/custom-components/legacy/legacy-custom-components-add.md): Add custom react components to your storefront theme - [Custom components](/storefront/reference/custom-components/legacy/legacy-custom-components-getting-started.md): Creating custom react components in your storefront theme - [Introduction](/storefront/reference/custom-components/legacy/legacy-custom-components-risks.md): Risks of using Custom Components - [Storefront Toolkit](/storefront/reference/custom-components/legacy/legacy-storefront-toolkit.md): Toolkits Overview - [Build components](/storefront/reference/custom-components/legacy/storefront-custom-components-build.md): Build components in your storefront theme ##### manage-accessibility Managing Accessibility using Custom Components - [Accessibility Management with Custom Components in Storefront Builder](/storefront/reference/custom-components/manage-accessibility.md): Managing Accessibility using Custom Components ##### schema Theme Editor Custom Components Schema - [Components Schema](/storefront/reference/custom-components/schema.md): Theme Editor Custom Components Schema ##### schema-types Storefront Component Schema Types - [Schema Component Types](/storefront/reference/custom-components/schema-types.md): Storefront Component Schema Types #### page-objects Storefront Page Objects - [General page objects](/storefront/reference/page-objects.md): Storefront Page Objects ##### storefront-page-bundle Storefront Bundle Page Objects - [Storefront Bundle Page Objects](/storefront/reference/page-objects/storefront-page-bundle.md): Storefront Bundle Page Objects ##### storefront-page-comparison Storefront Product Comparison Page Objects - [Product comparison page objects](/storefront/reference/page-objects/storefront-page-comparison.md): Storefront Product Comparison Page Objects ##### storefront-page-help Storefront Help Page Objects - [Help page objects](/storefront/reference/page-objects/storefront-page-help.md): Storefront Help Page Objects ##### storefront-page-home Storefront Home Page Objects - [Home page objects](/storefront/reference/page-objects/storefront-page-home.md): Storefront Home Page Objects ##### storefront-page-listing Storefront Listing Page Objects - [Listing page objects](/storefront/reference/page-objects/storefront-page-listing.md): Storefront Listing Page Objects ##### storefront-page-product Storefront Product Page Objects - [Product profile page objects](/storefront/reference/page-objects/storefront-page-product.md): Storefront Product Page Objects #### storefront-engine Storefront Theme Templating Language Features - [Templating Language Features](/storefront/reference/storefront-engine.md): Storefront Theme Templating Language Features #### storefront-page-structure Storefront Theme page Structure - [Theme Page Structure](/storefront/reference/storefront-page-structure.md): Storefront Theme page Structure #### storefront-structure Storefront Theme Structure - [Structure and contents of a storefront theme](/storefront/reference/storefront-structure.md): Storefront Theme Structure #### toolkit-commands Toolkit Commands - [Toolkit Commands](/storefront/reference/toolkit-commands.md): Toolkit Commands ### storefront-installation Installation - [Install the UI Toolkit](/storefront/storefront-installation.md): Installation ## user-guides API User Guides Overview - [User Guides](/user-guides.md): API User Guides Overview ### addon-store Add-On Store Overview - [Add-On Store](/user-guides/addon-store.md): Add-On Store Overview ### api-usage #### api-auth API authentication Overview - [API authentication](/user-guides/api-usage/api-auth.md): API authentication Overview ##### grant-type Grant types Overview - [Grant types](/user-guides/api-usage/api-auth/grant-type.md): Grant types Overview - [Authorization code for native applications](/user-guides/api-usage/api-auth/grant-type/authorize-native-app.md): Authorization code for native applications - [Authorization code for web applications](/user-guides/api-usage/api-auth/grant-type/authorize-web-app.md): Authorization code for web applications - [Client credentials](/user-guides/api-usage/api-auth/grant-type/credentials.md): Client credentials - [Implicit](/user-guides/api-usage/api-auth/grant-type/implicit.md): Implicit - [Password](/user-guides/api-usage/api-auth/grant-type/password.md): Password - [Refresh token](/user-guides/api-usage/api-auth/grant-type/refresh-token.md): Refresh token ##### role-mapping API and user interface role mapping - [API and user interface role mapping](/user-guides/api-usage/api-auth/role-mapping.md): API and user interface role mapping ##### scopes Scopes - [Scopes](/user-guides/api-usage/api-auth/scopes.md): Scopes ##### token-timeout Token timeouts - [Token timeouts](/user-guides/api-usage/api-auth/token-timeout.md): Token timeouts #### graphql ##### changelog API usage - GraphQL Changelog - [Changelog](/user-guides/api-usage/graphql/changelog.md): API usage - GraphQL Changelog ##### graqhql-explorer API usage - GraphQL Explorer and schema documentation - [GraphQL Explorer and schema documentation](/user-guides/api-usage/graphql/graqhql-explorer.md): API usage - GraphQL Explorer and schema documentation ##### graqhql-policy API usage - GraphQL API policy - [GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md): API usage - GraphQL API policy ##### mutations API usage - GraphQL Mutations - [Mutations](/user-guides/api-usage/graphql/mutations.md): API usage - GraphQL Mutations ##### overview API usage - GraphQL Overview - [Overview](/user-guides/api-usage/graphql/overview.md): API usage - GraphQL Overview ##### queries API usage - GraphQL Queries - [Queries](/user-guides/api-usage/graphql/queries.md): API usage - GraphQL Queries ##### ressource-limitations API usage - GraphQL Resource limitations - [Resource limitations](/user-guides/api-usage/graphql/ressource-limitations.md): API usage - GraphQL Resource limitations ##### terminology API usage - GraphQL terminology - [GraphQL terminology](/user-guides/api-usage/graphql/terminology.md): API usage - GraphQL terminology ##### variables API usage - GraphQL Variables - [Variables](/user-guides/api-usage/graphql/variables.md): API usage - GraphQL Variables #### rest ##### custom-attributes Use custom attributes with REST API - [Use custom attributes with API](/user-guides/api-usage/rest/custom-attributes.md): Use custom attributes with REST API ##### rate-limits REST - Rate limits - [Rate limits](/user-guides/api-usage/rest/rate-limits.md): REST - Rate limits ##### versioning REST API versioning policy - [REST API versioning policy](/user-guides/api-usage/rest/versioning.md): REST API versioning policy ### appdirect-status-definitions The following table describes the outage status definitions for various services. - [AppDirect status page service definitions](/user-guides/appdirect-status-definitions.md): The following table describes the outage status definitions for various services. ### billing-and-subscription Billing and subscription - [Billing and subscription](/user-guides/billing-and-subscription.md): Billing and subscription #### rest-api Billing and subscription - REST API - [Billing and subscription](/user-guides/billing-and-subscription/rest-api.md): Billing and subscription - REST API ##### assign-users Assign users - [Assign users](/user-guides/billing-and-subscription/rest-api/assign-users.md): Assign users - [Additional user assignment and unassignment examples](/user-guides/billing-and-subscription/rest-api/assign-users/additional-examples.md): Additional user assignment and unassignment examples - [Assign and unassign subscriptions](/user-guides/billing-and-subscription/rest-api/assign-users/assign-unassign-sub.md): Assign and unassign subscriptions - [Other subscription assignment-related API methods](/user-guides/billing-and-subscription/rest-api/assign-users/other-methods.md): Other subscription assignment-related API methods - [Use cases](/user-guides/billing-and-subscription/rest-api/assign-users/use-cases.md): Use cases ##### cancel-subscriptions Cancel subscriptions - [Cancel subscriptions](/user-guides/billing-and-subscription/rest-api/cancel-subscriptions.md): Cancel subscriptions - [Additional subscription cancel examples](/user-guides/billing-and-subscription/rest-api/cancel-subscriptions/additional-examples.md): Additional subscription cancel examples - [Canceling a subscription](/user-guides/billing-and-subscription/rest-api/cancel-subscriptions/canceling-a-subscription.md): Canceling a subscription - [Other subscription-related API methods](/user-guides/billing-and-subscription/rest-api/cancel-subscriptions/other-methods.md): Other subscription-related API methods - [Supported request attributes](/user-guides/billing-and-subscription/rest-api/cancel-subscriptions/supported-request-attributes.md): Supported request attributes - [Supported response attributes](/user-guides/billing-and-subscription/rest-api/cancel-subscriptions/supported-response-attributes.md): Supported response attributes - [Use cases](/user-guides/billing-and-subscription/rest-api/cancel-subscriptions/use-cases.md): Use cases ##### change-subscriptions Change subscriptions - [Change subscriptions](/user-guides/billing-and-subscription/rest-api/change-subscriptions.md): Change subscriptions - [Additional subscription change examples](/user-guides/billing-and-subscription/rest-api/change-subscriptions/additional-examples.md): Additional subscription change examples - [Changing a subscription](/user-guides/billing-and-subscription/rest-api/change-subscriptions/changing-a-subscription.md): Changing a subscription - [Other subscription-related API methods](/user-guides/billing-and-subscription/rest-api/change-subscriptions/other-methods.md): Other subscription-related API methods - [Products, payment plans and discounts](/user-guides/billing-and-subscription/rest-api/change-subscriptions/product-payment-plans-discounts.md): Products, payment plans and discounts - [Supported request attributes](/user-guides/billing-and-subscription/rest-api/change-subscriptions/supported-request-attributes.md): Supported request attributes - [Supported response attributes](/user-guides/billing-and-subscription/rest-api/change-subscriptions/supported-response-attributes.md): Supported response attributes - [Use cases](/user-guides/billing-and-subscription/rest-api/change-subscriptions/use-cases.md): Use cases ##### create-payment-instruments Create payment instruments - [Create payment instruments](/user-guides/billing-and-subscription/rest-api/create-payment-instruments.md): Create payment instruments - [Additional payment instrument creation examples](/user-guides/billing-and-subscription/rest-api/create-payment-instruments/additional-examples.md): Additional payment instrument creation examples - [Creating a payment instrument](/user-guides/billing-and-subscription/rest-api/create-payment-instruments/creating-payment-instrument.md): Creating a payment instrument - [Other payment instrument-related API methods](/user-guides/billing-and-subscription/rest-api/create-payment-instruments/other-methods.md): Other payment instrument-related API methods - [Supported request attributes](/user-guides/billing-and-subscription/rest-api/create-payment-instruments/supported-request-attributes.md): Supported request attributes - [Supported response attributes](/user-guides/billing-and-subscription/rest-api/create-payment-instruments/supported-response-attributes.md): Supported response attributes - [Use cases](/user-guides/billing-and-subscription/rest-api/create-payment-instruments/use-cases.md): Use cases ##### create-subscriptions Create subscriptions - [Create subscriptions](/user-guides/billing-and-subscription/rest-api/create-subscriptions.md): Create subscriptions - [Additional subscription creation examples](/user-guides/billing-and-subscription/rest-api/create-subscriptions/additional-examples.md): Additional subscription creation examples - [Creating a subscription](/user-guides/billing-and-subscription/rest-api/create-subscriptions/creating-a-subscription.md): Creating a subscription - [Other subscription-related API methods](/user-guides/billing-and-subscription/rest-api/create-subscriptions/other-methods.md): Other subscription-related API methods - [Products, payment plans and discounts](/user-guides/billing-and-subscription/rest-api/create-subscriptions/product-payment-plans-discounts.md): Products, payment plans and discounts - [Supported request attributes](/user-guides/billing-and-subscription/rest-api/create-subscriptions/supported-request-attributes.md): Supported request attributes - [Supported response attributes](/user-guides/billing-and-subscription/rest-api/create-subscriptions/supported-response-attributes.md): Supported response attributes - [Use cases](/user-guides/billing-and-subscription/rest-api/create-subscriptions/use-cases.md): Use cases ##### manage-discounts Manage discounts - [Manage discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts.md): Manage discounts - [Configure retainable discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/configure-retainable-discounts.md): Configure retainable discounts - [Create discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/create-discounts.md): Create discounts - [Delete discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/delete-discounts.md): Delete discounts - [List discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/list-discounts.md): List discounts - [Retrieve discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/retrieve-discounts.md): Retrieve discounts - [Update discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/update-discounts.md): Update discounts ##### metered-usage-v1 Metered usage V1 - [Metered usage V1](/user-guides/billing-and-subscription/rest-api/metered-usage-v1.md): Metered usage V1 - [Metered usage prerequisites](/user-guides/billing-and-subscription/rest-api/metered-usage-v1/metered-usage-prereqs.md): Metered usage prerequisites - [Send custom metered usage](/user-guides/billing-and-subscription/rest-api/metered-usage-v1/send-custom.md): Send custom metered usage - [Send preconfigured metered usage](/user-guides/billing-and-subscription/rest-api/metered-usage-v1/send-preconfigured.md): Send preconfigured metered usage - [Supported metered usage units](/user-guides/billing-and-subscription/rest-api/metered-usage-v1/supported-metered-usage-units.md): Supported metered usage units ##### payment-js-library Payment.js library - [Payment.js library](/user-guides/billing-and-subscription/rest-api/payment-js-library.md): Payment.js library - [Payment.js authorization](/user-guides/billing-and-subscription/rest-api/payment-js-library/authorization.md): Payment.js authorization - [Choose your authorization method](/user-guides/billing-and-subscription/rest-api/payment-js-library/choose-authorization-method.md.md): Choose your authorization method - [Method 1: Create payment methods with a public developer key](/user-guides/billing-and-subscription/rest-api/payment-js-library/choose-authorization-method.md/method-1.md): Method 1: Create payment methods with a public developer key - [Create payment methods with tokens](/user-guides/billing-and-subscription/rest-api/payment-js-library/choose-authorization-method.md/method-1/create-payment-methods-tokens.md): Create payment methods with tokens - [Create tokens](/user-guides/billing-and-subscription/rest-api/payment-js-library/choose-authorization-method.md/method-1/create-tokens.md): Create tokens - [Initialize adPayment](/user-guides/billing-and-subscription/rest-api/payment-js-library/choose-authorization-method.md/method-1/initialize-adpayment.md): Initialize adPayment - [Method 2: Create payment methods with client-based tokens](/user-guides/billing-and-subscription/rest-api/payment-js-library/choose-authorization-method.md/method-2.md): Method 2: Create payment methods with client-based tokens - [Create payment methods directly](/user-guides/billing-and-subscription/rest-api/payment-js-library/choose-authorization-method.md/method-2/create-payment-methods-directly.md): Create payment methods directly - [Initialize adPayment](/user-guides/billing-and-subscription/rest-api/payment-js-library/choose-authorization-method.md/method-2/initialize-adpayment.md): Initialize adPayment - [List payment methods](/user-guides/billing-and-subscription/rest-api/payment-js-library/choose-authorization-method.md/method-2/list-payment-methods.md): List payment methods - [Collect payment method information](/user-guides/billing-and-subscription/rest-api/payment-js-library/collect-information.md): Collect payment method information - [Create the paymentMethod object](/user-guides/billing-and-subscription/rest-api/payment-js-library/create-payment-method-object.md): Create the paymentMethod object - [Payment.js GitHub repository](/user-guides/billing-and-subscription/rest-api/payment-js-library/github-repo.md): Payment.js GitHub repository - [Include payment.js](/user-guides/billing-and-subscription/rest-api/payment-js-library/include-payment-js.md): Include payment.js - [Retrieve supported payment method types](/user-guides/billing-and-subscription/rest-api/payment-js-library/retrieve-supported.md): Retrieve supported payment method types - [Retrieve user and company IDs](/user-guides/billing-and-subscription/rest-api/payment-js-library/retrieve-user-company-ids.md): Retrieve user and company IDs - [Test the library](/user-guides/billing-and-subscription/rest-api/payment-js-library/test-library.md): Test the library ### checkout Checkout - [Checkout](/user-guides/checkout.md): Checkout #### errorhandling Error handling - [Error handling](/user-guides/checkout/errorhandling.md): Error handling #### gettingstarted Getting started with Checkout APIs - [Getting started](/user-guides/checkout/gettingstarted.md): Getting started with Checkout APIs #### graphql Use cases - [Checkout APIs](/user-guides/checkout/graphql.md): Use cases ##### addeditpaymentdetails Add/edit payment details - [Add/edit payment details](/user-guides/checkout/graphql/addeditpaymentdetails.md): Add/edit payment details ##### additemstocart Add items to a cart - [Add items to a cart](/user-guides/checkout/graphql/additemstocart.md): Add items to a cart ##### applyremovediscount Apply/remove discount code - [Apply/remove discount codes](/user-guides/checkout/graphql/applyremovediscount.md): Apply/remove discount code ##### fetchaddmodifyshipping Fetch, add, and modify shipping details for a cart - [Fetch, add, and modify shipping details for a cart](/user-guides/checkout/graphql/fetchaddmodifyshipping.md): Fetch, add, and modify shipping details for a cart ##### fetchcheckoutsettings Fetch checkout settings - [Fetch checkout settings](/user-guides/checkout/graphql/fetchcheckoutsettings.md): Fetch checkout settings ##### fetchdetailsactive Fetch the details of an active cart - [Fetch the details of an active cart](/user-guides/checkout/graphql/fetchdetailsactive.md): Fetch the details of an active cart ##### finalizeacart Finalize a cart - [Finalize a cart](/user-guides/checkout/graphql/finalizeacart.md): Finalize a cart ##### getcartfields Get cart fields - [Get cart fields](/user-guides/checkout/graphql/getcartfields.md): Get cart fields ##### removeitemsfromacart Remove items from a cart - [Remove items from a cart](/user-guides/checkout/graphql/removeitemsfromacart.md): Remove items from a cart ##### updatecartdetails Update cart details - [Update cart details](/user-guides/checkout/graphql/updatecartdetails.md): Update cart details ##### validatecartdetails Validate cart details - [Validate cart details](/user-guides/checkout/graphql/validatecartdetails.md): Validate cart details ### custom-pricing Custom pricing - [Custom pricing](/user-guides/custom-pricing.md): Custom pricing #### graphql-api Custom pricing - GraphQL API - [Custom pricing guide](/user-guides/custom-pricing/graphql-api.md): Custom pricing - GraphQL API ##### create-price-books Create price books - [Create price books](/user-guides/custom-pricing/graphql-api/create-price-books.md): Create price books ##### create-price-books-conditions Create price book conditions - [Create price book conditions](/user-guides/custom-pricing/graphql-api/create-price-books-conditions.md): Create price book conditions ##### create-price-books-entries Create price book entries - [Create price book entries](/user-guides/custom-pricing/graphql-api/create-price-books-entries.md): Create price book entries ##### marketplace-prices Set Marketplace Prices - [Set Marketplace Prices](/user-guides/custom-pricing/graphql-api/marketplace-prices.md): Set Marketplace Prices ##### reseller-wholesale-prices Set Reseller Wholesale Prices - [Set Reseller Wholesale Prices](/user-guides/custom-pricing/graphql-api/reseller-wholesale-prices.md): Set Reseller Wholesale Prices ### DevCenter2.0 Dev Center 2.0 - [Overview](/user-guides/DevCenter2.0.md): Dev Center 2.0 #### CustomizePartnerOnboarding Customize partner onboarding - [Customize partner onboarding](/user-guides/DevCenter2.0/CustomizePartnerOnboarding.md): Customize partner onboarding ##### Action-menu-options Action menu options - [Action menu option](/user-guides/DevCenter2.0/CustomizePartnerOnboarding/Action-menu-options.md): Action menu options ##### Customize-theme-for-form Customize theme for the form - [Customize theme for the form](/user-guides/DevCenter2.0/CustomizePartnerOnboarding/Customize-theme-for-form.md): Customize theme for the form ##### Onboarding-using-Visual-form-builder Customize partner onboarding form using visual editor - [Customize partner onboarding form using visual editor](/user-guides/DevCenter2.0/CustomizePartnerOnboarding/Onboarding-using-Visual-form-builder.md): Customize partner onboarding form using visual editor #### ManageDeveloperApplicants Manage developer applicants - [Manage developer applicants](/user-guides/DevCenter2.0/ManageDeveloperApplicants.md): Manage developer applicants ##### Add-lead Add leads - [Add leads](/user-guides/DevCenter2.0/ManageDeveloperApplicants/Add-lead.md): Add leads ##### Download-applicant-list Download applicant list - [Download applicant list](/user-guides/DevCenter2.0/ManageDeveloperApplicants/Download-applicant-list.md): Download applicant list ##### Search-filter-applicants Search and filter applicants - [Search and filter data](/user-guides/DevCenter2.0/ManageDeveloperApplicants/Search-filter-applicants.md): Search and filter applicants ### extensions Platform Extensions Overview - [Elevating Your Marketplace](/user-guides/extensions.md): Platform Extensions Overview #### getting-started The platform extensions system is a powerful feature that allows 3rd party developers to build custom UI applications and embed them inside the marketplace. This documentation provides a comprehensive guide to building and uploading platform extensions to the platform. It includes step-by-step instructions, best practices, troubleshooting guidance, and examples. - [Getting Started](/user-guides/extensions/getting-started.md): The platform extensions system is a powerful feature that allows 3rd party developers to build custom UI applications and embed them inside the marketplace. This documentation provides a comprehensive guide to building and uploading platform extensions to the platform. It includes step-by-step instructions, best practices, troubleshooting guidance, and examples. #### how-tos ##### add-static-assets Add Static assets - [Add Static Assets](/user-guides/extensions/how-tos/add-static-assets.md): Add Static assets ##### create-extension Create a new extension - [Create a new extension](/user-guides/extensions/how-tos/create-extension.md): Create a new extension ##### installation Installation - [Install the UI Toolkit](/user-guides/extensions/how-tos/installation.md): Installation ##### local-development Developing and testing your extension locally is an essential step before publishing it to the Marketplace. In this guide, we will take you through the necessary steps to get your extension up and running on your local machine. - [Local Extension Development](/user-guides/extensions/how-tos/local-development.md): Developing and testing your extension locally is an essential step before publishing it to the Marketplace. In this guide, we will take you through the necessary steps to get your extension up and running on your local machine. ##### localization At AppDirect, we recognize the significance of localization for customers operating across various markets. Our platform extensions boilerplate app integrates react-intl, a widely-used localization library for React applications. This integration enables seamless localization of your front-end pages to cater to your audience's requirements. The comprehensive react-intl API is accessible, granting you complete access to its features and capabilities. - [Localization](/user-guides/extensions/how-tos/localization.md): At AppDirect, we recognize the significance of localization for customers operating across various markets. Our platform extensions boilerplate app integrates react-intl, a widely-used localization library for React applications. This integration enables seamless localization of your front-end pages to cater to your audience's requirements. The comprehensive react-intl API is accessible, granting you complete access to its features and capabilities. ##### marketplace-context This guide concentrates on Bootstrap Data, a hook that grants access to various marketplace configurations and user details. Utilizing this data enables you to tailor a more personalized experience for your users. Let's get started! - [Accessing Company, User, and Settings Data](/user-guides/extensions/how-tos/marketplace-context.md): This guide concentrates on Bootstrap Data, a hook that grants access to various marketplace configurations and user details. Utilizing this data enables you to tailor a more personalized experience for your users. Let's get started! ##### marketplace-data Overview - [Using the Marketplace APIs](/user-guides/extensions/how-tos/marketplace-data.md): Overview ##### preview-publish Developers utilizing our extension system create custom UI applications to augment the platform's capabilities. This document serves as a comprehensive guide to previewing, publishing, and enabling platform extensions, ensuring they are ready for users. Each action is a crucial component of the extension deployment process: - [Extension Preview, Publication, and Enabling](/user-guides/extensions/how-tos/preview-publish.md): Developers utilizing our extension system create custom UI applications to augment the platform's capabilities. This document serves as a comprehensive guide to previewing, publishing, and enabling platform extensions, ensuring they are ready for users. Each action is a crucial component of the extension deployment process: ##### secure-token-for-api-integration Introduction - [Integrate External APIs with Secure Tokens](/user-guides/extensions/how-tos/secure-token-for-api-integration.md): Introduction - [Fetch Token](/user-guides/extensions/how-tos/secure-token-for-api-integration/fetch-token.md): Overview - [Validate Token](/user-guides/extensions/how-tos/secure-token-for-api-integration/validate-token.md): After fetching the authentication token in your extension app, the token can now be included with the requests to your API. ##### upload-extension Uploading an Extension - [Uploading an Extension](/user-guides/extensions/how-tos/upload-extension.md): Uploading an Extension #### reference ##### architecture Overview - [Extensions Architecture](/user-guides/extensions/reference/architecture.md): Overview ##### components-library Introduction - [Components Library Integration](/user-guides/extensions/reference/components-library.md): Introduction ##### secure-token-system The secure token system allows authenticated access to your external APIs from within your extension frontend app, with the use of Cross-Origin Resource Sharing (CORS) headers and JSON Web Tokens (JWT). - [Secure token system](/user-guides/extensions/reference/secure-token-system.md): The secure token system allows authenticated access to your external APIs from within your extension frontend app, with the use of Cross-Origin Resource Sharing (CORS) headers and JSON Web Tokens (JWT). ### Functions #### functions-early-access Early Access - [Early Access Features for AppDirect Functions](/user-guides/Functions/functions-early-access.md): Early Access #### functions-getting-started Functions - [Getting Started with AppDirect Functions](/user-guides/Functions/functions-getting-started.md): Functions ### graphql-dev-tools Developer tools for GraphQL - [Developer tools](/user-guides/graphql-dev-tools.md): Developer tools for GraphQL #### enable-graphql-tools The GraphQL Explorer is a browser-based tool that lets Marketplace - [Enable GraphQL tools](/user-guides/graphql-dev-tools/enable-graphql-tools.md): The GraphQL Explorer is a browser-based tool that lets Marketplace #### graphql-demo To run production and preview queries and mutations, - [Demo GraphQL API Explorer](/user-guides/graphql-dev-tools/graphql-demo.md): To run production and preview queries and mutations, #### graphql-explorer The GraphQL Explorer uses your live data (including the Preview - [GraphQL Explorer](/user-guides/graphql-dev-tools/graphql-explorer.md): The GraphQL Explorer uses your live data (including the Preview #### graphql-schema-introspection Introspection must be enabled to execute - [GraphQL Schema Introspection](/user-guides/graphql-dev-tools/graphql-schema-introspection.md): Introspection must be enabled to execute ### inventory Inventory - [Inventory](/user-guides/inventory.md): Inventory #### glossary Glossary - [Glossary](/user-guides/inventory/glossary.md): Glossary #### graphql-api Inventory GraphQL API - [Inventory](/user-guides/inventory/graphql-api.md): Inventory GraphQL API ##### marketplace-ui Inventory in the marketplace UI - [Inventory in the marketplace UI](/user-guides/inventory/graphql-api/marketplace-ui.md): Inventory in the marketplace UI ##### mutations Inventory mutations - [Inventory mutations](/user-guides/inventory/graphql-api/mutations.md): Inventory mutations ##### queries Inventory queries - [Inventory queries](/user-guides/inventory/graphql-api/queries.md): Inventory queries ### ironclad-clickwrap-marktplc Ironclad is an embedded contract management tool. AppDirect uses Ironclad Clickwrap with the marketplace to manage the terms and conditions and policies that a user must accept to activate their accounts on the marketplace. - [Ironclad Clickwrap integration](/user-guides/ironclad-clickwrap-marktplc.md): Ironclad is an embedded contract management tool. AppDirect uses Ironclad Clickwrap with the marketplace to manage the terms and conditions and policies that a user must accept to activate their accounts on the marketplace. ### notifications Notifications - [Notifications](/user-guides/notifications.md): Notifications #### graphql-api Notifications GraphQL API - [Notifications](/user-guides/notifications/graphql-api.md): Notifications GraphQL API ### product-information Product - [Product](/user-guides/product-information.md): Product #### gettingstarted Getting started with product APIs - [Getting started](/user-guides/product-information/gettingstarted.md): Getting started with product APIs ##### api-difference API differences - [Understanding product API differences: Marketplace vs. Catalog](/user-guides/product-information/gettingstarted/api-difference.md): API differences ##### product-glossay Product glossary - [Product glossary](/user-guides/product-information/gettingstarted/product-glossay.md): Product glossary ##### product-model Product model - [Product model](/user-guides/product-information/gettingstarted/product-model.md): Product model ##### understanding-publication Understanding product publication - [Understanding product publication](/user-guides/product-information/gettingstarted/understanding-publication.md): Understanding product publication #### graphql-api GraphQL API guide - [Product API guide](/user-guides/product-information/graphql-api.md): GraphQL API guide ##### branding Add listing and profile information - [Add listing and profile information](/user-guides/product-information/graphql-api/branding.md): Add listing and profile information ##### create-editions Create editions - [Create editions](/user-guides/product-information/graphql-api/create-editions.md): Create editions ##### create-integration-config Create an integration configuration - [Create an integration configuration](/user-guides/product-information/graphql-api/create-integration-config.md): Create an integration configuration ##### create-pricing-plans Create pricing plans - [Create pricing plans](/user-guides/product-information/graphql-api/create-pricing-plans.md): Create pricing plans ##### create-product-shell Create the product shell - [Create the product shell](/user-guides/product-information/graphql-api/create-product-shell.md): Create the product shell ##### mapping Publish - [Mapping product fields](/user-guides/product-information/graphql-api/mapping.md): Publish ##### publish Publish - [Publish and add to marketplace](/user-guides/product-information/graphql-api/publish.md): Publish #### practical-guidelines Practical guidelines - [Practical guidelines](/user-guides/product-information/practical-guidelines.md): Practical guidelines #### profile Product management guide - [Product Management Guide](/user-guides/product-information/profile.md): Product management guide ##### profile-completion Profile completion - [Product Profile completion guidelines](/user-guides/product-information/profile/profile-completion.md): Profile completion ### product-integration Product integration - [Product integration](/user-guides/product-integration.md): Product integration #### rest-api Product vendors can use API requests to synchronize company or user information between their own systems and the AppDirect platform. See the following sections for more information: - [Product Integration](/user-guides/product-integration/rest-api.md): Product vendors can use API requests to synchronize company or user information between their own systems and the AppDirect platform. See the following sections for more information: ##### company-synchronization Company Synchronization (Company Sync) enables developers to send developer account information to the marketplace. A developer account is a customer that owns subscriptions for a single company or organization. - [Company synchronization](/user-guides/product-integration/rest-api/company-synchronization.md): Company Synchronization (Company Sync) enables developers to send developer account information to the marketplace. A developer account is a customer that owns subscriptions for a single company or organization. - [Company Sync HTTP status codes](/user-guides/product-integration/rest-api/company-synchronization/company-sync-http-status.md): Code - [Company Sync prerequisites](/user-guides/product-integration/rest-api/company-synchronization/company-sync-prereq.md): Complete the following before using the Company Sync endpoints. - [Create developer accounts](/user-guides/product-integration/rest-api/company-synchronization/create-dev-accounts.md): Description: Use this request to notify AppDirect that a new developer account was created on a developer system. It is only possible to create one developer account per request. - [Notify AppDirect of expired developer accounts](/user-guides/product-integration/rest-api/company-synchronization/notify-expired-dev-accounts.md): Description: Use this request to notify AppDirect that an existing developer account has expired on a developer system. It is also used if the relationship with the reseller was revoked. It is only possible to indicate a single expired developer account per request. ##### metered-usage-v1 Metered usage V1 - [Metered usage V1](/user-guides/product-integration/rest-api/metered-usage-v1.md): Metered usage V1 - [Metered usage API HTTP status codes](/user-guides/product-integration/rest-api/metered-usage-v1/metered-usage-api-status-codes.md): To view the HTTP status codes that are relevant to the metered usage V1 API, see Billing usage in the REST API reference documentation. - [Metered usage prerequisites](/user-guides/product-integration/rest-api/metered-usage-v1/metered-usage-prereq.md): You must complete the following prerequisites before you can send a user's metered usage to a marketplace. - [Preconfigured and custom metered usage](/user-guides/product-integration/rest-api/metered-usage-v1/pre-configured-and-custom.md): There are two types of metered usage: preconfigured and custom. Both types require product configuration before you submit usage with the API (see Metered usage prerequisites). - [Send custom metered usage](/user-guides/product-integration/rest-api/metered-usage-v1/send-custom-metered-usage.md): Description—Send usage data for custom metered usage to the AppDirect marketplace that hosts the user account. For a description of custom metered usage, see Preconfigured and custom metered usage. - [Send preconfigured metered usage](/user-guides/product-integration/rest-api/metered-usage-v1/send-preconfigured-usage.md): Description: Send usage data for preconfigured metered usage to the AppDirect marketplace that hosts the user account. For a description of preconfigured metered usage, see Preconfigured and custom metered usage. - [Supported metered usage units](/user-guides/product-integration/rest-api/metered-usage-v1/supported-metered-usage-units.md): The AppDirect platform supports many preconfigured usage units. See PricingUnit in the API reference documentation. If you require additional unit types, contact your AppDirect technical representative. ##### metered-usage-v2 Metered usage V2 - [Metered usage V2](/user-guides/product-integration/rest-api/metered-usage-v2.md): Metered usage V2 - [Delayed invoicing recommendation](/user-guides/product-integration/rest-api/metered-usage-v2/delayed-invoicing-rec.md): Metered usage V2 supports delayed invoicing. We recommend that you enable delayed invoicing for products configured for metered usage if you (the vendor) will be: - [Fetch usage processing status](/user-guides/product-integration/rest-api/metered-usage-v2/fetch-usage-processing-status.md): Description: Retrieve the status of metered usage events submitted with Billing Usage v2 requests (see Send preconfigured metered usage and Send preconfigured and custom metered usage). To do so, reference the response for the Billing Usage v2 request and either - [Historic usage and adjustments](/user-guides/product-integration/rest-api/metered-usage-v2/historic-usage-and-adjustments.md): Usage can be submitted retroactively to correct usage for billing periods that are already invoiced except for usage for products configured for volume pricing. Every usage event is submitted with an associated date, so adjustments are allocated to the correct historic billing period and invoiced accordingly. Missed usage can be submitted, and over-reported usage corrected, as illustrated with the following examples: - [Metered usage API HTTP status codes](/user-guides/product-integration/rest-api/metered-usage-v2/metered-usage-api-status-codes.md): To view the HTTP status codes that are relevant to the metered usage V2 API, see Billing usage V2 in the REST API reference documentation. - [Metered usage prerequisites](/user-guides/product-integration/rest-api/metered-usage-v2/metered-usage-prereq.md): We recommend that you assess whether delayed invoicing is appropriate for your products that are configured for metered usage. See Delayed invoicing recommendation. - [Preconfigured and custom metered usage](/user-guides/product-integration/rest-api/metered-usage-v2/pre-configured-and-custom.md): There are two types of metered usage: preconfigured and custom. Both types require product configuration before you submit usage with the API (see Metered usage prerequisites). With the V2 API, if needed, you can submit both preconfigured and custom metered usage events in the same call. - [Send custom metered usage](/user-guides/product-integration/rest-api/metered-usage-v2/send-custom-metered-usage.md): Description: Send up to 850 custom metered usage events or request a payload of size 262144 bytes to the AppDirect marketplace that hosts the user account. For a description of custom metered usage, see Preconfigured and custom metered usage. - [Send preconfigured and custom metered usage](/user-guides/product-integration/rest-api/metered-usage-v2/send-preconfig-custom-metered-usage.md): You cannot use this combined pricing model method for usage for products configured with volume pricing. Usage for products configured with volume pricing must not be sent in API requests with usage for other pricing models. - [Send preconfigured metered usage](/user-guides/product-integration/rest-api/metered-usage-v2/send-preconfigured-usage.md): Description: Send up to 250 preconfigured metered usage events to the AppDirect marketplace that hosts the user account. For a description of preconfigured metered usage, see Preconfigured and custom metered usage. - [Supported metered usage units](/user-guides/product-integration/rest-api/metered-usage-v2/supported-metered-usage-units.md): The AppDirect platform supports many preconfigured usage units. See PricingUnit in the API reference documentation. If you require additional unit types, contact your AppDirect technical representative. ##### user-synchronization When a new user is set up on the marketplace and assigned to a subscription, the Developer is notified and the user is automatically set up on the developer system. See User assignment for more information. - [User synchronization](/user-guides/product-integration/rest-api/user-synchronization.md): When a new user is set up on the marketplace and assigned to a subscription, the Developer is notified and the user is automatically set up on the developer system. See User assignment for more information. - [Assign users](/user-guides/product-integration/rest-api/user-synchronization/assign-users.md): Use this request to notify AppDirect that a new user has been assigned on the developer system. - [Unassign users](/user-guides/product-integration/rest-api/user-synchronization/unassign-users.md): Use this request to unassign users from the Developer's company after they are removed from the developer platform. - [User Sync HTTP status codes](/user-guides/product-integration/rest-api/user-synchronization/user-sync-http-status.md): Code - [User Sync prerequisites](/user-guides/product-integration/rest-api/user-synchronization/user-sync-prereq.md): Before you can use the User Sync endpoints, you must do the following things. ### product-variants Product variants - [Product variants](/user-guides/product-variants.md): Product variants #### graphql-api Product variants - GraphQL API - [Product Variants](/user-guides/product-variants/graphql-api.md): Product variants - GraphQL API ##### features Product variant features - [Product variants features](/user-guides/product-variants/graphql-api/features.md): Product variant features - [Disable variant](/user-guides/product-variants/graphql-api/features/disable-variant.md): Disable variant - [Enable variant](/user-guides/product-variants/graphql-api/features/enable-variant.md): Enable variant - [Query variant creation](/user-guides/product-variants/graphql-api/features/query-variant-creation.md): Query variant creation - [Trigger variant creation](/user-guides/product-variants/graphql-api/features/trigger-variant-creation.md): Trigger variant creation - [Update variant](/user-guides/product-variants/graphql-api/features/update-variant.md): Update variant ##### options Product variant options - [Product variant options](/user-guides/product-variants/graphql-api/options.md): Product variant options - [Create variant option](/user-guides/product-variants/graphql-api/options/create-variant-option.md): Use the Create variant options - [Disable variant option](/user-guides/product-variants/graphql-api/options/disable-variant-option.md): Use the Remove variant - [Order variant option](/user-guides/product-variants/graphql-api/options/order-variant-options.md): Use the Order variant options - [Update variant option](/user-guides/product-variants/graphql-api/options/update-variant-options.md): Use the Update variant options ##### query-marketplace-products Query marketplace products - [Query marketplace products](/user-guides/product-variants/graphql-api/query-marketplace-products.md): Query marketplace products ##### values Product variant values - [Product variant values](/user-guides/product-variants/graphql-api/values.md): Product variant values - [Create variant values](/user-guides/product-variants/graphql-api/values/create-variant-values.md): Create variant values - [Delete variant values](/user-guides/product-variants/graphql-api/values/delete-variant-values.md): Delete variant values - [Order variant values](/user-guides/product-variants/graphql-api/values/order-variant-values.md): Order variant values - [Update variant values](/user-guides/product-variants/graphql-api/values/update-variant-values.md): Update variant values ### reseller Overview - [Reseller](/user-guides/reseller.md): Overview #### graphql The Reseller GraphQL API provides tools for querying and managing existing Reseller type accounts. - [Reseller GraphQL API](/user-guides/reseller/graphql.md): The Reseller GraphQL API provides tools for querying and managing existing Reseller type accounts. ##### mutations A Marketplace Manager or Reseller Manager can use the Reseller GraphQL mutations to assign an account to a Reseller as a client, or to remove such an assignment. - [Reseller GraphQL Mutations](/user-guides/reseller/graphql/mutations.md): A Marketplace Manager or Reseller Manager can use the Reseller GraphQL mutations to assign an account to a Reseller as a client, or to remove such an assignment. ##### queries The Reseller GraphQL queries allow you to search for accounts and account memberships based on the Reseller-client links between accounts. - [Reseller GraphQL Queries](/user-guides/reseller/graphql/queries.md): The Reseller GraphQL queries allow you to search for accounts and account memberships based on the Reseller-client links between accounts. ### search Overview - [Search](/user-guides/search.md): Overview #### graphql With AppDirect Search, marketplace - [Search](/user-guides/search/graphql.md): With AppDirect Search, marketplace ##### query Use the feedResources - [Query feed resources](/user-guides/search/graphql/query.md): Use the feedResources #### rest With AppDirect Search, marketplace - [Search](/user-guides/search/rest.md): With AppDirect Search, marketplace ##### configure To aggregate data related to a product with the AppDirect Search - [Configure products for Search](/user-guides/search/rest/configure.md): To aggregate data related to a product with the AppDirect Search ##### connect-users Description: Create a new user connection to share and retrieve data - [Connect users and applications to Search](/user-guides/search/rest/connect-users.md): Description: Create a new user connection to share and retrieve data ##### disconnect Description: Disconnect a user connection from AppDirect Search. - [Disconnect users and applications from Search](/user-guides/search/rest/disconnect.md): Description: Disconnect a user connection from AppDirect Search. ##### getting-started For a description of the AppDirect Search feature, see - [Getting started with Search](/user-guides/search/rest/getting-started.md): For a description of the AppDirect Search feature, see ##### publish-data Description: Use the Publish content events endpoint to send and - [Publish data to Search](/user-guides/search/rest/publish-data.md): Description: Use the Publish content events endpoint to send and ##### query-content Merchants use a GraphQL API to query Appdirect Search for feeds. See - [Query content for feeds](/user-guides/search/rest/query-content.md): Merchants use a GraphQL API to query Appdirect Search for feeds. See ##### search-content Description: Search for keywords in the AppDirect Search repository. - [Search content](/user-guides/search/rest/search-content.md): Description: Search for keywords in the AppDirect Search repository. ### serialized-fulfillment Overview - [Serialized Fulfillment](/user-guides/serialized-fulfillment.md): Overview #### graphql The Serialized Fulfillment GraphQL API supports a Serialized Fulfillment system that can track individually identified items within a shipment of physical products. - [Serialized Fulfillment GraphQL API](/user-guides/serialized-fulfillment/graphql.md): The Serialized Fulfillment GraphQL API supports a Serialized Fulfillment system that can track individually identified items within a shipment of physical products. ##### mutations The Serialized Fulfillment mutations allow you to create a list of serialized units in a specific shipment for a specific shipping item, or to remove an existing list. - [Serialized Fulfillment Mutations](/user-guides/serialized-fulfillment/graphql/mutations.md): The Serialized Fulfillment mutations allow you to create a list of serialized units in a specific shipment for a specific shipping item, or to remove an existing list. ##### queries The Serialized Fulfillment GraphQL API includes the following query: - [Serialized Fulfillment Queries](/user-guides/serialized-fulfillment/graphql/queries.md): The Serialized Fulfillment GraphQL API includes the following query: ### shipping-integration Shipping integration - [Shipping integration](/user-guides/shipping-integration.md): Shipping integration #### rest-api Shipping integration - REST API - [Shipping integration](/user-guides/shipping-integration/rest-api.md): Shipping integration - REST API ##### custom-shipping-connector-tech-design Custom shipping connector technical design - [Custom shipping connector technical design](/user-guides/shipping-integration/rest-api/custom-shipping-connector-tech-design.md): Custom shipping connector technical design - [Calls expected by the purchase fulfillment manager](/user-guides/shipping-integration/rest-api/custom-shipping-connector-tech-design/calls-expected.md): Calls expected by the purchase fulfillment manager - [Data objects](/user-guides/shipping-integration/rest-api/custom-shipping-connector-tech-design/data-objects.md): Data objects - [Limitations](/user-guides/shipping-integration/rest-api/custom-shipping-connector-tech-design/limitations.md): Limitations - [Marketplace-specific configurations](/user-guides/shipping-integration/rest-api/custom-shipping-connector-tech-design/marketplace-specific-configurations.md): Marketplace-specific configurations - [Shipment authentication](/user-guides/shipping-integration/rest-api/custom-shipping-connector-tech-design/shipment-authentication.md): Shipment authentication - [Shipping fulfillment flow](/user-guides/shipping-integration/rest-api/custom-shipping-connector-tech-design/shipping-fulfillment-flow.md): Shipping fulfillment flow ##### manage-shipping-zones Manage shipping zones - [Manage shipping zones](/user-guides/shipping-integration/rest-api/manage-shipping-zones.md): Manage shipping zones ##### shipping-connector-requirements Shipping connector requirements - [Shipping connector requirements](/user-guides/shipping-integration/rest-api/shipping-connector-requirements.md): Shipping connector requirements ##### shipping-fulfillment-types Shipping fulfillment types - [Shipping fulfillment types](/user-guides/shipping-integration/rest-api/shipping-fulfillment-types.md): Shipping fulfillment types ### subscription-price-change Subscription price change - [Subscription price change](/user-guides/subscription-price-change.md): Subscription price change #### graphql-api Subscription price change guide - [Subscription price change guide](/user-guides/subscription-price-change/graphql-api.md): Subscription price change guide ##### business-use-cases Business use cases - [Business use cases](/user-guides/subscription-price-change/graphql-api/business-use-cases.md): Business use cases ##### instructions-price-change Instructions to change a price - [Instructions to change a price](/user-guides/subscription-price-change/graphql-api/instructions-price-change.md): Instructions to change a price ##### supported-use-cases Supported use cases - [Supported use cases](/user-guides/subscription-price-change/graphql-api/supported-use-cases.md): Supported use cases ##### using-graphql-api Using the GraphQL APIs - [Using the GraphQL APIs](/user-guides/subscription-price-change/graphql-api/using-graphql-api.md): Using the GraphQL APIs ### user-companies Users and companies - [User and account management](/user-guides/user-companies.md): Users and companies #### apireferences API Reference - [API Reference](/user-guides/user-companies/apireferences.md): API Reference #### gettingstarted Getting started with user and account management APIs - [Getting started](/user-guides/user-companies/gettingstarted.md): Getting started with user and account management APIs #### graphql Use cases - [Use cases](/user-guides/user-companies/graphql.md): Use cases ##### convertingmanageduserscompanies Converting managed users/companies - [Convert managed users or companies](/user-guides/user-companies/graphql/convertingmanageduserscompanies.md): Converting managed users/companies ##### creatingmanageduserscompanies Creating managed users/companies - [Create managed users or companies](/user-guides/user-companies/graphql/creatingmanageduserscompanies.md): Creating managed users/companies ##### creatingnewcompaniesforexistingusers Create new companies for existing users - [Create new companies for existing users](/user-guides/user-companies/graphql/creatingnewcompaniesforexistingusers.md): Create new companies for existing users #### rest Managing user and account APIs - [Working with user and account management APIs](/user-guides/user-companies/rest.md): Managing user and account APIs ##### createcompanies User and Companies - Create companies - [Create companies/accounts](/user-guides/user-companies/rest/createcompanies.md): User and Companies - Create companies ##### createcompanyaccountmemberships Create company/account memberships - [Create company/account memberships](/user-guides/user-companies/rest/createcompanyaccountmemberships.md): Create company/account memberships ##### createusers Create users - [Create users](/user-guides/user-companies/rest/createusers.md): Create users ##### deletecompanyaccountmemberships Delete company/account memberships - [Delete company/account memberships](/user-guides/user-companies/rest/deletecompanyaccountmemberships.md): Delete company/account memberships ##### deleteusers Delete users - [Delete users](/user-guides/user-companies/rest/deleteusers.md): Delete users ##### managecompanyinvitations Manage company invitations - [Manage company invitations](/user-guides/user-companies/rest/managecompanyinvitations.md): Manage company invitations ##### readcompaniesaccounts Read companies/accounts - [Read companies/accounts](/user-guides/user-companies/rest/readcompaniesaccounts.md): Read companies/accounts ##### readuserdetails Read user details - [Read user details](/user-guides/user-companies/rest/readuserdetails.md): Read user details ##### updatecompanies Update companies/accounts - [Update companies/accounts](/user-guides/user-companies/rest/updatecompanies.md): Update companies/accounts ##### updatecompanyaccountmemberships Update company/account memberships - [Update company/account memberships](/user-guides/user-companies/rest/updatecompanyaccountmemberships.md): Update company/account memberships ##### updateusers Update users - [Update users](/user-guides/user-companies/rest/updateusers.md): Update users #### troubleshooting Troubleshooting - [Troubleshooting](/user-guides/user-companies/troubleshooting.md): Troubleshooting ## webhooks ### examples Webhook Examples - [Examples](/webhooks/examples.md): Webhook Examples ### troubleshooting Troubleshooting - [Troubleshooting webhooks](/webhooks/troubleshooting.md): Troubleshooting ### webhookFAQ FAQs - [FAQs](/webhooks/webhookFAQ.md): FAQs ### webhookintro Webhooks are a way for web applications to provide real-time notifications or data updates to other applications or services. It is a method of communication between two systems over the Internet. With webhooks, the AppDirect platform can send notifications to specific URLs when certain events occur in the system. Marketplace Managers can use the UI or API to configure webhooks. For example, you can configure to receive notifications when users are created, products are modified, or subscriptions are canceled. - [Webhooks](/webhooks/webhookintro.md): Webhooks are a way for web applications to provide real-time notifications or data updates to other applications or services. It is a method of communication between two systems over the Internet. With webhooks, the AppDirect platform can send notifications to specific URLs when certain events occur in the system. Marketplace Managers can use the UI or API to configure webhooks. For example, you can configure to receive notifications when users are created, products are modified, or subscriptions are canceled. #### webhookimportant Webhooks importance - [Why are webhooks important?](/webhooks/webhookintro/webhookimportant.md): Webhooks importance ### webookconfig Configure and manage webhooks - [Configure and manage webhooks](/webhooks/webookconfig.md): Configure and manage webhooks #### managewebhooks Manage webhooks - [Manage webhooks](/webhooks/webookconfig/managewebhooks.md): Manage webhooks #### pattern Webhook patterns - [Webhook patterns](/webhooks/webookconfig/pattern.md): Webhook patterns #### webhook-auth Webhook authentication - [Webhook authentication](/webhooks/webookconfig/webhook-auth.md): Webhook authentication ### working-with-webhooks Webhook reference - [Webhook reference](/webhooks/working-with-webhooks.md): Webhook reference #### actions Webhook list with UI actions - [Webhook list with UI actions](/webhooks/working-with-webhooks/actions.md): Webhook list with UI actions #### auditlogs You can use audit logs to track all interactions, such as creation, updates, and deletions, along with key details such as who made the change, when it occurred, and what was modified. - [Audit logs for webhooks](/webhooks/working-with-webhooks/auditlogs.md): You can use audit logs to track all interactions, such as creation, updates, and deletions, along with key details such as who made the change, when it occurred, and what was modified. #### payload Webhook notification payloads - [Webhook notification payloads](/webhooks/working-with-webhooks/payload.md): Webhook notification payloads ##### app-assignment The resource:url for an App Assignment webhook payload uses this basic - [App Assignment webhook payload](/webhooks/working-with-webhooks/payload/app-assignment.md): The resource:url for an App Assignment webhook payload uses this basic ##### catalog-product The resource:url for a Catalog Product webhook payload uses this basic - [Catalog Product webhook payload](/webhooks/working-with-webhooks/payload/catalog-product.md): The resource:url for a Catalog Product webhook payload uses this basic ##### company The resource - [Company webhook payload](/webhooks/working-with-webhooks/payload/company.md): The resource ##### invoice The resource - [Invoice webhook payload](/webhooks/working-with-webhooks/payload/invoice.md): The resource ##### membership The resource:url for a Membership webhook payload uses this basic - [Membership webhook payload](/webhooks/working-with-webhooks/payload/membership.md): The resource:url for a Membership webhook payload uses this basic ##### order The resource - [Order webhook payload](/webhooks/working-with-webhooks/payload/order.md): The resource ##### staging-product The resource:url for a Staging Product webhook payload uses this basic - [Staging Product webhook payload](/webhooks/working-with-webhooks/payload/staging-product.md): The resource:url for a Staging Product webhook payload uses this basic ##### subscription The resource:url for a Subscription webhook payload uses this basic - [Subscription webhook payload](/webhooks/working-with-webhooks/payload/subscription.md): The resource:url for a Subscription webhook payload uses this basic ##### user User webhook payload - [User webhook payload](/webhooks/working-with-webhooks/payload/user.md): User webhook payload #### resources-list Webhooks send notifications when AppDirect system events occur. Events - [Webhook resources, actions, and events](/webhooks/working-with-webhooks/resources-list.md): Webhooks send notifications when AppDirect system events occur. Events --- # Full Documentation Content [Skip to main content](#__docusaurus_skipToContent_fallback) [![My Site Logo](/img/logo_dark.svg)![My Site Logo](/img/logo_dark.svg)](/index.md) [**Developer Portal**](/index.md) User Guides ![](/img/BillingSubs_icon.svg) Billing and Subscriptions Manage subscriptions, payment method information and discounts using REST APIs. ![](/img/Product_icon.svg) Products Manage products in the catalog by defining product information, editions and pricing plans using GraphQL APIs. ![](/img/UserCompanyMgt_icon.svg) Users and Accounts Manage users, companies, and memberships in your marketplace including user roles and permissions. ![](/img/APIAuth_icon.svg) API Authentication Our APIs use an OAuth-authenticated interface that facilitates secure data access by partners and developers. [View all](/user-guides/.md) [ ](/user-guides/.md) [>](/user-guides/.md) APIs and References ![](/img/GraphQL_icon.svg) GraphQL API Reference Explore the reference documentation to learn more about the queries and mutations currently available within the AppDirect GraphQL API. ![](/img/REST_API_Ref_icon.svg) REST API Reference See examples of how to perform different tasks, like user and company management or billing and subscription management. ![](/img/AD_AI_Icon.svg) AI APIs Customize, integrate, and extend AIs for your organization and customers via industry-standard APIs ![](/img/swap-box-line_blue2.svg) LLMs.txt Provides LLM-friendly documentation to help AI tools like Cursor understand and work with the AppDirect Developer Portal content. [View all](/references-api/.md) [ ](/references-api/.md) [>](/references-api/.md) Developer Tools ![](/img/GraphQLExplorer_icon.svg) GraphQL Explorer Quickly write, validate, and test GraphQL queries for AppDirect APIs ![](/img/GraphQLSchema_icon.svg) GraphQL Schema Introspection Query the schema to discover available queries, mutations, subscriptions, types and fields in our GraphQL API. ![](/img/DemoGraphQLExplorer_icon.svg) Demo GraphQL API Explorer Check out the demo explorer tool by running queries using sample data. [View all](/user-guides/graphql-dev-tools/.md) [ ](/user-guides/graphql-dev-tools/.md) [>](/user-guides/graphql-dev-tools/.md) Storefront Theming ![](/img/GettingStarted_icon.svg) Getting Started Learn to modify elements of Plaza, our default theme, to customise components for storefront display including homepage and product profiles. ![](/img/AD_Learning_icon.svg) How to Guides Everything you need to know about customizing styles, meta tags, creating a header and footer, or localising, uploading and publishing your theme. ![](/img/DevToolkit_icon.svg) Storefront Toolkit Check out the demo explorer tool by running queries using sample data. [Overview](/storefront/.md) [ ](/storefront/.md) [>](/storefront/.md) [Webhooks](/webhooks/webhookintro/.md) Search [Sign Up](https://www.appdirect.com/store/signup) Search... * postCreate New AI * getGet AI Details * putApprove an AI * getGet all chats for the AI * postCreate a new chat session for the AI * getList data sources for the AI * postAdd an existing data source to the specified AI * postCreate a new API data source for the specified AI * postAdds a file upload data source for the specified AI. Max file size: 4.5Mb. * putRevoke AI approval * getGet a chat session * postMessage a chat session * delDelete a chat session * putDuplicate a chat session * putReset a chat session * getList all data sources * delDelete a Data Source * putRefresh a Data Source * postCreate a new group * putUpdate a group * delDelete a group * putLeave a group * getList AIs * getGet all chats for the User * getGet groups of the current user * getGet organization usage metrics by AI * getGet organization usage metrics * postCreate a chat completion [API docs by Redocly](https://redocly.com/redoc/) # Devs.ai API (1.0) Download OpenAPI specification:[Download](https://devs.ai/openapi-spec.json) ## [](#operation/createAI)Create New AI Creates a new AI specified by the given identifier. ##### Authorizations: *ApiKeyAuth* ##### Request Body schema: application/jsonrequired | | | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | srcrequired | stringUrl of the avatar image. | | namerequired | stringDisplay name of the AI | | introduction | stringText the AI uses as the greeting | | descriptionrequired | stringShort description of the AI | | instructionsrequired | stringInstructions that define the AI. | | seed | stringA sample conversation between a human and the AI. | | modelId | stringIdentifier of the LLM to use for this AI. | | visibility | string (AIVisibility)Enum: "PRIVATE" "GROUP" "ORGANIZATION" "ANYONE\_WITH\_LINK"Visibility level controlling who can access the AI | | listInOrgCatalog | booleanWhether to list this AI in the organization's catalog | | generateCitations | booleanWhether the AI should generate citations for its responses | | chatLogsVisible | booleanWhether chat logs should be visible to company admins. | | intermediateStepsVisible | booleanWhether intermediate reasoning steps should be visible during chat. | | options | object (AIModelOptions)Configuration options for the AI model's behavior | | profile | object (AIProfile) | ### Responses **200** Details of the specified AI. **403** Forbidden, the user is not authorized to perform this action. **404** AI not found with the given identifier. **500** Internal Server Error. post/api/v1/ai https\://devs.ai/api/v1/ai ### Request samples * Payload Content type application/json Copy Expand all Collapse all `{ "src": "string", "name": "string", "introduction": "string", "description": "string", "instructions": "string", "seed": "string", "modelId": "string", "visibility": "PRIVATE", "listInOrgCatalog": true, "generateCitations": true, "chatLogsVisible": true, "intermediateStepsVisible": true, "options": { "temperature": [ 0 ], "topP": [ 0 ], "topK": [ 0 ], "maxTokens": [ 0 ], "maxInputTokens": [ 0 ], "frequencyPenalty": [ 0 ], "presencePenalty": [ 0 ] }, "profile": { "headline": "string", "description": "string", "features": [ { "title": "string", "description": "string" } ], "showCharacter": true, "showTraining": true, "showPersonality": true } }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "name": "string", "description": "string", "src": "string", "profile": { "headline": "string", "description": "string", "features": [ { "title": "string", "description": "string" } ], "showCharacter": true, "showTraining": true, "showPersonality": true }, "userName": "string", "categoryId": "string", "messageCount": 0, "rating": 0, "ratingCount": 0 }` ## [](#operation/getAIDetails)Get AI Details Retrieves details of the AI specified by the given identifier. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | ------------ | ----------------------------------------------------------------- | | aiIdrequired | stringThe identifier of the AI whose details are to be retrieved. | ### Responses **200** Details of the specified AI. **403** Forbidden, the user is not authorized to perform this action. **404** AI not found with the given identifier. **500** Internal Server Error. get/api/v1/ai/{aiId} https\://devs.ai/api/v1/ai/{aiId} ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "name": "string", "description": "string", "src": "string", "profile": { "headline": "string", "description": "string", "features": [ { "title": "string", "description": "string" } ], "showCharacter": true, "showTraining": true, "showPersonality": true }, "userName": "string", "categoryId": "string", "messageCount": 0, "rating": 0, "ratingCount": 0 }` ## [](#operation/approveAI)Approve an AI Marks an AI as approved by the organization. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | ------------ | ---------------------------------------------- | | aiIdrequired | stringThe identifier of the AI to be approved. | ### Responses **200** AI successfully approved. **401** Missing authorization context. User must be authenticated. **403** Forbidden, the user is not authorized to perform this action. **404** AI not found with the given identifier. **500** Internal Server Error. put/api/v1/ai/{aiId}/approve https\://devs.ai/api/v1/ai/{aiId}/approve ## [](#operation/getAIChats)Get all chats for the AI Retrieves a list of all chat sessions associated with the given AI identifier. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | ------------ | --------------------------------------------------------------- | | aiIdrequired | stringThe identifier of the AI whose chats are to be retrieved. | ### Responses **200** A list of chat sessions associated with the AI. **404** AI not found with the given identifier. **500** Internal Server Error. get/api/v1/ai/{aiId}/chats https\://devs.ai/api/v1/ai/{aiId}/chats ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "data": [ { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "name": "string", "userId": "string", "pinPosition": 0, "ai": { "id": "string", "name": "string", "src": "string", "description": "string", "userId": "string", "userName": "string" } } ] }` ## [](#operation/createAIChat)Create a new chat session for the AI Creates a new chat session associated with the given AI identifier and returns the created chat session data. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | ------------ | ------------------------------------------------------------------------------- | | aiIdrequired | stringThe identifier of the AI with which the chat session is to be associated. | ### Responses **201** Chat session successfully created. **404** Not found, when the specified AI ID does not exist or is not visible to the current user. **500** Internal Server Error. post/api/v1/ai/{aiId}/chats https\://devs.ai/api/v1/ai/{aiId}/chats ### Response samples * 201 Content type application/json Copy Expand all Collapse all `{ "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "name": "string", "userId": "string", "pinPosition": 0, "ai": { "id": "string", "name": "string", "src": "string", "description": "string", "userId": "string", "userName": "string" } }` ## [](#operation/listAIDataSources)List data sources for the AI Retrieves a list of data sources associated with the given AI identifier. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | ------------ | ---------------------------------------------------------------------- | | aiIdrequired | stringThe identifier of the AI whose data sources are to be retrieved. | ### Responses **200** A list of data sources associated with the AI. **404** AI not found with the given identifier. **500** Internal Server Error. get/api/v1/ai/{aiId}/data-sources https\://devs.ai/api/v1/ai/{aiId}/data-sources ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "data": [ { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "lastIndexedAt": "2019-08-24T14:15:22Z", "name": "string", "type": "API", "refreshPeriod": "NEVER", "indexStatus": "INITIALIZED", "indexPercentage": "string" } ] }` ## [](#operation/addDataSourceToAI)Add an existing data source to the specified AI Associates an existing data source with the specified AI. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | ------------ | ------------------------------------------------------------------------------- | | aiIdrequired | stringThe unique identifier for the AI to which the data source is to be added. | ##### Request Body schema: application/jsonrequired | | | | -------------------- | -------------------------------------------------------------------- | | dataSourceIdrequired | stringThe unique identifier of the existing data source to be added. | ### Responses **200** Data source successfully added to the AI. **400** Bad request, malformed request syntax or invalid request message framing. **403** Forbidden, the user is not authorized to perform this action. **404** Not Found, either of the specified AI or data source are not found. **500** Internal Server Error. post/api/v1/ai/{aiId}/data-sources https\://devs.ai/api/v1/ai/{aiId}/data-sources ### Request samples * Payload Content type application/json Copy `{ "dataSourceId": "string" }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "aiId": "string", "dataSource": { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "lastIndexedAt": "2019-08-24T14:15:22Z", "name": "string", "type": "API", "refreshPeriod": "NEVER", "indexStatus": "INITIALIZED", "indexPercentage": "string" } }` ## [](#operation/createApiDataSource)Create a new API data source for the specified AI Adds a new API data source with a specified name and JSON payload for the given AI. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | ------------ | --------------------------------------- | | aiIdrequired | stringThe unique identifier for the AI. | ##### Request Body schema: application/jsonrequired | | | | ------------ | ----------------------------------------------------------------- | | namerequired | stringName of the data source. | | datarequired | objectThe JSON payload to be used as the data source's knowledge. | ### Responses **201** Data source successfully created. **400** Bad request **404** AI not found **500** Internal Server Error. post/api/v1/ai/{aiId}/data-sources/api https\://devs.ai/api/v1/ai/{aiId}/data-sources/api ### Request samples * Payload Content type application/json Copy Expand all Collapse all `{ "name": "string", "data": { } }` ### Response samples * 201 * 400 * 404 Content type application/json Copy `{ "aiId": "string", "dataSourceId": "string" }` ## [](#/paths/~1api~1v1~1ai~1{aiId}~1data-sources~1file/post)Adds a file upload data source for the specified AI. Max file size: 4.5Mb. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | ------------ | --------------------------------------- | | aiIdrequired | stringThe unique identifier for the AI. | ##### Request Body schema: multipart/form-data | | | | ---- | ---------------------------------------------- | | file | string<binary> | ### Responses **200** File uploaded successfully **400** Bad request **404** AI not found post/api/v1/ai/{aiId}/data-sources/file https\://devs.ai/api/v1/ai/{aiId}/data-sources/file ### Response samples * 200 * 400 * 404 Content type application/json Copy `{ "aiId": "string", "dataSourceId": "string" }` ## [](#operation/revokeAIApproval)Revoke AI approval Revokes the organization approval for an AI. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | ------------ | --------------------------------------------------------------- | | aiIdrequired | stringThe identifier of the AI whose approval is to be revoked. | ### Responses **200** AI approval successfully revoked. **401** Missing authorization context. User must be authenticated. **403** Forbidden, the user is not authorized to perform this action. **404** AI not found with the given identifier. **500** Internal Server Error. put/api/v1/ai/{aiId}/revoke https\://devs.ai/api/v1/ai/{aiId}/revoke ## [](#operation/getChat)Get a chat session Retrieves the chat session with the specified ID. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | -------------- | ------------------------------------------------------------ | | chatIdrequired | stringThe unique identifier of the chat session to retrieve. | ### Responses **200** Chat session successfully retrieved. **403** Forbidden, the user is not authorized to perform this action. **404** Not found, when the specified chat ID does not exist. **500** Internal Server Error. get/api/v1/chats/{chatId} https\://devs.ai/api/v1/chats/{chatId} ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "name": "string", "userId": "string", "pinPosition": 0, "ai": { "id": "string", "name": "string", "src": "string", "description": "string", "userId": "string", "userName": "string" }, "messages": [ { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "content": "string", "role": "string" } ] }` ## [](#operation/postChatSession)Message a chat session Send a message to a chat session with an AI. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | -------------- | ------------------------------------------------ | | chatIdrequired | stringThe unique identifier of the chat session. | ##### Request Body schema: application/jsonrequired | | | | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | daterequired | string<date-time>The date and time of the chat from the perspective of the user. This may be different from the server time for the AI. | | promptrequired | stringMessage to send to the AI. | ### Responses **200** SSE stream of chat events **400** Bad request, when the request body does not contain the required fields or contains invalid data. **403** Forbidden, the user is not authorized to perform this action. **404** Not found, when the specified chat ID does not exist. **500** Internal Server Error. post/api/v1/chats/{chatId} https\://devs.ai/api/v1/chats/{chatId} ### Request samples * Payload Content type application/json Copy `{ "date": "2019-08-24T14:15:22Z", "prompt": "string" }` ## [](#operation/deleteChat)Delete a chat session Deletes the chat session with the specified ID. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | -------------- | ---------------------------------------------------------- | | chatIdrequired | stringThe unique identifier of the chat session to delete. | ### Responses **204** Chat session successfully deleted, no content to return. **403** Forbidden, the user is not authorized to perform this action. **404** Not Found, the specified chat ID does not exist. **500** Internal Server Error. delete/api/v1/chats/{chatId} https\://devs.ai/api/v1/chats/{chatId} ## [](#operation/duplicateChat)Duplicate a chat session Creates a duplicate of the chat session with the specified ID. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | -------------- | ------------------------------------------------------------- | | chatIdrequired | stringThe unique identifier of the chat session to duplicate. | ### Responses **200** Chat session successfully duplicated. **400** Bad request, when the request contains invalid data. **404** Not found, when the specified chat ID does not exist. **500** Internal Server Error. put/api/v1/chats/{chatId}/duplicate https\://devs.ai/api/v1/chats/{chatId}/duplicate ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "name": "string", "userId": "string", "pinPosition": 0, "ai": { "id": "string", "name": "string", "src": "string", "description": "string", "userId": "string", "userName": "string" }, "messages": [ { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "content": "string", "role": "string" } ] }` ## [](#operation/resetChat)Reset a chat session Resets the chat session with the specified ID, clearing its current state or content. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | -------------- | --------------------------------------------------------- | | chatIdrequired | stringThe unique identifier of the chat session to reset. | ### Responses **200** Chat session successfully reset. **404** Not found, when the specified chat ID does not exist. **500** Internal Server Error. put/api/v1/chats/{chatId}/reset https\://devs.ai/api/v1/chats/{chatId}/reset ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "name": "string", "userId": "string", "pinPosition": 0, "ai": { "id": "string", "name": "string", "src": "string", "description": "string", "userId": "string", "userName": "string" }, "messages": [ { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "content": "string", "role": "string" } ] }` ## [](#operation/listDataSources)List all data sources Retrieves a list of data sources associated which the user has access to. ##### Authorizations: *ApiKeyAuth* ##### query Parameters | | | | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | name | stringThe name of the data source. | | type | stringEnum: "WEB\_URL" "GOOGLE\_DRIVE" "ONEDRIVE" "FILE\_UPLOAD" "API"The type of the data source. One of: WEB\_URL, GOOGLE\_DRIVE, ONEDRIVE, FILE\_UPLOAD, API. | | orderBy | string^\[+-]\(createdAt\|lastIndexedAt\|usageCount)$Order by field and direction. Prefix field name with '+' for ascending or '-' for descending order. Allowed fields: createdAt, lastIndexedAt, usageCount. | ### Responses **200** A list of all data sources which the user has access to. **500** Internal Server Error. get/api/v1/data-sources https\://devs.ai/api/v1/data-sources ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "data": [ { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "lastIndexedAt": "2019-08-24T14:15:22Z", "name": "string", "type": "API", "refreshPeriod": "NEVER", "indexStatus": "INITIALIZED", "indexPercentage": "string" } ] }` ## [](#operation/deleteDataSource)Delete a Data Source Deletes a specific data source associated with the given AI identifier. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | -------------------- | ------------------------------------------------------------- | | dataSourceIdrequired | stringThe unique identifier of the data source to be deleted. | ### Responses **204** Data source successfully deleted, no content to return. **403** Forbidden, the user is not authorized to perform this action. **404** Not Found, the specified data source ID does not exist. delete/api/v1/data-sources/{dataSourceId} https\://devs.ai/api/v1/data-sources/{dataSourceId} ## [](#operation/refreshDataSource)Refresh a Data Source This endpoint refreshes the specified data source. ##### Authorizations: *ApiKeyAuth* ##### path Parameters | | | | -------------------- | --------------------------------------------------------------- | | dataSourceIdrequired | stringThe unique identifier of the data source to be refreshed. | ##### query Parameters | | | | ------------ | ------------------------------------------------------------------------------------------------ | | forceRefresh | booleanIndicates if the data source should be refreshed even if the content has not been updated | ### Responses **202** Request has been accepted for processing. **401** Missing authorization context. User must be authenticated. **403** Forbidden, the user is not authorized to perform this action. **404** Data source not found with the specified ID. put/api/v1/data-sources/{dataSourceId}/refresh https\://devs.ai/api/v1/data-sources/{dataSourceId}/refresh ## [](#operation/createGroup)Create a new group Creates a new group with the specified details. ##### Request Body schema: application/jsonrequired | | | | -------------------- | ------------------------------------------------------------------------------------------------------------------------ | | namerequired | stringName of the group. | | availabilityrequired | string (GroupAvailability)Enum: "EVERYONE" "RESTRICTED"Availability status of the group. | | memberEmailsrequired | stringA comma-separated list of emails of users who should be added to the group. | ### Responses **200** Group successfully created. **401** Missing authorization context. User must be authenticated. **403** Forbidden, the user is not authorized to perform this action. **500** Internal Server Error. post/api/v1/groups https\://devs.ai/api/v1/groups ### Request samples * Payload Content type application/json Copy `{ "name": "string", "availability": "EVERYONE", "memberEmails": "string" }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "orgId": "string", "ownerUserId": "string", "name": "string", "availability": "EVERYONE", "users": [ { "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "userId": "string", "email": "string" } ] }` ## [](#operation/updateGroup)Update a group Updates the details of a specific group and manages its member list. ##### path Parameters | | | | --------------- | --------------------------------------------------- | | groupIdrequired | stringThe unique identifier of the group to update. | ##### Request Body schema: application/jsonrequired | | | | -------------------- | ------------------------------------------------------------------------------------------------------------------------ | | name | stringName of the group. | | availability | string (GroupAvailability)Enum: "EVERYONE" "RESTRICTED"Availability status of the group. | | memberEmailsToAdd | stringA comma-separated list of emails of users to be added to the group. | | memberEmailsToRemove | Array of stringsA comma-separated list of emails of users to be removed from the group. | ### Responses **200** Group details updated successfully. **400** Bad request, when the input data is invalid. **403** Forbidden, the user is not authorized to perform this action. **404** Not found, when the specified group ID does not exist. **500** Internal Server Error. put/api/v1/groups/{groupId} https\://devs.ai/api/v1/groups/{groupId} ### Request samples * Payload Content type application/json Copy Expand all Collapse all `{ "name": "string", "availability": "EVERYONE", "memberEmailsToAdd": "string", "memberEmailsToRemove": [ "string" ] }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "orgId": "string", "ownerUserId": "string", "name": "string", "availability": "EVERYONE", "users": [ { "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "userId": "string", "email": "string" } ] }` ## [](#operation/deleteGroup)Delete a group Deletes the group with the specified identifier. ##### path Parameters | | | | --------------- | --------------------------------------------------- | | groupIdrequired | stringThe unique identifier of the group to delete. | ### Responses **204** Group successfully deleted, no content to return. **400** Bad request, when the request is malformed. **403** Forbidden, the user is not authorized to perform this action. **404** Not found, when the specified group ID does not exist. **500** Internal Server Error. delete/api/v1/groups/{groupId} https\://devs.ai/api/v1/groups/{groupId} ## [](#operation/leaveGroup)Leave a group Allows the current user to leave the group specified by the groupId. ##### path Parameters | | | | --------------- | -------------------------------------------------- | | groupIdrequired | stringThe unique identifier of the group to leave. | ### Responses **204** Successfully left the group, no content to return. **400** Bad request, when the request is malformed. **403** Forbidden, the user is not authorized to perform this action. **404** Not found, when the specified group ID does not exist. **500** Internal Server Error. put/api/v1/groups/{groupId}/leave https\://devs.ai/api/v1/groups/{groupId}/leave ## [](#/paths/~1api~1v1~1me~1ai/get)List AIs ##### query Parameters | | | | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | scope | string (ListAIsRequestScope)Enum: "PRIVATE" "OWNED" "GROUP" "SHARED" "ORGANIZATION" "PUBLIC" "ALL"The scope to filter results by | | groupId | stringThe id of a group to filter results by | | categoryId | stringThe id of a category to filter results by | | approvedByOrg | booleanFilter results by whether the AI has been approved by the organization. | | search | stringSearch term | ### Responses **200** Successful operation get/api/v1/me/ai https\://devs.ai/api/v1/me/ai ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "data": [ { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "name": "string", "description": "string", "src": "string", "profile": { "headline": "string", "description": "string", "features": [ { "title": "string", "description": "string" } ], "showCharacter": true, "showTraining": true, "showPersonality": true }, "userName": "string", "categoryId": "string", "messageCount": 0, "rating": 0, "ratingCount": 0 } ] }` ## [](#operation/getChats)Get all chats for the User Retrieves a list of all chat sessions associated with the current user ##### Authorizations: *ApiKeyAuth* ### Responses **200** A list of chat sessions associated with the AI. **404** AI not found with the given identifier. **500** Internal Server Error. get/api/v1/me/chats https\://devs.ai/api/v1/me/chats ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "data": [ { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "name": "string", "userId": "string", "pinPosition": 0, "ai": { "id": "string", "name": "string", "src": "string", "description": "string", "userId": "string", "userName": "string" } } ] }` ## [](#operation/getUserGroups)Get groups of the current user Retrieves a list of groups associated with the current user. ### Responses **200** A list of groups associated with the current user. **401** Missing authorization context. User must be authenticated. **403** Forbidden, the user is not authorized to perform this action. **500** Internal Server Error. get/api/v1/me/groups https\://devs.ai/api/v1/me/groups ### Response samples * 200 Content type application/json Copy Expand all Collapse all `[ { "id": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "orgId": "string", "ownerUserId": "string", "name": "string", "availability": "EVERYONE" } ]` ## [](#operation/getOrgUsageByAI)Get organization usage metrics by AI Returns the usage metrics of the organization broken down by AI. ### Responses **200** Success **404** Organization not found **500** Internal Server Error get/api/v1/usage/ai https\://devs.ai/api/v1/usage/ai ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "orgUsage": { "orgId": "string", "dataTokensUsed": 0, "dataUsageTokenLimit": 0, "apiTokensUsed": 0, "apiUsageTokenLimit": 0 }, "aiUsages": [ { "aiId": "string", "aiDataTokensUsed": 0, "aiApiTokensUsed": 0 } ] }` ## [](#operation/getOrgUsage)Get organization usage metrics Returns usage metrics for the organization. ### Responses **200** Success **401** Missing authorization context. User must be authenticated. **403** Forbidden, the user is not authorized to perform this action. **500** Internal Server Error get/api/v1/usage/org https\://devs.ai/api/v1/usage/org ### Response samples * 200 Content type application/json Copy `{ "orgId": "string", "dataTokensUsed": 0, "dataUsageTokenLimit": 0, "apiTokensUsed": 0, "apiUsageTokenLimit": 0 }` ## [](#operation/createChatCompletion)Create a chat completion Creates a completion for the chat message ##### Authorizations: *ApiKeyAuth* ##### Request Body schema: application/jsonrequired | | | | ---------------- | ------------------------------------------------------------------------- | | messagesrequired | Array of objectsA list of messages comprising the conversation so far | | modelrequired | stringID of the Devs.ai AI or the LLM model to use for completion | | stream | booleanDefault:falseWhether to stream the response or not | | flowOverride | objectOptional flow override settings | | tools | Array of objectsOptional list of tools to use | ### Responses **200** Successful response **400** Bad request - Invalid input (e.g. missing messages, invalid model) **401** Unauthorized - Missing or invalid authentication **403** Forbidden - User does not have permission to access this resource **500** Internal server error post/api/v1/chats/completions https\://devs.ai/api/v1/chats/completions ### Request samples * Payload Content type application/json Copy Expand all Collapse all `{ "messages": [ { "role": "system", "content": "string" } ], "model": "string", "stream": false, "flowOverride": { }, "tools": [ { } ] }` ### Response samples * 200 * 400 Content type application/jsonapplication/json Copy Expand all Collapse all `{ "choices": [ { "index": 0, "message": { "role": "assistant", "content": "string" }, "finish_reason": "stop" } ], "chatId": "string" }` [![AppDirect footer logo](/img/AppDirect-Logo_White.svg)](https://www.appdirect.com) * © 2025 AppDirect Inc. * [Privacy Notice](https://www.appdirect.com/privacy-notice) * [Legal](https://www.appdirect.com/legal) * [Security](https://www.appdirect.com/products/support-and-services/platform-security) - [](https://www.linkedin.com/company/appdirect) - [](https://twitter.com/AppDirect) - [](https://facebook.com/AppDirect) --- # Markdown page example You don't need React to write simple standalone pages. --- [Skip to main content](#__docusaurus_skipToContent_fallback) [![My Site Logo](/img/logo_dark.svg)![My Site Logo](/img/logo_dark.svg)](/index.md) [**Developer Portal**](/index.md) User Guides ![](/img/BillingSubs_icon.svg) Billing and Subscriptions Manage subscriptions, payment method information and discounts using REST APIs. ![](/img/Product_icon.svg) Products Manage products in the catalog by defining product information, editions and pricing plans using GraphQL APIs. ![](/img/UserCompanyMgt_icon.svg) Users and Accounts Manage users, companies, and memberships in your marketplace including user roles and permissions. ![](/img/APIAuth_icon.svg) API Authentication Our APIs use an OAuth-authenticated interface that facilitates secure data access by partners and developers. [View all](/user-guides/.md) [ ](/user-guides/.md) [>](/user-guides/.md) APIs and References ![](/img/GraphQL_icon.svg) GraphQL API Reference Explore the reference documentation to learn more about the queries and mutations currently available within the AppDirect GraphQL API. ![](/img/REST_API_Ref_icon.svg) REST API Reference See examples of how to perform different tasks, like user and company management or billing and subscription management. ![](/img/AD_AI_Icon.svg) AI APIs Customize, integrate, and extend AIs for your organization and customers via industry-standard APIs ![](/img/swap-box-line_blue2.svg) LLMs.txt Provides LLM-friendly documentation to help AI tools like Cursor understand and work with the AppDirect Developer Portal content. [View all](/references-api/.md) [ ](/references-api/.md) [>](/references-api/.md) Developer Tools ![](/img/GraphQLExplorer_icon.svg) GraphQL Explorer Quickly write, validate, and test GraphQL queries for AppDirect APIs ![](/img/GraphQLSchema_icon.svg) GraphQL Schema Introspection Query the schema to discover available queries, mutations, subscriptions, types and fields in our GraphQL API. ![](/img/DemoGraphQLExplorer_icon.svg) Demo GraphQL API Explorer Check out the demo explorer tool by running queries using sample data. [View all](/user-guides/graphql-dev-tools/.md) [ ](/user-guides/graphql-dev-tools/.md) [>](/user-guides/graphql-dev-tools/.md) Storefront Theming ![](/img/GettingStarted_icon.svg) Getting Started Learn to modify elements of Plaza, our default theme, to customise components for storefront display including homepage and product profiles. ![](/img/AD_Learning_icon.svg) How to Guides Everything you need to know about customizing styles, meta tags, creating a header and footer, or localising, uploading and publishing your theme. ![](/img/DevToolkit_icon.svg) Storefront Toolkit Check out the demo explorer tool by running queries using sample data. [Overview](/storefront/.md) [ ](/storefront/.md) [>](/storefront/.md) [Webhooks](/webhooks/webhookintro/.md) Search [Sign Up](https://www.appdirect.com/store/signup) Search... * AppDirect API Reference * Bundles * getList all bundles * getRetrieve a bundle * getRetrieve a bundle status * Checkout Items * postGet item details * Companies * getRead activities * getList all companies * postCreate new company * getRead a company * putUpdate company * patchPatch company * putUpdate company picture * Companies (Reseller) * postCreate company * getList companies * getCompany details * postCreate user * getList users * getUser details * Company Association * postCreate company association * getList company associations * delRemove company association * Company Memberships * getRead company membership * putUpdate company membership * delDelete company membership * patchEnable/Disable company membership * postCreate company membership (Add User) * getList company memberships * postCreate company membership * patchUpdate company membership roles (bulk) * getRead user checklist * postInvite a managed user * postRequest to purchase an application * getList application assignments for company membership * getRead assignable roles for company membership * getRead company assignable roles * getList groups for company membership * Content Events * postPublish content events * Currency Exchange Rate * getRead all Currency Exchange Rates * postCreate new Currency Exchange Rate * getRead a Currency Exchange Rate * patchDeactivate a Currency Exchange Rate * Customer Notifications * getRetrieve an SMS template by type * getList notification templates * postCreate or update a common email template element * getList all notification parameters for a notification type * getRetrieve an email template by type * postCreate or update an sms template * postCreate or update an email template * getRetrieve common email element by type * getList notification common elements * DataUploader * postUpdate product catalog * postCreate product catalog * postPublish product catalog * Default Notification Template Api * getRead default notification templates available for the current channel. * postCreate or update a default common email template element. * getRead default common email element by type. * postCreate or update default email template * getRead default email template by type * Discounts * getList all discounts * postCreate discounts * putUpdate discounts * getRetrieve discounts * delDelete discounts * Domains * getList company domains * getRead company domain * getList verified company domains * Editions * getRetrieve an edition * Events * getList all events * getRetrieve an event * Groups * getList user groups * postCreate user group * putUpdate user group * getRead user group * delDelete user group * getList user group members * postCreate batch group memberships change requests. * putAdd user to group * getRead user from group * delDelete user from group * Invitations * delRevoke user invitation * getList company invitations * postInvite users to company * postInvite users to company (CSV) * postAccept user invitation * Invoices * getList all invoices for a user * getList all invoices for a company * getList All Invoice Payments * postPay an Invoice * getList All Invoices * getRetrieve an Invoice * patchPatch method to partially update an invoice * Lead v1 * getList leads * postCreate a lead * getRead a lead * patchUpdate a lead * Leads v2 * getList leads * postCreate lead * getGet lead details * delDiscard lead * patchUpdate lead * postAssign lead * postAssociate lead * getList activities * postConvert lead * postRequest conversion approval * postApprove conversion request * Marketplace Product Settings * getRetrieve active settings for a given marketplace * getRetrieve product settings on a given marketplace * putUpdate product settings on a given marketplace * Metered Usage * postBilling Usage V1 * postStatus verification * postBilling Usage V2 * getFetch usage processing status * MyApps * getList applications * putUpdate MyApps order * getRead application with completed assignment * getRead application with pending assignment * Navigation * getList all product tags * Opportunities * postCreate opportunity * getList opportunities * delRemove opportunities * getGet opportunity details * patchUpdate opportunity * postAdd items * getList items * delRemove item * putEdit item * postFinalize opportunity * postRequest opportunity review * getGet opportunity summary * getGet opportunity pricing plan costs * getGet opportunity pricing plan costs without specifying an opportunity * patchChange opportunity owner * getRetrieve validation results * postRequired field definitions * postApply discount * postRemove discount * putUpdate required fields * getGet shipping address * postCreate or replace shipping address * postClone opportunity * Payment Instruments * getList all payment instruments for a user * postCreate a payment instrument * putUpdate a payment instrument * getRetrieve the default payment instrument * getRetrieve a payment instrument * delDelete a payment instrument * Payment Methods * postTokenize payment methods * getList payment methods for a user * postCreate payment methods using a token OR by providing all of the payment method data * delDelete payment methods * getList default payment methods * postSet default payment methods * getReturns all supported Payment Method Types * Payment Methods (Reseller) * postCreate payment method * getList payment methods * delRemove payment methods * Payment Plans * getList payment plans * getRead payment plan by product edition * getRead payment plan * Payments v1 * getList all payments for a company * getList all payments for a user * getList all payments * getRetrieve a payment * getList all payment invoices * Payments v2 * getRetrieve all transfer platform configurations * postCreate transfer platform configurations * getRetrieve transfer platform configurations * putUpdate transfer platform configurations * delDelete transfer platform configurations * postCreate transfer methods * getRetrieve transfer methods * getRetrieves Transfer Method by ID * delDelete transfer methods * Product Answers * getList all answers * postCreate an answer * getRetrieve an answer * putUpdate an answer * delDelete an answer * Product Comments * postCreate a comment * getList all comments * getRetrieve a comment * putUpdate a comment * delDelete a comment * Product Context * getRetrieve a product context for the current user * getRetrieve a product context for a supplied user and a company they belong to * Product Management API * postDelete image from product * postUpload and link image to product * postUpload and link PDF file to product * delDelete file from product * Product Questions * getRetrieve a question * putUpdate a question * delDelete a question * getList all questions * Product Reviews * postCreate a review * getList all reviews * getRetrieve a review * putUpdate a review This call updates an existing product review on your marketplace. * delDelete a review This call deletes a product review from your marketplace. * Products * getRetrieve buyable products * getRetrieve a product * getList all products by vendor * getRetrieve a product status * getList all product recommendations * getList all products * getRead staging catalog * Purchase Orders * getList all purchase orders for a company * getList all purchase orders for a user * getList all purchase order payments * getList all purchase orders * getRetrieve a purchase order * putUpdate purchase order configuration details * getList all purchase order invoices * Purchase Orders (Reseller) * getList orders * Quote Versions * postCreate quote version * getA list of quote versions * postExecute action on a quote version * getGet a quote version * Reconciliation * getRetrieve ledger lines * Reconciliation (Reseller) * getList transfers * getRetrieve transfer details * getList transfer ledger lines * Reports v1 * getList all reports * getRetrieve a report * delDelete report * Reports V2 * getList all reports * getDownload a report file * Reseller Catalog * getList sellable products * getEdition details * Search * getSearch content * Segment Folders * postCreate segment folders * getRead segment folders * putUpdate segment folders * delDelete segment folder * delDelete segments from segment folders * getRead segments * postCreate manual segment * putUpdate manual segments * postCreate or remove segment-company associations * getRead segment companies * putUpdate dynamic segments * getRead filter parameters * postTest dynamic segments * getRead dynamic segments * postCreate dynamic segments * Settings * getList channel settings * patchUpdate channel settings * ShoppingCart * getList shopping carts * postCreate shopping carts * getRetrieve shopping cart * delDelete shopping carts * patchUpdate shopping carts * postFinalize shopping carts * postCreate and finalize shopping carts * getRetrieve cart associations * getGet cart pre-authorization * getRetrieve shopping cart items * postAdd items to cart * getRetrieve cart item * putUpdate shopping cart item * delRemove cart item * postDelete cart items * postPreview non-persisted carts * getPreview shopping carts * postRetrieve pricing summary (non-persisted shopping cart) * getRetrieve pricing summary * postValidate non-persisted shopping carts * postValidate persisted shopping carts * getRead validation summary for persisted shopping carts * delRemove cart discounts * delDelete shopping cart fees * postCreate cart fees * putSet accredited agents * delRemove accredited agents * postSend locked cart notifications * Subscription Assignments * getRead application assignment for user and subscription * postCreate application assignment * delDelete application assignment * getList application assignments for subscription * headRead application assignment count * Subscription Assignments (Reseller) * postAssign product * getList subscription assignments * delUnassign product * Subscriptions * postSubscription reactivation request * getRead subscription SAML Certificate * getRead SAML metadata for subscription * getList all subscriptions for a company * putChange subscription details * getList all subscriptions for a user * postCreate a subscription * putPreview changed subscription details * postPreview create a subscription * getList all purchase orders for a subscription * putUpdate an add-on instance * delDelete an add-on instance * getList all subscriptions * getList all payments for a subscription * getRetrieve a subscription * delRequest cancellation * patchUpdate subscriptions * getRead addon instances for a subscription * postCreate an add-on instance * getList all invoices for a subscription * postPreview creation of an addon instance for a subscription * putPreview change of an addon instance for a subscription * getPreview subscription cancellation * Subscriptions (Reseller) * postCreate subscription * getList subscriptions * getSubscription details * putUpdate subscription * delCancel subscription * Sync * postCreate developer account * postExpire developer account * postAssign user * postUnassign user * getGet user assignment * User Accounts * postCreate user connections * delDisconnect user accounts * Users * getList all users * patchActivate a user * getRead a user * putUpdate a user * patchPatch a user * getRead reseller user company associations * getRead user memberships * putUpdate last used company membership * putUpdate user picture * getRead user profile * putUpdate user profile * patchPatch user profile * putSet a temporary password * Webhooks * getList all webhooks * postCreate a webhook * getRetrieve a webhook * putUpdate a webhook * delDelete a webhook [API docs by Redocly](https://redocly.com/redoc/) # AppDirect API Reference The AppDirect API Reference lists various requests that you can use to manage and interact with your marketplace.

Use the following URL format to send API calls:
[https://{marketplaceURL}/api/{endpoint}]()

For example:
[https://myMarketplace.com/api/marketplace/v1/bundles]()
***
# Companies (v296.0-SNAPSHOT) Download OpenAPI specification:[Download](https://developer.appdirect.com/redocusaurus/plugin-redoc-0.yaml) License: [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) The Companies API allows developers to manage marketplace companies and their user memberships. # [](#tag/AppdirectApiReference)AppDirect Api Reference # [](#tag/Bundle)Bundles ## [](#tag/Bundle/operation/resource_Bundle_readBundles_GET)List all bundles This call lists all bundles on the marketplace. ### Responses **200** List of product bundle. get/marketplace/v1/bundles https\://marketplace.appdirect.com/api/marketplace/v1/bundles https\://virtserver.swaggerhub.com/marketplace/v1/bundles ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/bundles ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Bundle/operation/resource_Bundle_readBundle_GET)Retrieve a bundle This call returns all details about a specific bundle. ##### path Parameters | | | | ---------------- | ----------------------- | | bundleIdrequired | numberBundle product id | ### Responses **200** Bundle application read. **404** Bundle application not found. get/marketplace/v1/bundles/{bundleId} https\://marketplace.appdirect.com/api/marketplace/v1/bundles/{bundleId} https\://virtserver.swaggerhub.com/marketplace/v1/bundles/{bundleId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/bundles/%7BbundleId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Bundle/operation/resource_Bundle_readBundleStatus_GET)Retrieve a bundle status This call returns the current state of the bundle. ##### path Parameters | | | | ---------------- | ----------------------- | | bundleIdrequired | numberBundle product id | ### Responses **200** Bundle application status read. **404** Bundle application not found. get/marketplace/v1/bundles/{bundleId}/status https\://marketplace.appdirect.com/api/marketplace/v1/bundles/{bundleId}/status https\://virtserver.swaggerhub.com/marketplace/v1/bundles/{bundleId}/status ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/bundles/%7BbundleId%7D/status ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample # [](#tag/checkoutItemDetails)Checkout Items Retrieves product details such as branding, pricing, and so on. ## [](#tag/checkoutItemDetails/operation/getCheckoutItemDetails)Get item details Retrieves product details such as branding, pricing, and so on. ##### Request Body schema: application/jsonrequired | | | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ownerUserIdrequired | stringThe owner user ID. The owner owns the product after the purchase is complete. | | ownerCompanyIdrequired | stringThe owner's company's ID. | | buyerUserIdrequired | stringThe buyer user ID. The buyer is the person who is making the purchase. In assisted sales or reseller scenarios, the buyer can be different than the owner. | | buyerCompanyIdrequired | stringThe buyer's company's ID. In assisted sales or reseller scenarios, the buyer's company can be different than the owner's company. | | currencyrequired | string= 3 charactersThree-letter code, such as USD, that determines the currency in which to display item pricing details. | | productIdsrequired | Array of stringsList of product IDs to retrieve details for. | | pricingPlanIds | Array of stringsList of pricing plan IDs to retrieve details for. | | bundleIds | Array of stringsList of bundle IDs to retrieve details for. (Currently not supported) | | subscriptionIds | Array of stringsList of subscription IDs to retrieve details for. (Currently not supported) | ### Responses **200** Item details retrieved successfully post/api/v3/checkout/items https\://marketplace.appdirect.com/api/api/v3/checkout/items https\://virtserver.swaggerhub.com/api/v3/checkout/items ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "ownerUserId": "19d7343b-b8ab-464a-a893-8b107d77137d", "ownerCompanyId": "b0410709-8333-43e2-84d6-3228f6b9998b", "buyerUserId": "55144410-a14a-43a1-9e0a-062c6cf31770", "buyerCompanyId": "6e5a0af2-e6be-4a86-a1b0-ffabcc2c6324", "currency": "USD", "productIds": [ "100", "200" ], "pricingPlanIds": [ "a12bcf2e-d27e-4808-aae0-6099cc828664", "3e0a22d3-dafb-4b3d-a487-7f4e7a94b32a" ], "bundleIds": [ "300", "400" ], "subscriptionIds": [ "915a6558-5a1b-446a-8ec6-334cc60e3d37", "8569269e-4c7f-4238-807c-513c718be135" ] }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "098357e5-7a88-45fe-82d3-843bfd6bcbd1", "type": "PRODUCT", "branding": { "name": "Sample Application", "vendor": "AppDirect", "desc": "Sample Application description", "iconUrl": "https://appdirect.cloudfront.net/app_resources/1111/thumbs_64/img1111.png", "href": "https://marketplace.appdirect.com/api/marketplace/v1/products/1111", "storefrontUrl": "https://marketplace.appdirect.com/apps/1111" }, "stacked": false, "editions": [ { "id": "45b79e06-1ac6-11e5-90d8-ca7e16f380a7", "freeTrialTerms": { "freeTrialDuration": 1, "freeTrialDurationPeriod": "MONTH", "freeTrialGracePeriod": 10 }, "name": "Sample Edition", "revenueModel": "RECURRING", "pricingPlans": [ { "id": "b794c2a1-69a7-40bc-9bf7-75a2f945a5fc", "currency": "USD", "pricingPeriod": "MONTHLY", "pricingSources": [ { "source": "BASE_CATALOG", "pricingDefinitions": [ { "costTypeCategory": "RECURRING", "costType": "RECURRING_PER_UNIT", "pricingStrategy": "UNIT", "unit": "USER", "priceRanges": [ { "min": 0, "max": 5, "salePrice": "4.0000000000", "wholeSalePrice": null } ], "unitAllowsDecimals": false, "increment": 5, "allowsMeteredUsage": true, "displaysPricePerIncrement": true } ] }, { "source": "CHANNEL_CATALOG", "pricingDefinitions": [ { "costTypeCategory": "ONE_TIME", "costType": "ONE_TIME_FLAT", "pricingStrategy": "FLAT", "salePrice": "3.0000000000", "wholeSalePrice": null } ] } ] } ] } ] }` # [](#tag/Companies)Companies ## [](#tag/Companies/operation/resource_Company_readCompanyActivities_GET)Read activities Retrieve company or user activities. The displayType parameter dictates whether activities for the given user or activities for the whole company are returned. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as an end user in the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### query Parameters | | | | ----------- | ---------------------------------------------------------------------------------------- | | displayType | stringDefault:"ONLY\_ME"Enum: "EVERYONE" "ONLY\_ME"Scope | | page | integerDefault:0Zero-based page index | | size | integerDefault:12The size of the page to be returned | ### Responses **200** Success **401** Unauthorized **404** Company not found get/account/v2/companies/{companyUuid}/activities https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/activities https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/activities ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/activities?displayType=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Companies/operation/resource_Company_readAllCompanies_GET)List all companies Retrieve all marketplace companies.

Rate limit: Bucket size is 20 requests, with a leak rate of 5 requests per second.

Rate limit uses [leaky bucket algorithm](https://en.wikipedia.org/wiki/Leaky_bucket). Usage of a leaky bucket algorithm allows client applications to make an unlimited number of requests over a large time horizon but prevents excessively large bursts over a short one. ##### Required Scopes and Authorization Rules * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### query Parameters | | | | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | name | stringCompany name | | includeCustomAttributes | booleanOptional. Default is true. When set to true, company custom attributes are included in the API response. When set to false, company custom attributes are not included. | | includePurchaseLimitData | booleanOptional. Default is true. When set to true, the purchase limit attributes are fetched, calculated and populated in the response. When set to false, the purchase limit attributes are not fetched. | | page | integerDefault:0Zero-based page index | | size | integerDefault:50The number of search results to return per page | | sortField | stringDefault:"NAME"Value: "NAME"The property to sort by | | sortOrder | stringDefault:"DESC"Enum: "ASC" "DESC"Ordering type | | custom.customAttributeName | stringAccepts a notIn filter in the form of ?custom.customAttributeName=notIn(customAttributeValue1, customAttributeValue2, customAttributeValueN...) that excludes companies with matching values. Before you can use the filter, you must first create "Text" type company custom attributes in the user interface. You can then specify the custom attribute name and values as customAttributeName and customAttributeValueN. See . | ### Responses **200** Success **401** Unauthorized get/account/v2/companies https\://marketplace.appdirect.com/api/account/v2/companies https\://virtserver.swaggerhub.com/account/v2/companies ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/companies?name=SOME_STRING_VALUE&includeCustomAttributes=SOME_BOOLEAN_VALUE&includePurchaseLimitData=SOME_BOOLEAN_VALUE&page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&custom.customAttributeName=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Companies/operation/resource_Company_createCompany_POST)Create new company Create a new marketplace company ##### Required Scopes and Authorization Rules * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### Request Body schema: application/jsonrequired New marketplace company | | | | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | name | string or nullCompany name | | allowLogin | booleanOptional. Default is "true".When set to "true", the marketplace company allows users, including the first user, to login to the marketplace and receive emails from the marketplace. Users can purchase and assign products within the company. Products can also be purchased on their behalf, and assigned to them.When set to "false", the marketplace company does not allow company members, including the first user, to login to the marketplace or receive email notifications from the marketplace. Products are purchased and assigned on users behalf, and they access those products directly through the product interface. | | idpUuid | stringUUID of the identity provider that the user will always use to log in. Contact your AppDirect technical consultant or business consultant to obtain the UUID. | | address | object (CompanyAddress) | | companySize | string (CompanySizeType)Enum: "SMALL" "MEDIUM" "ENTERPRISE"Company size types | | customAttributes | Array of objects (CustomAttributeAccountV2Request)Custom attributes | | industry | stringCompany industry sector | | emailAddress | stringCompany email address | | website | stringCompany website URL | | vendor | booleanIndicates whether the company has Vendor access | | reseller | booleanIndicates whether the company has Reseller access | | channelAdmin | booleanIndicates whether the company has Channel Admin access | | referral | booleanIndicates whether the company has Referral access | | externalId | stringCompany external ID | | phoneNumber | string or nullCompany phone number | | defaultRole | stringThe default role newly created users receive | | countryCode | stringCompany country code defined by ISO ALPHA-2 standard | | thirtyDaysPurchaseLimitExempt | booleanIndicates if company is exempt from the marketplace default thirty day spend limit | | thirtyDaysPurchaseLimitOverrideAmt | numberCompany-level override amount of marketplace default thirty day spend limit | | dailyPurchaseLimitExempt | booleanIndicates if company is exempt from the marketplace default daily spend limit | | dailyPurchaseLimitOverrideAmt | numberCompany-level override amount of marketplace default daily spend limit | | onlyAdminsCanBuy | booleanIndicates if only selected roles in company that can make purchases or all roles in company can make purchases | | importAppsEnabled | booleanThe import apps feature is enabled for this company | | billingDayOfMonth | integer(Optional) Use this property in company creation requests to set the billing cycle start date. The date applies to all purchases made through the specified company, and overrides the marketplace-level billing cycle date. | | firstUser | object (CreateCompanyV2RequestFirstUser)Represents the membership of the first user in a company, who also receives the Company Administrator role by default | ### Responses **201** Created **401** Unauthorized post/account/v2/companies https\://marketplace.appdirect.com/api/account/v2/companies https\://virtserver.swaggerhub.com/account/v2/companies ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "externalId": "P02TSQ3YPZoykqx1a10", "name": "Company Example", "companySize": "SMALL", "defaultRole": "USER", "countryCode": "US", "emailAddress": "info@company12345.com", "phoneNumber": "11234567890", "website": "https://www.company12345.com", "industry": "Sales", "address": { "city": "New York", "country": "US", "state": "NY", "street1": "980 West 881st Street", "street2": "55AB", "zip": "12345" }, "channelAdmin": false, "reseller": false, "vendor": false, "customAttributes": [ { "name": "text_example", "value": "foo" }, { "name": "multiselect_checkboxes_example", "valueKeys": [ "ipsum", "fake" ] } ], "firstUser": { "firstName": "John", "lastName": "Smith", "email": "john.smith@company12345.com", "roles": [ "ROLE_SYS_ADMIN" ] } }` ### Response samples * 201 Content type \*/\*\*/\* No sample ## [](#tag/Companies/operation/resource_Company_readCompany_GET)Read a company Retrieve a marketplace company by ID or external ID. If you use the ID, you can omit a prefix or use 'id:' as the prefix. If you use the external ID, you must always specify the 'externalId:' prefix. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as an end user in the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------------------------------- | | companyUuidrequired | stringUnique identifier (ID or external ID) of the company in the API request | ### Responses **200** Success **401** Unauthorized **404** Company not found get/account/v2/companies/{companyUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Companies/operation/resource_Company_updateCompany_PUT)Update company Update a marketplace company. ##### Required Scopes and Authorization Rules * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ---------------- | | companyUuidrequired | stringCompany ID | ##### Request Body schema: application/jsonrequired Marketplace company details to be updated | | | | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | name | string or nullCompany name | | enabled | booleanIndicates whether company is enabled | | allowLogin | booleanIndicates whether a company's users are managed users (false) or not (true). Do not change the value with this request | | address | object (CompanyAddress) | | companySize | string (CompanySizeType)Enum: "SMALL" "MEDIUM" "ENTERPRISE"Company size types | | customAttributes | Array of objects (CustomAttributeAccountV2)Custom attributes | | industry | stringCompany industry sector | | emailAddress | stringCompany email address | | website | stringCompany website URL | | vendor | booleanIndicates whether the company has Vendor access | | reseller | booleanIndicates whether the company has Reseller access | | channelAdmin | booleanIndicates whether the company has Channel Admin access | | referral | booleanIndicates whether the company has Referral access | | externalId | stringCompany external ID | | phoneNumber | string or nullCompany phone number | | defaultRole | stringThe default role newly created users receive | | countryCode | stringCompany country code defined by ISO ALPHA-2 standard | | billingDayOfMonth | integer(Optional) Use this property in company creation requests to set the billing cycle start date. The date applies to all purchases made through the specified company, and overrides the marketplace-level billing cycle date. | | thirtyDaysPurchaseLimit | numberMonthly spend limit used as the default limit for all companies in the marketplace | | thirtyDaysPurchaseRemainingAmt | numberRemaining monthly spending amount | | thirtyDaysPurchaseLimitExempt | booleanWhether company is exempt from the marketplace default thirty-day spend limit | | thirtyDaysPurchaseLimitOverrideAmt | numberThirty-day spend limit for this company (overrides marketplace default for thirty-day company spend limit) | ### Responses **200** Success **401** Unauthorized **404** Company not found put/account/v2/companies/{companyUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "name": "Company 7078259907", "enabled": true, "address": { "city": "San Francisco", "country": "United Stated of America", "state": "California", "street1": "5th Ave", "street2": "#400", "zip": "32455" }, "companySize": "SMALL", "customAttributes": [ { "name": "Geographic Region", "attributeType": "TEXT", "label": "Geographic Region", "hint": "US West, US Central, or US East", "value": "US" }, { "name": "Company Details", "attributeType": "MULTISELECT", "label": "Label Names", "hint": "", "valueKeys": [ "Option 1" ] } ], "industry": "IT", "emailAddress": "info@company.com", "website": "http://www.company.com", "vendor": false, "reseller": false, "channelAdmin": false, "externalId": "d689b970-f3f9-42a6-a974-90e2bdadf860", "phoneNumber": "9259221234", "defaultRole": "USER", "countryCode": "US", "thirtyDaysPurchaseLimit": 0, "thirtyDaysPurchaseLimitExempt": false, "thirtyDaysPurchaseLimitOverrideAmt": null, "thirtyDaysPurchaseRemainingAmt": null }` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Companies/operation/resource_Company_patchCompany_PATCH)Patch company Partially update marketplace company account information. This only adds or updates the values for the properties that you include in the call; all other properties are ignored. ##### Required Scopes and Authorization Rules * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. * `ROLE_RESELLER` - Allows access as a Reseller for the companies. For ROLE\_RESELLER to get permission to perform an update company operation. The user must:,- Have verified reseller authority to perform the update company operation.,- Be authorized to manage companies in the role of a reseller.,- Act on a company that is associated with the reseller. ##### path Parameters | | | | ------------------- | ---------------- | | companyUuidrequired | stringCompany ID | ##### Request Body schema: application/jsonrequired Marketplace company account information and settings | | | | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | name | string or nullCompany name | | enabled | booleanIndicates whether company is enabled | | allowLogin | booleanIndicates whether a company's users are managed users (false) or not (true). Do not change the value with this request. | | address | object (CompanyAddress) | | companySize | string (CompanySizeType)Enum: "SMALL" "MEDIUM" "ENTERPRISE"Company size types | | customAttributes | Array of objects (CustomAttributeAccountV2)Custom attributes | | industry | stringCompany industry sector | | emailAddress | stringCompany email address | | website | stringCompany website URL | | vendor | booleanIndicates whether the company has Vendor access | | reseller | booleanIndicates whether the company has Reseller access | | channelAdmin | booleanIndicates whether the company has Channel Admin access | | referral | booleanIndicates whether the company has Referral access | | externalId | stringCompany external ID | | phoneNumber | string or nullCompany phone number | | defaultRole | stringThe default role newly created users receive | | countryCode | stringCompany country code defined by ISO ALPHA-2 standard | | billingDayOfMonth | integer(Optional) Use this property in company creation requests to set the billing cycle start date. The date applies to all purchases made through the specified company, and overrides the marketplace-level billing cycle date. | | thirtyDaysPurchaseLimitExempt | booleanWhether company is exempt from the marketplace default thirty-day spend limit | | thirtyDaysPurchaseLimitOverrideAmt | numberThirty-day spend limit for this company (overrides marketplace default for thirty-day company spend limit) | | dailyPurchaseLimitExempt | booleanWhether company is exempt from the marketplace default daily spend limit | | dailyPurchaseLimitOverrideAmt | numberDaily spend limit for this company (overrides marketplace default for daily company spend limit) | ### Responses **200** Success **401** Unauthorized **404** Company not found patch/account/v2/companies/{companyUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "name": "Company 7078259907", "enabled": true, "address": { "city": "San Francisco", "country": "United Stated of America", "state": "California", "street1": "5th Ave", "street2": "#400", "zip": "32455" }, "companySize": "SMALL", "customAttributes": [ { "name": "Geographic Region", "attributeType": "TEXT", "label": "Geographic Region", "hint": "US West, US Central, or US East", "value": "US" }, { "name": "Company Details", "attributeType": "MULTISELECT", "label": "Label Names", "hint": "", "valueKeys": [ "great option" ] } ], "industry": "IT", "emailAddress": "info@company.com", "website": "http://www.company.com", "vendor": false, "reseller": false, "channelAdmin": false, "externalId": "d689b970-f3f9-42a6-a974-90e2bdadf860", "phoneNumber": "9259221234", "defaultRole": "USER", "countryCode": "US", "thirtyDaysPurchaseLimitExempt": false, "thirtyDaysPurchaseLimitOverrideAmt": null, "dailyPurchaseLimitExempt": false, "dailyPurchaseLimitOverrideAmt": 10 }` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Companies/operation/resource_Company_updateCompanyPicture_PUT)Update company picture Update a marketplace company’s profile picture, for example, with an image of a logo. This method requires a Content-Type request header with a value of “multipart/form-data”. The updated company resource is returned. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### Request Body schema: application/jsonrequired Image file that will be used as the profile picture. object ### Responses **200** Success **401** Unauthorized **404** Company not found put/account/v2/companies/{companyUuid}/picture https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/picture https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/picture ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ }` ### Response samples * 200 Content type \*/\*\*/\* No sample # [](#tag/AppResellerAccount)Companies (Reseller) ## [](#tag/AppResellerAccount/operation/resource_AppResellerAccountV1CompanyApi_post_POST)Create company Create a new company linked to the current reseller. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. ##### Request Body schema: application/jsonrequired Information about the new company that will be created | | | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | | createdByCompanyId | stringReseller's company UUID | | name | stringNew company's name | | externalId | stringExternal ID used to identify the new company (must be unique) | | phone | stringNew company's phone number | | companySize | string (AppResellerAccountCompanySize)Enum: "SMALL" "MEDIUM" "ENTERPRISE"Size of the new company | | website | stringNew company's website | | companyAccess | string (AppResellerAccountCompanyApiContext)Enum: "RESELLER" "REFERRAL" "CUSTOMER"Supported AppReseller contexts | ### Responses **200** Success **401** Unauthorized post/appReseller/v1/companies https\://marketplace.appdirect.com/api/appReseller/v1/companies https\://virtserver.swaggerhub.com/appReseller/v1/companies ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "createdByCompanyId": "386626c0-53e2-4515-8450-4a720bb5d029", "name": "Test Name", "externalId": "externalRandom", "phone": "50505055", "companySize": "SMALL", "website": "www.new_company.com", "companyAccess": "RESELLER" }` ### Response samples * 200 Content type application/json Copy `{ "id": "386626c0-53e2-4515-8450-4a720bb5d029", "externalId": "externalRandom", "name": "Test Name", "createdOn": 1519158286000, "phone": "50505055" }` ## [](#tag/AppResellerAccount/operation/resource_AppResellerAccountV1CompanyApi_get_GET)List companies Retrieves companies depending on context: in the Reseller context, this endpoint lists all companies linked to the current reseller company; in the Reseller Manager context, it lists all referral and reseller companies in the current marketplace ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the companies * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the companies ##### query Parameters | | | | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringValue: "RESELLER, RESELLER\_MANAGER"Supported AppReseller contexts | | active | stringUser activation status | | enabled | stringUser enablement status | | searchText | stringSearch text | | fromDate | stringFrom date, in timestamp format | | toDate | stringTo date, in timestamp format | | sortField | stringEnum: "COMPANY\_ID" "CREATED\_ON"Field to sort by | | sortOrder | stringSort order | | page | integerPage number | | size | integerNumber of results per page | | vendor | stringValue: "ONLY\_VENDORS, ONLY\_NON\_VENDORS, ONLY\_RESELLERS"This enum filters companies that can sell (or not) or resell products in the marketplace. | | channelAdmin | stringValue: "ONLY\_CHANNEL\_ADMINS, ONLY\_NON\_CHANNEL\_ADMINS"This enum filters companies that have (or not) permission to manage the marketplace. | ### Responses **200** Success **401** Unauthorized get/appReseller/v1/companies https\://marketplace.appdirect.com/api/appReseller/v1/companies https\://virtserver.swaggerhub.com/appReseller/v1/companies ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/companies?context=SOME_STRING_VALUE&active=SOME_STRING_VALUE&enabled=SOME_STRING_VALUE&searchText=SOME_STRING_VALUE&fromDate=SOME_STRING_VALUE&toDate=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&vendor=SOME_STRING_VALUE&channelAdmin=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `[ { "id": "386626c0-53e2-4515-8450-4a720bb5d029", "externalId": "externalRandom", "name": "Test Name", "createdOn": 1519158286000, "phone": "50505055", "activated": true, "numOfUsers": 1, "grantedAccesses": [ ] }, { "id": "296626c0-53e2-4515-8450-4a720bb5d040", "externalId": "externalRandom2", "name": "Test Name 2", "createdOn": 1519158286000, "phone": "50505056", "activated": true, "numOfUsers": 1, "grantedAccesses": [ ] } ]` ## [](#tag/AppResellerAccount/operation/resource_AppResellerAccountV1CompanyApi_detail_GET)Company details Retrieves the current reseller company details. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the company. ##### path Parameters | | | | ----------------- | ---------------- | | companyIdrequired | stringCompany ID | ##### query Parameters | | | | --------------- | ---------------------------------------------------------------------------------------- | | contextrequired | stringValue: "RESELLER, RESELLER\_MANAGER"Supported AppReseller contexts | ### Responses **200** Success **401** Unauthorized **404** Not found get/appReseller/v1/companies/{companyId} https\://marketplace.appdirect.com/api/appReseller/v1/companies/{companyId} https\://virtserver.swaggerhub.com/appReseller/v1/companies/{companyId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/companies/%7BcompanyId%7D?context=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "9e00b38b-7918-4a27-b2f6-123b77cfac0b", "name": "C37719018", "createdOn": 1523007202000, "enabled": true, "active": true, "grantedAccesses": [ ], "defaultRole": "USER", "availableAccesses": [ ], "availableTaxExemptions": [ "FEDERAL_GOVERNMENT_US", "STATE_GOVERNMENT_US", "TRIBE_INDIAN", "FOREIGN_DIPLOMAT", "CHARITABLE_ORG", "RELIGIOUS_ORG", "RESALE", "COMMERCIAL_AGRICULTURAL", "INDUSTRIAL_PRODUCTION", "DIRECT_MAIL_US", "DIRECT_PAY_PERMIT_US", "OTHER", "LOCAL_GOVERNMENT_US", "COMMERCIAL_AQUACULTURE", "COMMERCIAL_FISHERY", "NON_RESIDENT_CAN", "MEDICAL_DEVICE_WITH_EXEMPT_SALES_TAX_US", "MEDICAL_DEVICE_WITH_TAXABLE_SALES_TAX_US" ], "stats": [ { "unit": "Free Trials", "children": "0" }, { "unit": "Expired Free Trials", "children": "0" }, { "unit": "Purchased Products", "children": "0" }, { "unit": "Suspended Products", "children": "0" }, { "unit": "Unpaid Invoices", "children": "0" }, { "unit": "Total Spent", "children": "$0.00" } ], "settings": [ ], "actions": [ "JOIN_COMPANY", "DISABLE_COMPANY", "MANAGE_CUSTOM_ATTRIBUTES", "INVITE_USERS" ], "availableRoles": [ "USER" ], "idpConfigurations": [ ] }` ## [](#tag/AppResellerAccount/operation/resource_AppResellerAccountV1UserApi_post_POST)Create user Create a new user in a company linked to the Reseller company. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. ##### query Parameters | | | | --------------- | ---------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "RESELLER\_MANAGER" | ##### Request Body schema: application/json Information about the user to create | | | | ------------------ | --------------------------------------------- | | createdByCompanyId | stringReseller's company ID | | companyId | stringNew user's company ID | | externalId | stringNew user's external ID (must be unique) | | email | stringNew user's email (must be unique) | | firstName | stringNew user's First Name | | lastName | stringNew user's Last Name | ### Responses **200** Success **401** Unauthorized **500** User not created post/appReseller/v1/users https\://marketplace.appdirect.com/api/appReseller/v1/users https\://virtserver.swaggerhub.com/appReseller/v1/users ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "createdByCompanyId": "386626c0-53e2-0000-0000-4a720bb5d000", "companyId": "4c00cad1-f741-0zf6-bb00-0000e73cec00", "externalId": "01", "email": "user@appdirect.com", "firstName": "James", "lastName": "Smith" }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "6d375008-3b19-4cb8-bbb9-dcd9fce99432", "companyId": "460fad0d-19e2-4eec-a756-59c15dc7a56a", "email": "test4@yopmail.com", "firstName": "user4", "lastName": "user4", "memberships": [ { "company": { "id": "460fad0d-19e2-4eec-a756-59c15dc7a56a", "externalId": "external11", "name": "Company3", "createdOn": 1525682872000, "phone": null } } ] }` ## [](#tag/AppResellerAccount/operation/resource_AppResellerAccountV1UserApi_get_GET)List users In the Reseller Manager context, this request retrieves all Resellers and Referral users. In the Reseller context, it retrieves all users that belong to companies linked to the reseller. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for reading the users from companies that are linked to mine. * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for reading the users whose company are Reseller or Referral. ##### query Parameters | | | | --------------- | -------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "RESELLER\_MANAGER" | | partner | stringUser partner | | companyId | stringUser company ID | | active | Array of stringsList of user activation status | | searchText | stringSearch text | | fromDate | stringFrom date, in timestamp format | | toDate | stringTo date, in timestamp format | | sortField | stringEnum: "CUSTOMER\_ID" "EMAIL" "FIRST\_NAME"Field to sort by | | sortOrder | stringSort order | | page | integerPage number | | size | integerNumber of results per page | ### Responses **200** Success **401** Unauthorized get/appReseller/v1/users https\://marketplace.appdirect.com/api/appReseller/v1/users https\://virtserver.swaggerhub.com/appReseller/v1/users ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/users?context=SOME_STRING_VALUE&partner=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE&active=SOME_ARRAY_VALUE&searchText=SOME_STRING_VALUE&fromDate=SOME_STRING_VALUE&toDate=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "0af398ee-0000-000a-0000-a83d70caeff8", "companyId": "0a357e6b-0000-000a-0000-680eabb9e322", "email": "john@appdirect.com", "firstName": "John", "lastName": "Grande", "createdOn": 1525682872000, "activated": false, "invitationRequired": false, "memberships": [ { "company": { "id": "0a357e6b-0000-000a-0000-680eabb9e322", "name": "TestCompany", "createdOn": 1525682872000 }, "enabled": true } ] }, { "id": "47e70302-0000-000a-0000-a01cb6129c6c", "companyId": "a5811d92-0000-000a-0000-3c69e47fe126", "email": "george@appdirect.com", "firstName": "George", "lastName": "Common", "createdOn": 1461321550000, "activated": false, "invitationRequired": false, "memberships": [ { "company": { "id": "a5811d92-0000-000a-0000-3c69e47fe126", "name": "C4027287", "createdOn": 1461321550000 }, "enabled": true } ] } ], "page": { "size": 10, "totalElements": 2, "totalPages": 1, "number": 0 } }` ## [](#tag/AppResellerAccount/operation/resource_AppResellerAccountV1UserDetailApi_get_GET)User details Get a single user details ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the company. ##### path Parameters | | | | -------------- | ------------- | | userIdrequired | stringUser ID | ##### query Parameters | | | | ----------------- | --------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "RESELLER\_MANAGER" | | companyIdrequired | stringUser's company ID (some user details depend on the specified company) | ### Responses **200** Success **401** Unauthorized get/appReseller/v1/users/{userId} https\://marketplace.appdirect.com/api/appReseller/v1/users/{userId} https\://virtserver.swaggerhub.com/appReseller/v1/users/{userId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/users/%7BuserId%7D?context=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "64535371-9e83-0000-0000-61cb17bc0c9e", "companyId": "c5fe2ca9-3db1-0000-0000-0cf0a01bd437", "email": "c4201720@appdirect.com", "firstName": "John", "lastName": "Grande", "createdOn": 1465984400000, "activated": true, "invitationRequired": false, "memberships": [ { "company": { "id": "c5fe2ca9-0000-408c-0000-0cf0a01bd437", "name": "C4200000" }, "roles": [ "BILLING_ADMIN", "SYS_ADMIN", "RESELLER" ], "enabled": true } ], "partner": "APPDIRECT", "enabled": true, "customAttributes": [ ], "settings": [ { "setting": "SYS_ADMIN", "permission": "READ", "value": "true" }, { "setting": "BILLING_ADMIN", "permission": "READ", "value": "true" } ], "actions": [ "SEND_RESET_PASSWORD_EMAIL" ], "availableRoles": [ { "name": "BILLING_ADMIN", "permission": "READ" }, { "name": "SYS_ADMIN", "permission": "READ" } ] }` # [](#tag/AppResellerCompanyAssociation)Company Association ## [](#tag/AppResellerCompanyAssociation/operation/resource_AppResellerAccountV1CustomerCompanyAssociationApi_post_POST)Create company association Creates an association (link) between a customer company and a reseller company. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### Request Body schema: application/jsonrequired Information about the association to create | | | | ------------------------- | ------------------------- | | customerCompanyIdrequired | stringCustomer company ID | | resellerCompanyIdrequired | stringReseller company ID | ### Responses **200** Success **404** Resource does not exist **409** Conflict post/appReseller/v1/companyAssociations https\://marketplace.appdirect.com/api/appReseller/v1/companyAssociations https\://virtserver.swaggerhub.com/appReseller/v1/companyAssociations ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "customerCompanyId": "string", "resellerCompanyId": "string" }` ### Response samples * 200 * 409 Content type application/json Copy Expand all Collapse all `{ "id": "c39b8bcd-db7a-46d0-939f-facdeb1d6967", "resellerCompany": { "id": "0a69093c-0000-4f8d-0000-5e0000630000", "name": "Reseller" }, "customerCompany": { "id": "0dc2860e-0000-40f7-0000-ef0000a30000", "name": "Customer" }, "createdOn": 1531839782000 }` ## [](#tag/AppResellerCompanyAssociation/operation/resource_AppResellerAccountV1CustomerCompanyAssociationApi_get_GET)List company associations Retrieves all customer company associations. This request requires either the Reseller company ID or the Customer company ID, which you can retrieve with the [List companies](#list-companies) request. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for reading the users whose company are Reseller or Referral. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### query Parameters | | | | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | resellerCompanyIdrequired | stringReseller company ID. This field is required if you do not include the Customer company ID | | customerCompanyIdrequired | stringCustomer company ID. This field is required if you do not include the Reseller company ID | | searchText | stringSearch term used to search on different fields of the customer company association. | | createdOn | stringDate filter, defined by upper or lower inclusive or exclusive limits, in Unix timestamp format. Acceptable values are: gte(\[timestamp]) - 'greater than or equal to'; or lte(\[timestamp]) - 'less than or equal to' | | sort | stringSort field and order. For ascending sort order, use the '+\[FieldName]' format. For descending order, use the '-\[FieldName]' format. | | number | integerPage number | | size | integerNumber of results per page | ### Responses **200** Success get/appReseller/v1/companyAssociations https\://marketplace.appdirect.com/api/appReseller/v1/companyAssociations https\://virtserver.swaggerhub.com/appReseller/v1/companyAssociations ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/companyAssociations?resellerCompanyId=SOME_STRING_VALUE&customerCompanyId=SOME_STRING_VALUE&searchText=SOME_STRING_VALUE&createdOn=SOME_STRING_VALUE&sort=SOME_STRING_VALUE&number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "c39b8bcd-db7a-46d0-939f-facdeb1d6967", "resellerCompany": { "id": "0a69093c-0000-4f8d-0000-5e0000630000", "name": "Reseller1" }, "customerCompany": { "id": "0dc2860e-0000-40f7-0000-ef0000a30000", "name": "Customer1" }, "createdOn": 1531839782000 }, { "id": "c39b8bcd-db7a-46d0-939f-facdeb1d6967", "resellerCompany": { "id": "0a69093c-0000-4f8d-0000-5000020000ef", "name": "Reseller2" }, "customerCompany": { "id": "0dc2860e-0000-40f7-0000-e0000600000a", "name": "Customer2" }, "createdOn": 1531839782000 } ], "page": { "size": 10, "totalElements": 2, "totalPages": 1, "number": 0 } }` ## [](#tag/AppResellerCompanyAssociation/operation/resource_AppResellerAccountV1CustomerCompanyAssociationApi_delete_DELETE)Remove company association Deletes a company association. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for reading the users whose company are Reseller or Referral. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ---------------------------- | ---------------------------- | | companyAssociationIdrequired | stringCompany Association ID | ### Responses **204** No Content delete/appReseller/v1/companyAssociations/{companyAssociationId} https\://marketplace.appdirect.com/api/appReseller/v1/companyAssociations/{companyAssociationId} https\://virtserver.swaggerhub.com/appReseller/v1/companyAssociations/{companyAssociationId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/appReseller/v1/companyAssociations/%7BcompanyAssociationId%7D ``` # [](#tag/CompanyMemberships)Company Memberships ## [](#tag/CompanyMemberships/operation/resource_Company_readCompanyMembership_GET)Read company membership Retrieve a marketplace user's company membership information. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as an end user in the company * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace. Only memberships with the Reseller role or that are linked to Reseller companies can be retrieved. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ##### query Parameters | | | | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | includeCompanies | booleanOptional. Default is true. When set to true, companies will be included in the API response. When set to false, companies will not be included. | | includeUserCustomAttributes | booleanOptional. Default is true. When set to true, user custom attributes will be included in the API response. When set to false, user custom attributes will not be included. | ### Responses **200** Success **401** Unauthorized **404** Company/User/Membership not found get/account/v2/companies/{companyUuid}/memberships/{userUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D?includeCompanies=SOME_BOOLEAN_VALUE&includeUserCustomAttributes=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/CompanyMemberships/operation/resource_Company_updateCompanyMembership_PUT)Update company membership Update a marketplace user's company membership. Updates the following roles based on the provided user company membership data: Product Support, Sales Support, Reseller Manager, Customer Support, Reseller, Billing Admin, Company Admin, Developer. This also enables/disables the membership based on provided user company membership data. **Note: You cannot set the Marketplace Manager role through the API.** ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ##### Request Body schema: application/json Update User company membership data | | | | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | enabled | booleanIndicates whether the membership is enabled | | roles | Array of stringsRoles for this membership. One or more of the following: ROLE\_CHANNEL\_ADMIN (Marketplace Manager), ROLE\_CHANNEL\_PRODUCT\_SUPPORT (Product Support), ROLE\_SALES\_SUPPORT (Sales Support), ROLE\_RESELLER\_MANAGER (Reseller Manager), ROLE\_RESELLER (Reseller), ROLE\_CHANNEL\_SUPPORT (Customer Support), ROLE\_SYS\_ADMIN (Company Admin), ROLE\_BILLING\_ADMIN (Billing Admin), ROLE\_DEVELOPER (Developer). | ### Responses **200** Success **401** Unauthorized **404** Company/User/Membership not found put/account/v2/companies/{companyUuid}/memberships/{userUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "enabled": true, "roles": [ "ROLE_BILLING_ADMIN", "ROLE_DEVELOPER", "ROLE_SYS_ADMIN" ] }` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/CompanyMemberships/operation/resource_Company_deleteCompanyMembership_DELETE)Delete company membership Delete a marketplace user's company membership. If this is the only company the user was member of, user is marked as deleted. A user that has active entitlements, owns products or is externally managed can't be deleted. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ### Responses **204** Success **401** Unauthorized **404** Company/User/Membership not found **409** Active subscriptions found delete/account/v2/companies/{companyUuid}/memberships/{userUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D ``` ## [](#tag/CompanyMemberships/operation/resource_Company_partialUpdateCompanyMembership_PATCH)Enable/Disable company membership Enable or disable marketplace user's company membership. This only changes the user company membership's enabled status; all other attributes are ignored. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ##### Request Body schema: application/json User company membership data | | | | ------- | ---------------------------------------------- | | enabled | booleanIndicates whether membership is enabled | ### Responses **200** Success **401** Unauthorized **404** Company/User/Membership not found **409** Active subscriptions found patch/account/v2/companies/{companyUuid}/memberships/{userUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "enabled": true }` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/CompanyMemberships/operation/resource_Company_createActiveUser_POST)Create company membership (Add User) Create a marketplace user with membership in the given company. The created user is active, and is associated with the specified company (membership). User is set with a temporary password; the password is emailed to the recipients specified in the request body. The domain part of the user's email address must match one of the verified domains associated with the company the user will be created in. **Note: You cannot set the Marketplace Manager role through the API.** ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### Request Body schema: application/json User creation data | | | | ----------------- | ---------------------------------------------------------------------- | | recipientEmails | Array of stringsList of emails where the temporary password is sent | | temporaryPassword | stringTemporary password | | user | object (ActiveUserAccountV2)User information (company) | ### Responses **200** Success **401** Unauthorized **404** Company not found post/account/v2/companies/{companyUuid}/memberships/active https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/active https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/active ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "user": { "email": "guy.smith@company9411805586.com", "firstName": "Guy", "lastName": "Smith", "roles": [ "ROLE_DEVELOPER" ] }, "temporaryPassword": "Temporary Password", "recipientEmails": [ "manager@company9411805586.com", "itteam@company9411805586.com" ] }` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/CompanyMemberships/operation/resource_Company_readCompanyMemberships_GET)List company memberships List a marketplace company's user memberships. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as an end user in the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### query Parameters | | | | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | active | booleanIf specified, returns only memberships associated with users having the specified active status | | enabled | booleanIf specified, returns only memberships with the specified enabled status | | roleName | stringIf specified, returns only memberships with the specified role enabled | | groupUuid | stringIf specified, returns only memberships that are a part of the specified group | | page | integerDefault:0Zero-based page index | | searchText | stringSearch term used to search on different fields of a membership | | size | integerDefault:50The size of the page to be returned | | sortField | stringDefault:"DATE"Enum: "DATE" "FIRST\_NAME" "LAST\_NAME"The property to sort by | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Ordering type | | includeCompanies | booleanOptional. Default is true. When set to true, companies will be included in the API response. When set to false, companies will not be included. | | includeUserCustomAttributes | booleanOptional. Default is true. When set to true, user custom attributes will be included in the API response. When set to false, user custom attributes will not be included. | ### Responses **200** Success **401** Unauthorized **404** Company not found get/account/v2/companies/{companyUuid}/memberships https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships?active=SOME_BOOLEAN_VALUE&enabled=SOME_BOOLEAN_VALUE&roleName=SOME_STRING_VALUE&groupUuid=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&searchText=SOME_STRING_VALUE&size=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&includeCompanies=SOME_BOOLEAN_VALUE&includeUserCustomAttributes=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/CompanyMemberships/operation/resource_Company_createCompanyMembership_POST)Create company membership Add a new or existing user as a member of a marketplace company. If no user exists with the given email address a new user account ([Users](#users)) will be created. Use the allowLogin body parameter to control if a new user account should be invited to the marketplace with login access or created as a managed user without login access. See [CreateUserAccountV2](#createuseraccountv2) for more information on the allowLogin parameter. Depending on channel configuration, an invited membership is either created immediately, or when the invited user accepts the invitation. **Note: You cannot set the Marketplace Manager role through the API.** ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### query Parameters | | | | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | inviterUuid | stringUnique identifier of the inviter in the API request. Required only when ROLE\_PARTNER authority/scope is used to make the API request. | ##### Request Body schema: application/json User company membership data | | | | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | user | object (CreateUserAccountV2)User information data | | roles | Array of stringsOptional. When not included the company default role will be used.Roles for this membership. One or more of the following: ROLE\_USER (User), ROLE\_CHANNEL\_PRODUCT\_SUPPORT (Product Support), ROLE\_SALES\_SUPPORT (Sales Support), ROLE\_RESELLER\_MANAGER (Reseller Manager), ROLE\_RESELLER (Reseller), ROLE\_CHANNEL\_SUPPORT (Customer Support), ROLE\_SYS\_ADMIN (Company Admin), ROLE\_BILLING\_ADMIN (Billing Admin), ROLE\_DEVELOPER (Developer). For user roles (not associated with membership), see [UserAccountV2](#useraccountv2). | ### Responses **201** Success **401** Unauthorized **404** Company/Inviter not found post/account/v2/companies/{companyUuid}/memberships https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "user": { "email": "jane.lee@company1151609035.com", "firstName": "Jane", "lastName": "Lee", "allowLogin": true }, "roles": [ "ROLE_USER" ] }` ### Response samples * 201 Content type \*/\*\*/\* No sample ## [](#tag/CompanyMemberships/operation/resource_Company_createCompanyMembership_PATCH)Update company membership roles (bulk) Update role assignments for one or more company memberships (users). API clients acting on behalf of an end user must first call [Read assignable roles for company membership](#read-assignable-roles-for-company-membership) to retrieve the list of roles they are allowed to update. **Note: You cannot set the Marketplace Manager role through the API.** ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### Request Body schema: application/json User company membership role data Array | | | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | userUuid | stringUUID of the user whose membership roles need to be modified | | rolesToAdd | Array of stringsRoles to add to this membership. One or more of the following: ROLE\_CHANNEL\_PRODUCT\_SUPPORT (Product Support), ROLE\_SALES\_SUPPORT (Sales Support), ROLE\_RESELLER\_MANAGER (Reseller Manager), ROLE\_RESELLER (Reseller), ROLE\_CHANNEL\_SUPPORT (Customer Support), ROLE\_SYS\_ADMIN (Company Admin), ROLE\_BILLING\_ADMIN (Billing Admin), ROLE\_DEVELOPER (Developer). | | rolesToRemove | Array of stringsRoles to remove from this membership. One or more of the following: ROLE\_CHANNEL\_ADMIN (Marketplace Manager), ROLE\_CHANNEL\_PRODUCT\_SUPPORT (Product Support), ROLE\_SALES\_SUPPORT (Sales Support), ROLE\_RESELLER\_MANAGER (Reseller Manager), ROLE\_RESELLER (Reseller), ROLE\_CHANNEL\_SUPPORT (Customer Support), ROLE\_SYS\_ADMIN (Company Admin), ROLE\_BILLING\_ADMIN (Billing Admin), ROLE\_DEVELOPER (Developer). | ### Responses **200** Success **400** Bad request **401** Unauthorized **404** Company not found patch/account/v2/companies/{companyUuid}/memberships/roles https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/roles https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/roles ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `[ { "userUuid": "92a8d9f6-223d-11e8-a232-d879d2b204fc", "rolesToAdd": [ "ROLE_DEVELOPER", "ROLE_RESELLER" ], "rolesToRemove": [ "ROLE_CHANNEL_SUPPORT" ] }, { "userUuid": "673d2cda-2d1a-11e8-a232-d879d2b204fc", "rolesToAdd": [ "ROLE_SYS_ADMIN" ] } ]` ## [](#tag/CompanyMemberships/operation/resource_Company_readUserChecklist_GET)Read user checklist Retrieve a marketplace user's checklist. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as current user matches the user in path. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ### Responses **200** Success **401** Unauthorized **404** Company/User not found get/account/v2/companies/{companyUuid}/memberships/{userUuid}/checklist https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid}/checklist https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid}/checklist ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D/checklist ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/CompanyMemberships/operation/resource_Company_inviteManagedUser_POST)Invite a managed user Invite a managed user as a member of a marketplace company. If the user is a member of a managed company, the managed company identifier must be used in this request. The operation will then also convert the managed company to a regular company. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ##### query Parameters | | | | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | inviterUuid | stringUnique identifier of the inviter in the API request. Required only when ROLE\_PARTNER authority/scope is used to make the API request. | ### Responses **204** Success **401** Unauthorized **404** Company/ManagedUser/Inviter not found post/account/v2/companies/{companyUuid}/memberships/{userUuid}/invite https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid}/invite https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid}/invite ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D/invite?inviterUuid=SOME_STRING_VALUE' ``` ## [](#tag/CompanyMemberships/operation/resource_Company_requestPurchase_POST)Request to purchase an application Request to purchase an application for the given marketplace company and user. This causes an email notification to be sent to company administrators (system and billing admins). ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as current user matches the user in path. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | --------------------- | ------------------------------------------------------- | | applicationIdrequired | integerUnique identifier of application to purchase | | companyUuidrequired | stringUnique identifier of company in the API request | | userUuidrequired | stringUser Unique identifier of user in the API request | ### Responses **204** Success **401** Unauthorized **404** Company/User/Membership/Application not found **409** Application already purchased post/account/v2/companies/{companyUuid}/memberships/{userUuid}/applications/{applicationId}/purchaseRequests https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid}/applications/{applicationId}/purchaseRequests https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid}/applications/{applicationId}/purchaseRequests ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D/applications/%7BapplicationId%7D/purchaseRequests ``` ## [](#tag/CompanyMemberships/operation/resource_Company_readUserAssignments_GET)List application assignments for company membership Retrieve a marketplace user's application assignments. Returns assignments that are not FAILED or CANCELLED. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ### Responses **200** Success **401** Unauthorized **404** Company/User not found get/account/v2/companies/{companyUuid}/memberships/{userUuid}/assignments https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid}/assignments https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid}/assignments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D/assignments ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/CompanyMemberships/operation/resource_Company_readAssignableRoles_GET)Read assignable roles for company membership Retrieve marketplace roles that can be assigned by this company membership. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as current user matches the user in path. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ### Responses **200** Success **401** Unauthorized **404** Company/User/Membership not found get/account/v2/companies/{companyUuid}/memberships/{userUuid}/assignableRoles https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid}/assignableRoles https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid}/assignableRoles ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D/assignableRoles ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/CompanyMemberships/operation/resource_readCompanyAssignableRoles_GET)Read company assignable roles Retrieves a list of marketplace roles that the current, logged-in user can assign to any user in any marketplace company. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. ##### path Parameters | | | | ------------------- | -------------------------------------- | | companyUuidrequired | stringUnique identifier of the company | ### Responses **200** Success **401** Unauthorized **404** Company not found get/account/v2/companies/{companyUuid}/assignableRoles https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/assignableRoles https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/assignableRoles ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/assignableRoles ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/CompanyMemberships/operation/resource_Group_readCompanyGroupsForUser_GET)List groups for company membership Retrieve the list of groups the company membership is in. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as an end user in the company * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ##### query Parameters | | | | ---------- | ---------------------------------------------------------------------- | | ldap | booleanSet to true when company is externally managed | | page | integerDefault:0Zero-based page index | | searchText | stringSearch term used to search on group name and description | | size | integerDefault:50The size of the page to be returned | | sortField | stringDefault:"createdOn" | | sortOrder | stringDefault:"DESC"Enum: "ASC" "DESC" | ### Responses **200** Success **401** Unauthorized **404** Company/User not found get/account/v2/companies/{companyUuid}/memberships/{userUuid}/groups https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid}/groups https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid}/groups ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D/groups?ldap=SOME_BOOLEAN_VALUE&page=SOME_INTEGER_VALUE&searchText=SOME_STRING_VALUE&size=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample # [](#tag/InboundEvents)Content Events ## [](#tag/InboundEvents/operation/events)Publish content events Publishes content events that contain new or changed data in referenced resources. To access this API, you must configure product-scoped OAuth2 authentication for your application. ##### Required Scopes and Authorization Rules * `ROLE_APPLICATION` - Allows access as the Developer that owns the Product. ##### Request Body schema: application/jsonrequired All information about a change to data in a referenced resource, including the resource key, change description, changes to fields, user access, and content. | | | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | eventMetadata | object (EventMetadata)Metadata for Search content | | keyrequired | object (Key)Identify a resource | | actor | object (ContentEventActor)Identify the application user by identifier (accountName) and name.Required parameters: Only identifier is required to identify a user. | | action | object (Action)An action statement that can be used to describe changes that appear in feeds. The statement is constructed of a verb suffixed by text. For example: Verb (assigned) + text (a task) = action description (assigned a task). If delete boolean is true, the resource is deleted from Customer Search.Required parameters: Only Text and Verb are required in requests to create action statements. Only delete is required to delete a resource. | | changes | object (Changes)Changes to a resource connected to Search | | contents | Array of objects (Content)Content items associated with the resource | ### Responses **200** Success **400** Input is invalid or malformed **401** Unauthorized to publish this event **500** An internal error occurred during event processing post/appwise/v2/data https\://marketplace.appdirect.com/api/appwise/v2/data https\://virtserver.swaggerhub.com/appwise/v2/data ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "eventMetadata": { "id": "6ed0279c-35ed-4c7e-928e-25e46c080431", "type": "ResourceUpdated", "timestamp": "2020-06-11T15:23:45Z" }, "key": { "source": "b2fc6737-3d3f-4da2-afda-f80f25b89af9", "instance": "myclient.myapp.com", "resourceId": "order-12345", "timestamp": 1500558736123 }, "actor": { "identifier": "bob@a13a9998-e025-4751-8fee-72afdc0fe6d5@2cc88871-e942-4910-96e3-0521d7ae52f4", "name": "Bob Roberts" }, "action": { "verb": "assigned", "text": "a task" }, "changes": { "fields": [ { "name": "projectStatus", "value": "In progress", "label": "Project Status", "op": "replace", "display": "expanded" } ], "users": [ { "identifier": "bob@a13a9998-e025-4751-8fee-72afdc0fe6d5@2cc88871-e942-4910-96e3-0521d7ae52f4", "name": "Bob Roberts" } ], "groups": [ { "identifier": "c390a4bf-4f54-418a-87ca-5970c332ba17" } ] }, "contents": [ { "url": "https://myapp.com/orders/1234", "previewUrl": "https://myapp.com/orders/1234?preview", "title": "Order request", "searchText": "string", "mimeType": "application/pdf", "linkedToResource": true } ] }` ### Response samples * 200 * 400 * 401 * 500 Content type application/json Copy `{ }` # [](#tag/CurrencyExchangeRate)Currency Exchange Rate ## [](#tag/CurrencyExchangeRate/operation/resource_Other_currencyExchangeRates_GET)Read all Currency Exchange Rates Retrieve all of the current and historical exchange rates set on the marketplace. ##### query Parameters | | | | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | baseCurrency | stringEnum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ"The base currency filter. Optional. | | counterCurrency | stringEnum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ"The counter currency filter. Optional. | | page | integerDefault:0The page number. Optional. | | size | integerDefault:20The number of application returned by page. Optional. | | sortField | stringDefault:"VALID\_FROM"Enum: "BASE\_CURRENCY" "COUNTER\_CURRENCY" "VALID\_FROM"The order field. Optional. | | sortOrder | stringDefault:"DESC"Enum: "ASC" "DESC"The sort direction. Optional. | ### Responses **200** OK **404** Not Found get/channel/v1/exchangeRates https\://marketplace.appdirect.com/api/channel/v1/exchangeRates https\://virtserver.swaggerhub.com/channel/v1/exchangeRates ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/exchangeRates?baseCurrency=SOME_STRING_VALUE&counterCurrency=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "baseCurrency": "USD", "counterCurrency": "CAD", "rate": 1.25, "validFrom": 1507077229000, "active": true, "authenticationType": "CHANNEL_CONSUMER_LOGIN", "oauthKey": "dNcCBthw82", "userId": 1111, "currencyExchangeRateUuid": "9ec1a010-2814-42c9-a9e0-44ed1f5895f0" } ], "page": { "size": 20, "totalElements": 50, "totalPages": 3, "number": 0 }, "links": [ { "rel": "next", "href": "http://appdirect/api/channel/v1/exchangeRates?page=1" } ] }` ## [](#tag/CurrencyExchangeRate/operation/resource_Other_currencyExchangeRates_POST)Create new Currency Exchange Rate Define a new exchange rate to be used when custom metered usage is reported to your marketplace by a Developer in a currency that isn't supported by your marketplace. This enables you to invoice your customers in your marketplace currency, even though a Developer's external price list for metered usage charges (like Amazon Web Services) might be in a different currency. ##### Request Body schema: application/json The new Currency Exchange Rate | | | | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | baseCurrencyrequired | string (Currency)Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Supported currencies for the system | | counterCurrencyrequired | string (Currency)Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Supported currencies for the system | | raterequired | numberA currency pair is the quotation and pricing structure of the currencies traded in a forex market. A Currency Pair is represented as XXX/YYY where XXX is the Base currency and YYY is the Counter currency.In AppDirect the Base currency is an external currency and the Counter currency is a supported currency in your marketplace.When an exchange rate is provided with a Currency Pair, it represents how much of the Counter currency is required to purchase 1 unit of the Base currency. EUR/USD=1.18; EUR is the Base currency and USD is the counter currency. 1 EUR is equal to 1.18 USD. In order to buy 1 EUR, the buyer must pay 1.18 USD. | ### Responses **200** OK **404** Not Found post/channel/v1/exchangeRates https\://marketplace.appdirect.com/api/channel/v1/exchangeRates https\://virtserver.swaggerhub.com/channel/v1/exchangeRates ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "baseCurrency": "USD", "counterCurrency": "CAD", "rate": 0.5 }` ### Response samples * 200 Content type application/json Copy `{ "baseCurrency": "GTQ", "counterCurrency": "INR", "rate": 0.3, "validFrom": 1507077229000, "active": true, "authenticationType": "USER_LOGIN", "oauthKey": "", "userId": 3434556, "currencyExchangeRateUuid": "76b11329-e3a5-4944-93b0-0411c9f63369" }` ## [](#tag/CurrencyExchangeRate/operation/resource_Other_readCurrencyExchangeRate_GET)Read a Currency Exchange Rate Retrieve the details of a specific Currency Exchange Rate. ##### path Parameters | | | | -------------------------------- | ---------------------------------------------------------- | | currencyExchangeRateUuidrequired | stringThe unique identifier of the currency exchange rate. | ### Responses **200** OK **404** Not Found get/channel/v1/exchangeRates/{currencyExchangeRateUuid} https\://marketplace.appdirect.com/api/channel/v1/exchangeRates/{currencyExchangeRateUuid} https\://virtserver.swaggerhub.com/channel/v1/exchangeRates/{currencyExchangeRateUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/channel/v1/exchangeRates/%7BcurrencyExchangeRateUuid%7D ``` ### Response samples * 200 Content type application/json Copy `{ "baseCurrency": "GTQ", "counterCurrency": "INR", "rate": 0.3, "validFrom": 1507077229000, "active": true, "authenticationType": "USER_LOGIN", "oauthKey": "", "userId": 3434556, "currencyExchangeRateUuid": "76b11329-e3a5-4944-93b0-0411c9f63369" }` ## [](#tag/CurrencyExchangeRate/operation/resource_Other_currencyExchangeRate_PATCH)Deactivate a Currency Exchange Rate Deactivate a Currency Exchange Rate. To stop supporting currency exchange on your marketplace, deactivate a rate. This will prevent the exchange rate from being used to convert usage. ##### path Parameters | | | | -------------------------------- | ---------------------------------------------------------- | | currencyExchangeRateUuidrequired | stringThe unique identifier of the currency exchange rate. | ##### Request Body schema: application/json Currency Exchange Rate active | | | | ------ | ----------------------------------------------------------------------------- | | active | booleanCurrency Exchange Rates can be only deactivated. Allowed value: false. | ### Responses **200** OK **404** Not Found patch/channel/v1/exchangeRates/{currencyExchangeRateUuid} https\://marketplace.appdirect.com/api/channel/v1/exchangeRates/{currencyExchangeRateUuid} https\://virtserver.swaggerhub.com/channel/v1/exchangeRates/{currencyExchangeRateUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "active": true }` ### Response samples * 200 Content type application/json Copy `{ "baseCurrency": "GTQ", "counterCurrency": "INR", "rate": 0.3, "validFrom": 1507077229000, "active": true, "authenticationType": "USER_LOGIN", "oauthKey": "", "userId": 3434556, "currencyExchangeRateUuid": "76b11329-e3a5-4944-93b0-0411c9f63369" }` # [](#tag/CustomerNotification)Customer Notifications API endpoint to manage notification templates (email and sms) that are used to communicate with users on the marketplace when a event occurs on the marketplace that requires a notification to users. ## [](#tag/CustomerNotification/operation/resource_NotificationTemplateApi_getNotificationSmsTemplate_GET)Retrieve an SMS template by type This call returns all details for a specific sms template type. ##### path Parameters | | | | ------------ | ----------------------- | | typerequired | stringSms template type | ##### query Parameters | | | | ----------- | ------------------------------------------------------------------ | | directSales | booleanDefault:falseGet the developer sms tempalte | ### Responses **200** SMS template read. **404** Customized SMS template or default SMS template not found. **default** Unexpected error. get/notification/v1/templates/sms/{type} https\://marketplace.appdirect.com/api/notification/v1/templates/sms/{type} https\://virtserver.swaggerhub.com/notification/v1/templates/sms/{type} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/notification/v1/templates/sms/%7Btype%7D?directSales=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 Content type application/json Copy `{ "id": 269, "type": "ACCOUNT_ACTIVATION", "Subject": "subject...", "locale": "en_US", "content": "activate that bad boy", "enabled": true, "directSales": false }` ## [](#tag/CustomerNotification/operation/resource_NotificationTemplateApi_getTemplateDefinitions_GET)List notification templates List notification templates for the current channel ##### query Parameters | | | | ----------- | ----------------------------------------------------------------------------------- | | directSales | booleanDefault:falseList only the developers notification templates | ### Responses **200** Read notification templates successfully. **default** Unexpected error. get/notification/v1/templates https\://marketplace.appdirect.com/api/notification/v1/templates https\://virtserver.swaggerhub.com/notification/v1/templates ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/notification/v1/templates?directSales=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `[ { "type": "ACCOUNT_ACTIVATION", "audience": "NEW_USER", "category": "ACCOUNTS", "methods": [ { "method": "EMAIL", "enabled": true }, { "method": "SMS", "enabled": true } ], "reminder": "NONE", "generated": false, "required": true }, { "type": "ACCOUNT_ACTIVATION_AFTER_MIGRATION", "audience": "NEW_USER", "category": "ACCOUNTS", "methods": [ { "method": "EMAIL", "enabled": true } ], "reminder": "NONE", "generated": false, "required": false }, { "type": "BRANDED_ACCOUNT_ACTIVATION", "audience": "NEW_USER", "category": "ACCOUNTS", "methods": [ { "method": "EMAIL", "enabled": true } ], "reminder": "NONE", "generated": false, "required": true }, { "type": "ACCOUNT_ACTIVATION_CREATED_BY_ASSISTED_SALES", "audience": "NEW_USER", "category": "ACCOUNTS", "methods": [ { "method": "EMAIL", "enabled": true } ], "reminder": "NONE", "generated": false, "required": false }, { "type": "ACTIVE_USER_TEMP_PASSWORD", "audience": "NEW_USER", "category": "ACCOUNTS", "methods": [ { "method": "EMAIL", "enabled": true } ], "reminder": "NONE", "generated": false, "required": false }, { "type": "NEW_USER", "audience": "NEW_USER", "category": "ACCOUNTS", "methods": [ { "method": "EMAIL", "enabled": true }, { "method": "SMS", "enabled": true } ], "reminder": "NONE", "generated": false, "required": true } ]` ## [](#tag/CustomerNotification/operation/resource_NotificationTemplateApi_createOrUpdateCommonEmailTemplate_POST)Create or update a common email template element This call allows you to create a new template element (for example, a variable) or update an existing one. ##### Request Body schema: application/json Common element definition | | | | -------------------- | ------------------------------------------------------------------------------------------ | | contentrequired | stringEmail notification content | | defaultCommonElement | booleanIf the elements are default common elements | | enabled | booleanIf the email template is enabled | | id | numberEmail notification template ID | | localerequired | stringEmail notification locale to determine the language | | partner | stringPartner being used to render the email | | typerequired | string (NotificationCommonElementType)Value: "UNSUBSCRIBE" | ### Responses **200** Read notification common elements successfully. **default** Unexpected error. post/notification/v1/templates/common/email https\://marketplace.appdirect.com/api/notification/v1/templates/common/email https\://virtserver.swaggerhub.com/notification/v1/templates/common/email ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "content": "string", "defaultCommonElement": true, "enabled": true, "id": 0, "locale": "string", "partner": "string", "type": "UNSUBSCRIBE" }` ### Response samples * 200 Content type application/json Copy `{ "id": 3, "type": "UNSUBSCRIBE", "content": "This is a test.", "locale": "en_US", "enabled": true, "partner": "APPDIRECT", "defaultCommonElement": false }` ## [](#tag/CustomerNotification/operation/resource_NotificationTemplateApi_getNotificationTemplateParameters_GET)List all notification parameters for a notification type This call returns all parameter details from a notification template for a specified template type. ##### path Parameters | | | | ------------ | ----------------------- | | typerequired | stringNotification type | ### Responses **200** Success **default** Unexpected error. get/notification/v1/templates/parameters/{type} https\://marketplace.appdirect.com/api/notification/v1/templates/parameters/{type} https\://virtserver.swaggerhub.com/notification/v1/templates/parameters/{type} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/notification/v1/templates/parameters/%7Btype%7D ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `[ { "parameterName": "{SUPPORT_EMAIL}", "type": "SUPPORT_EMAIL", "valueType": "SINGLE" }, { "parameterName": "{BASE_URL}", "type": "BASE_URL", "valueType": "SINGLE" }, { "parameterName": "{SUPPORT_PHONE}", "type": "SUPPORT_PHONE", "valueType": "SINGLE" }, { "parameterName": "{ACTIVATION_URL}", "type": "ACTIVATION_URL", "valueType": "SINGLE" }, { "parameterName": "{COMPANY_NAME}", "type": "COMPANY_NAME", "valueType": "SINGLE" }, { "parameterName": "{PARTNER_LABEL}", "type": "PARTNER_LABEL", "valueType": "SINGLE" }, { "parameterName": "{PARTNER_STORE_LABEL}", "type": "PARTNER_STORE_LABEL", "valueType": "SINGLE" }, { "parameterName": "{USER_EMAIL}", "type": "USER_EMAIL", "valueType": "SINGLE" }, { "parameterName": "{ACTIVATION_TOKEN}", "type": "ACTIVATION_TOKEN", "valueType": "SINGLE" }, { "parameterName": "{SUPPORT_URL}", "type": "SUPPORT_URL", "valueType": "SINGLE" }, { "parameterName": "{MARKETPLACE_LOGO_URL}", "type": "MARKETPLACE_LOGO_URL", "valueType": "SINGLE" } ]` ## [](#tag/CustomerNotification/operation/resource_NotificationTemplateApi_getNotificationEmailTemplate_GET)Retrieve an email template by type This call returns all details from a specific email template type. ##### path Parameters | | | | ------------ | ------------------------- | | typerequired | stringEmail template type | ##### query Parameters | | | | ----------- | -------------------------------------------------------------------- | | directSales | booleanDefault:falseGet the developer email template | ### Responses **200** Email template read. **404** Customized email template or default email template not found. **default** Unexpected error. get/notification/v1/templates/email/{type} https\://marketplace.appdirect.com/api/notification/v1/templates/email/{type} https\://virtserver.swaggerhub.com/notification/v1/templates/email/{type} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/notification/v1/templates/email/%7Btype%7D?directSales=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 Content type application/json Copy `{ "id": 2, "type": "ACCOUNT_ACTIVATION", "locale": "en_US", "subject": "Please verify your email address for {PARTNER_LABEL}", "content": "Hello,
Congratulations! You have a new {PARTNER_STORE_LABEL} account ready to be activated.
Your account has been created with the username {USER_EMAIL}
To activate your account please use the following link:
{ACTIVATION_URL}

If you have any questions, our Support Team is standing by. You can
email us at {SUPPORT_EMAIL}, call us at {SUPPORT_PHONE},
or start a chat with us on the website at {SUPPORT_URL}.
\n
Thank you!
Your friends at {PARTNER_LABEL}", "enabled": true, "reminderPattern": "pattern...", "directSales": false, "defaultTemplate": false, "partner": "APPDIRECT", "fallbackEmailTemplateId": 10 }` ## [](#tag/CustomerNotification/operation/resource_NotificationTemplateApi_createOrUpdateSmsTemplate_POST)Create or update an sms template This call create a new element or updates an existing SMS template. ##### Request Body schema: application/json Sms Template definition | | | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | contentrequired | stringSMS notification content | | directSales | booleanIf the template is used for a direct sale product | | enabled | booleanIf the SMS template is enabled | | id | numberSMS notification template ID | | localerequired | stringSMS notification locale to determine the language | | typerequired | string (NotificationTemplateType)Enum: "ACCOUNT\_ACTIVATION" "ACCOUNT\_ACTIVATION\_AFTER\_MIGRATION" "BRANDED\_ACCOUNT\_ACTIVATION" "ACCOUNT\_ACTIVATION\_CREATED\_BY\_ASSISTED\_SALES" "ACTIVE\_USER\_TEMP\_PASSWORD" "NEW\_USER" "INVITE\_USER" "BAAS\_MARKETPLACE\_SIGN\_UP\_REQUEST" "LISTING\_MARKETPLACE\_SIGN\_UP\_REQUEST" "STORE\_MARKETPLACE\_SIGN\_UP\_REQUEST" "LISTING\_MARKETPLACE\_SIGN\_UP\_REMINDER" "STORE\_MARKETPLACE\_SIGN\_UP\_REMINDER" "PASSWORD\_RESET" "PASSWORD\_CHANGED\_NOTICE" "PRIMARY\_EMAIL\_CHANGED\_NOTICE" "EMAIL\_VERIFICATION" "IMPERSONATE\_REQUEST" "PASSWORD\_REMINDER" "REGISTRATION\_REMINDER" "FIRST\_TIME\_LOGIN" "INACTIVE\_USER\_LOGIN\_REMINDER" "INACTIVE\_USER\_PURCHASE\_REMINDER" "ACCOUNT\_ACTIVATION\_FOR\_EMAIL\_CHANGE" "TWO\_FACTOR\_AUTHENTICATION\_EMAIL" "ASSIGNMENT\_NOTICE" "UNASSIGNMENT\_NOTICE" "ASSIGNED\_USERS\_LIMIT" "ADOPTION\_NOTICE" "SUBSCRIPTION\_ADOPTION" "APPLICATION\_ACCESS\_REQUEST\_NOTICE" "APPLICATION\_PURCHASE\_REQUEST\_NOTICE" "EXPIRED\_APPLICATION\_REQUEST" "SUSPENDED\_APPLICATION\_REQUEST" "UPDATED\_DOWNLOAD" "REVIEW\_PURCHASE\_REMINDER" "DENY\_REVIEW" "DISCOUNT\_DEACTIVATED" "CHANGE\_OWNERSHIP" "REACTIVATE\_DOMAIN" "SUBSCRIPTION\_ORDER" "SUBSCRIPTION\_ORDER\_SINGLE\_USER" "SUBSCRIPTION\_ORDER\_FREE\_TRIAL" "PERSONAL\_SUBSCRIPTION\_NOTICE" "SUBSCRIPTION\_ORDER\_DOCUMENT" "SUBSCRIPTION\_ORDER\_MODULE" "FAILED\_ORDER" "SUBSCRIPTION\_UPGRADE" "FREE\_TRIAL\_OVER" "FREE\_TRIAL\_AUTO\_UPGRADE\_TO\_PAID" "EXPIRED\_TRIAL\_UPGRADE\_REMINDER" "INVOICE" "PAYMENT\_SUCCESSFUL" "PAYMENT\_FAILED" "REFUND" "EXPIRED\_CREDIT\_CARD" "SUBSCRIPTION\_SUSPENDED\_OVERDUE\_INVOICE" "SUBSCRIPTION\_SUSPENDED" "SUBSCRIPTION\_CANCEL" "SUBSCRIPTION\_CANCEL\_SCHEDULED" "SCHEDULED\_CANCELLATION\_REMINDER" "TICKET\_SUPPORT\_SUBSCRIPTION\_CANCEL" "FAILED\_TO\_REMOVE\_USER" "FAILED\_TO\_REMOVE\_USER\_HAS\_ACTIVE\_OR\_PENDING\_APPS" "FAILED\_TO\_REMOVE\_USER\_OWNS\_APPS" "FAILED\_TO\_REMOVE\_USER\_SOLE\_SYSADMIN" "END\_OF\_CONTRACT" "OFF\_PURCHASE\_ORDER" "ORDER\_APPROVAL\_REQUEST" "SUBSCRIPTION\_ORDER\_RESELLER" "SUBSCRIPTION\_CHANGE\_RESELLER" "PUBLISH\_REQUEST\_PENDING\_APPROVAL" "APPLICATION\_PUBLISHED" "PUBLISH\_DENIED" "VENDOR\_NOTIFICATION" "VENDOR\_REVIEW" "QUESTION\_ASKED" "VENDOR\_PUBLISH\_REQUEST" "NETWORK\_APPLICATION\_REPUBLISHED" "MANUAL\_EVENT\_RESOLUTION" "NEW\_REPORT\_AVAILABLE" "REPORT\_GENERATED" "REPORT\_SUMMARY" "NEW\_REPORT\_SPECIFIC\_NOTIFICATION" "OFFLINE\_ORDER" "OFFLINE\_ASSIGNMENT" "PRODUCT\_CREDENTIALS" "MOSI\_BOOST\_FAILURE" "CREST\_NEW\_ADMIN" "MOSI\_NEW\_ADMIN" "MOSI\_NEW\_USER" "MOSI\_UPDATE\_USERNAME" "MOSI\_ORDER\_PLACED" "GOOGLE\_NEW\_ADMIN\_USER" "GOOGLE\_NEW\_USER" "SENDGRID\_PURCHASE" "MCAFEE\_PURCHASE" "SCALEXTREME\_ACCOUNT" "SYMANTEC\_CLOUD\_NEW\_ACCOUNT" "SYMANTEC\_CLOUD\_OLD\_ACCOUNT" "SYMANTEC\_EV\_CLOUD\_NOTIFICATION" "MOZY\_NEW\_USER" "NORTON\_NEW\_USER\_PC" "WEBEX\_NEW\_USER" "ASYNCHRONOUS\_PRODUCT\_PURCHASE\_NOTIFICATION" "MARKETPLACE\_REQUEST\_TO\_ADD\_PRODUCT" "VENDOR\_ADD\_REQUEST" "PRODUCT\_ADDED" "VENDOR\_APPROVED" "AZURE\_SYNC\_INVITE\_NEW\_USER" "AZURE\_SYNC\_INVITE\_USER" "DOCUSIGN\_PURCHASE" "DOCUSIGN\_ASSIGN" "RESELLER\_LINKED" "RESELLER\_UNLINKED" "RESELLER\_SIGNUP\_REQUESTED" "RESELLER\_SIGNUP\_APPROVED" "RESELLER\_SIGNUP\_DENIED" "TBILL\_VALIDATION" "TBILL\_APPROVED\_USER\_NOTIFICATION" "TBILL\_REJECTED\_USER\_NOTIFICATION" "TBILL\_APPROVED\_CHANNEL\_NOTIFICATION" "TBILL\_REJECTED\_CHANNEL\_NOTIFICATION" "TBILL\_INVALID\_NOTIFICATION" "LEFTRONIC\_ACCOUNT\_ACTIVATION" "DOMAIN\_REGISTRATION\_DOMAIN\_PURCHASED\_NEW" "DOMAIN\_REGISTRATION\_DOMAIN\_PURCHASED\_TRANSFER" "DOMAIN\_REGISTRATION\_DOMAIN\_TRANSFER\_COMPLETE" "DOMAIN\_REGISTRATION\_END\_OF\_CONTRACT" "DOMAIN\_REGISTRATION\_END\_OF\_CONTRACT\_MANUAL\_RENEWAL" "DOMAIN\_REGISTRATION\_DOMAIN\_SUSPENDED" "DOMAIN\_REGISTRATION\_DOMAIN\_CANCELED" "O365\_RESET\_DOMAIN\_USER\_PASSWORDS" "SALES\_LEAD\_CREATED" "SALES\_LEAD\_ACCEPTED" "SALES\_LEAD\_DENIED" "SALES\_LEAD\_ASSIGNED" "SALES\_LEAD\_WON" "SALES\_LEAD\_LOST" "LEAD\_PRODUCT\_CREATED\_ADMIN" "LEAD\_MANUAL\_CREATED\_RESELLER" "LEAD\_MANUAL\_CREATED\_DEVELOPER" "LEAD\_PRODUCT\_CREATED\_SSR" "LEAD\_REFERRED\_COMPANY\_SSR" "LEAD\_REFERRED\_COMPANY\_RESELLER" "LEAD\_CONVERTED\_ADMIN" "LEAD\_CONVERTED\_SSR" "PRODUCT\_PROFILE\_LEAD\_CREATED" "CUSTOM\_AD\_HOC" "SALES\_OPPORTUNITY\_CREATED" "SALES\_OPPORTUNITY\_APPROVED" "SALES\_OPPORTUNITY\_DENIED" "RESELLER\_PROFILE\_PUBLICATION\_REQUESTED" "RESELLER\_PROFILE\_PUBLICATION\_REQUEST\_CANCELLED" "RESELLER\_PROFILE\_UNPUBLISHED" "RESELLER\_PROFILE\_PUBLICATION\_APPROVED" "RESELLER\_PROFILE\_PUBLICATION\_DENIED" "MICROSOFT\_CREDENTIALS\_SENT" "FAILED\_CONTRACT" "WHOLESALES\_PRICE\_END\_USER\_ACTION\_PENDING\_PRICE\_GRANTED" "WHOLESALE\_PRICE\_END\_USER\_ACTION\_PENDING\_PRICE\_GRANTED\_BY\_SALES\_SUPPORT" "WHOLESALE\_PRICE\_END\_USER\_ACTION\_PENDING\_REJECTED" "WHOLESALE\_PRICE\_END\_USER\_ACTION\_PENDING\_REJECTED\_BY\_CHANNEL" "WHOLESALES\_PRICE\_RESELLER\_ACTION\_PENDING\_PRICE\_REQUESTED" "WHOLESALE\_PRICE\_SALES\_SUPPORT\_ACTION\_PENDING\_PRICE\_REQUESTED" "WHOLESALES\_PRICE\_RESELLER\_ACTION\_PENDING\_PRICE\_REQUESTED\_FOR\_COMPANY\_ADMIN" "WHOLESALE\_PRICE\_RESELLER\_ACTION\_PENDING\_REJECTED\_BY\_RESELLER\_MANAGER" "WHOLESALE\_PRICE\_SALES\_SUPPORT\_ACTION\_PENDING\_REJECTED\_BY\_CHANNEL\_ADMIN" "WHOLESALE\_PRICE\_RESELLER\_ACTION\_PENDING\_REJECTED\_BY\_END\_USER" "WHOLESALE\_PRICE\_SALES\_SUPPORT\_ACTION\_PENDING\_REJECTED\_BY\_END\_USER" "WHOLESALES\_PRICE\_RESELLER\_ACTION\_PENDING\_MANAGER\_APPROVED" "WHOLESALES\_PRICE\_RESELLER\_MANAGER\_ACTION\_PENDING\_PRICE\_REQUESTED" "WHOLESALES\_PRICE\_RESELLER\_MANAGER\_ACTION\_PENDING\_PRICE\_REQUESTED\_FOR\_CHANNEL\_ADMIN" "API\_ALERT" "WELCOME\_USER" "CREDIT\_CARD\_REQUIRED" | ### Responses **200** Read notification common elements successfully. **default** Unexpected error. post/notification/v1/templates/sms https\://marketplace.appdirect.com/api/notification/v1/templates/sms https\://virtserver.swaggerhub.com/notification/v1/templates/sms ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "content": "string", "directSales": true, "enabled": true, "id": 0, "locale": "string", "type": "ACCOUNT_ACTIVATION" }` ### Response samples * 200 Content type application/json Copy `{ "id": 1, "type": "ACCOUNT_ACTIVATION", "locale": "en_US", "content": "This is a test.", "enabled": true, "directSales": false }` ## [](#tag/CustomerNotification/operation/resource_NotificationTemplateApi_createOrUpdateEmailTemplate_POST)Create or update an email template This call creates a new email template or updates an existing template. ##### Request Body schema: application/json Template definition | | | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | contentrequired | stringEmail notification content | | defaultTemplate | booleanIf the template is a default template of it's kind | | directSales | booleanIf the template is used for a direct sale product | | enabled | booleanIf the email template is enabled | | fallbackEmailTemplateId | numberThe ID of the template to fallback to if current one is disabled or not existing | | id | numberEmail notification template ID | | localerequired | stringEmail notification locale to determine the language | | partner | stringPartner being used to render the email | | reminderPattern | stringNotification reminder pattern | | subjectrequired | stringEmail notification subject | | typerequired | string (NotificationTemplateType)Enum: "ACCOUNT\_ACTIVATION" "ACCOUNT\_ACTIVATION\_AFTER\_MIGRATION" "BRANDED\_ACCOUNT\_ACTIVATION" "ACCOUNT\_ACTIVATION\_CREATED\_BY\_ASSISTED\_SALES" "ACTIVE\_USER\_TEMP\_PASSWORD" "NEW\_USER" "INVITE\_USER" "BAAS\_MARKETPLACE\_SIGN\_UP\_REQUEST" "LISTING\_MARKETPLACE\_SIGN\_UP\_REQUEST" "STORE\_MARKETPLACE\_SIGN\_UP\_REQUEST" "LISTING\_MARKETPLACE\_SIGN\_UP\_REMINDER" "STORE\_MARKETPLACE\_SIGN\_UP\_REMINDER" "PASSWORD\_RESET" "PASSWORD\_CHANGED\_NOTICE" "PRIMARY\_EMAIL\_CHANGED\_NOTICE" "EMAIL\_VERIFICATION" "IMPERSONATE\_REQUEST" "PASSWORD\_REMINDER" "REGISTRATION\_REMINDER" "FIRST\_TIME\_LOGIN" "INACTIVE\_USER\_LOGIN\_REMINDER" "INACTIVE\_USER\_PURCHASE\_REMINDER" "ACCOUNT\_ACTIVATION\_FOR\_EMAIL\_CHANGE" "TWO\_FACTOR\_AUTHENTICATION\_EMAIL" "ASSIGNMENT\_NOTICE" "UNASSIGNMENT\_NOTICE" "ASSIGNED\_USERS\_LIMIT" "ADOPTION\_NOTICE" "SUBSCRIPTION\_ADOPTION" "APPLICATION\_ACCESS\_REQUEST\_NOTICE" "APPLICATION\_PURCHASE\_REQUEST\_NOTICE" "EXPIRED\_APPLICATION\_REQUEST" "SUSPENDED\_APPLICATION\_REQUEST" "UPDATED\_DOWNLOAD" "REVIEW\_PURCHASE\_REMINDER" "DENY\_REVIEW" "DISCOUNT\_DEACTIVATED" "CHANGE\_OWNERSHIP" "REACTIVATE\_DOMAIN" "SUBSCRIPTION\_ORDER" "SUBSCRIPTION\_ORDER\_SINGLE\_USER" "SUBSCRIPTION\_ORDER\_FREE\_TRIAL" "PERSONAL\_SUBSCRIPTION\_NOTICE" "SUBSCRIPTION\_ORDER\_DOCUMENT" "SUBSCRIPTION\_ORDER\_MODULE" "FAILED\_ORDER" "SUBSCRIPTION\_UPGRADE" "FREE\_TRIAL\_OVER" "FREE\_TRIAL\_AUTO\_UPGRADE\_TO\_PAID" "EXPIRED\_TRIAL\_UPGRADE\_REMINDER" "INVOICE" "PAYMENT\_SUCCESSFUL" "PAYMENT\_FAILED" "REFUND" "EXPIRED\_CREDIT\_CARD" "SUBSCRIPTION\_SUSPENDED\_OVERDUE\_INVOICE" "SUBSCRIPTION\_SUSPENDED" "SUBSCRIPTION\_CANCEL" "SUBSCRIPTION\_CANCEL\_SCHEDULED" "SCHEDULED\_CANCELLATION\_REMINDER" "TICKET\_SUPPORT\_SUBSCRIPTION\_CANCEL" "FAILED\_TO\_REMOVE\_USER" "FAILED\_TO\_REMOVE\_USER\_HAS\_ACTIVE\_OR\_PENDING\_APPS" "FAILED\_TO\_REMOVE\_USER\_OWNS\_APPS" "FAILED\_TO\_REMOVE\_USER\_SOLE\_SYSADMIN" "END\_OF\_CONTRACT" "OFF\_PURCHASE\_ORDER" "ORDER\_APPROVAL\_REQUEST" "SUBSCRIPTION\_ORDER\_RESELLER" "SUBSCRIPTION\_CHANGE\_RESELLER" "PUBLISH\_REQUEST\_PENDING\_APPROVAL" "APPLICATION\_PUBLISHED" "PUBLISH\_DENIED" "VENDOR\_NOTIFICATION" "VENDOR\_REVIEW" "QUESTION\_ASKED" "VENDOR\_PUBLISH\_REQUEST" "NETWORK\_APPLICATION\_REPUBLISHED" "MANUAL\_EVENT\_RESOLUTION" "NEW\_REPORT\_AVAILABLE" "REPORT\_GENERATED" "REPORT\_SUMMARY" "NEW\_REPORT\_SPECIFIC\_NOTIFICATION" "OFFLINE\_ORDER" "OFFLINE\_ASSIGNMENT" "PRODUCT\_CREDENTIALS" "MOSI\_BOOST\_FAILURE" "CREST\_NEW\_ADMIN" "MOSI\_NEW\_ADMIN" "MOSI\_NEW\_USER" "MOSI\_UPDATE\_USERNAME" "MOSI\_ORDER\_PLACED" "GOOGLE\_NEW\_ADMIN\_USER" "GOOGLE\_NEW\_USER" "SENDGRID\_PURCHASE" "MCAFEE\_PURCHASE" "SCALEXTREME\_ACCOUNT" "SYMANTEC\_CLOUD\_NEW\_ACCOUNT" "SYMANTEC\_CLOUD\_OLD\_ACCOUNT" "SYMANTEC\_EV\_CLOUD\_NOTIFICATION" "MOZY\_NEW\_USER" "NORTON\_NEW\_USER\_PC" "WEBEX\_NEW\_USER" "ASYNCHRONOUS\_PRODUCT\_PURCHASE\_NOTIFICATION" "MARKETPLACE\_REQUEST\_TO\_ADD\_PRODUCT" "VENDOR\_ADD\_REQUEST" "PRODUCT\_ADDED" "VENDOR\_APPROVED" "AZURE\_SYNC\_INVITE\_NEW\_USER" "AZURE\_SYNC\_INVITE\_USER" "DOCUSIGN\_PURCHASE" "DOCUSIGN\_ASSIGN" "RESELLER\_LINKED" "RESELLER\_UNLINKED" "RESELLER\_SIGNUP\_REQUESTED" "RESELLER\_SIGNUP\_APPROVED" "RESELLER\_SIGNUP\_DENIED" "TBILL\_VALIDATION" "TBILL\_APPROVED\_USER\_NOTIFICATION" "TBILL\_REJECTED\_USER\_NOTIFICATION" "TBILL\_APPROVED\_CHANNEL\_NOTIFICATION" "TBILL\_REJECTED\_CHANNEL\_NOTIFICATION" "TBILL\_INVALID\_NOTIFICATION" "LEFTRONIC\_ACCOUNT\_ACTIVATION" "DOMAIN\_REGISTRATION\_DOMAIN\_PURCHASED\_NEW" "DOMAIN\_REGISTRATION\_DOMAIN\_PURCHASED\_TRANSFER" "DOMAIN\_REGISTRATION\_DOMAIN\_TRANSFER\_COMPLETE" "DOMAIN\_REGISTRATION\_END\_OF\_CONTRACT" "DOMAIN\_REGISTRATION\_END\_OF\_CONTRACT\_MANUAL\_RENEWAL" "DOMAIN\_REGISTRATION\_DOMAIN\_SUSPENDED" "DOMAIN\_REGISTRATION\_DOMAIN\_CANCELED" "O365\_RESET\_DOMAIN\_USER\_PASSWORDS" "SALES\_LEAD\_CREATED" "SALES\_LEAD\_ACCEPTED" "SALES\_LEAD\_DENIED" "SALES\_LEAD\_ASSIGNED" "SALES\_LEAD\_WON" "SALES\_LEAD\_LOST" "LEAD\_PRODUCT\_CREATED\_ADMIN" "LEAD\_MANUAL\_CREATED\_RESELLER" "LEAD\_MANUAL\_CREATED\_DEVELOPER" "LEAD\_PRODUCT\_CREATED\_SSR" "LEAD\_REFERRED\_COMPANY\_SSR" "LEAD\_REFERRED\_COMPANY\_RESELLER" "LEAD\_CONVERTED\_ADMIN" "LEAD\_CONVERTED\_SSR" "PRODUCT\_PROFILE\_LEAD\_CREATED" "CUSTOM\_AD\_HOC" "SALES\_OPPORTUNITY\_CREATED" "SALES\_OPPORTUNITY\_APPROVED" "SALES\_OPPORTUNITY\_DENIED" "RESELLER\_PROFILE\_PUBLICATION\_REQUESTED" "RESELLER\_PROFILE\_PUBLICATION\_REQUEST\_CANCELLED" "RESELLER\_PROFILE\_UNPUBLISHED" "RESELLER\_PROFILE\_PUBLICATION\_APPROVED" "RESELLER\_PROFILE\_PUBLICATION\_DENIED" "MICROSOFT\_CREDENTIALS\_SENT" "FAILED\_CONTRACT" "WHOLESALES\_PRICE\_END\_USER\_ACTION\_PENDING\_PRICE\_GRANTED" "WHOLESALE\_PRICE\_END\_USER\_ACTION\_PENDING\_PRICE\_GRANTED\_BY\_SALES\_SUPPORT" "WHOLESALE\_PRICE\_END\_USER\_ACTION\_PENDING\_REJECTED" "WHOLESALE\_PRICE\_END\_USER\_ACTION\_PENDING\_REJECTED\_BY\_CHANNEL" "WHOLESALES\_PRICE\_RESELLER\_ACTION\_PENDING\_PRICE\_REQUESTED" "WHOLESALE\_PRICE\_SALES\_SUPPORT\_ACTION\_PENDING\_PRICE\_REQUESTED" "WHOLESALES\_PRICE\_RESELLER\_ACTION\_PENDING\_PRICE\_REQUESTED\_FOR\_COMPANY\_ADMIN" "WHOLESALE\_PRICE\_RESELLER\_ACTION\_PENDING\_REJECTED\_BY\_RESELLER\_MANAGER" "WHOLESALE\_PRICE\_SALES\_SUPPORT\_ACTION\_PENDING\_REJECTED\_BY\_CHANNEL\_ADMIN" "WHOLESALE\_PRICE\_RESELLER\_ACTION\_PENDING\_REJECTED\_BY\_END\_USER" "WHOLESALE\_PRICE\_SALES\_SUPPORT\_ACTION\_PENDING\_REJECTED\_BY\_END\_USER" "WHOLESALES\_PRICE\_RESELLER\_ACTION\_PENDING\_MANAGER\_APPROVED" "WHOLESALES\_PRICE\_RESELLER\_MANAGER\_ACTION\_PENDING\_PRICE\_REQUESTED" "WHOLESALES\_PRICE\_RESELLER\_MANAGER\_ACTION\_PENDING\_PRICE\_REQUESTED\_FOR\_CHANNEL\_ADMIN" "API\_ALERT" "WELCOME\_USER" "CREDIT\_CARD\_REQUIRED" | ### Responses **200** Read notification common elements successfully. **default** Unexpected error. post/notification/v1/templates/email https\://marketplace.appdirect.com/api/notification/v1/templates/email https\://virtserver.swaggerhub.com/notification/v1/templates/email ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "content": "string", "defaultTemplate": true, "directSales": true, "enabled": true, "fallbackEmailTemplateId": 0, "id": 0, "locale": "string", "partner": "string", "reminderPattern": "string", "subject": "string", "type": "ACCOUNT_ACTIVATION" }` ### Response samples * 200 Content type application/json Copy `{ "id": 573, "type": "ACCOUNT_ACTIVATION", "locale": "en_US", "subject": "Test email", "content": "This is a test.", "enabled": true, "reminderPattern": "pattern...", "directSales": false, "defaultTemplate": false, "partner": "APPDIRECT", "fallbackEmailTemplateId": 1 }` ## [](#tag/CustomerNotification/operation/resource_NotificationTemplateApi_getCommonEmailTemplate_GET)Retrieve common email element by type Retrieve common email element by type for the current channel ##### path Parameters | | | | ------------ | -------------------------------------- | | typerequired | stringNotification common element type | ### Responses **200** Read notification common elements successfully. **default** Unexpected error. get/notification/v1/templates/common/email/{type} https\://marketplace.appdirect.com/api/notification/v1/templates/common/email/{type} https\://virtserver.swaggerhub.com/notification/v1/templates/common/email/{type} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/notification/v1/templates/common/email/%7Btype%7D ``` ### Response samples * 200 Content type application/json Copy `{ "id": 4, "type": "UNSUBSCRIBE", "content": "This is a test.", "locale": "en_US", "enabled": true, "partner": "APPDIRECT", "defaultCommonElement": false }` ## [](#tag/CustomerNotification/operation/resource_NotificationTemplateApi_getCommonTemplatesDefinitions_GET)List notification common elements List common element definitions that is present in each notification that is sent e.g. an unsubscribe message in an email footer. ### Responses **200** Read notification common elements successfully. **default** Unexpected error. get/notification/v1/templates/common https\://marketplace.appdirect.com/api/notification/v1/templates/common https\://virtserver.swaggerhub.com/notification/v1/templates/common ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/notification/v1/templates/common ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `[ { "type": "UNSUBSCRIBE", "position": "BOTTOM", "methods": [ "EMAIL", "SMS" ] } ]` # [](#tag/DataUploader)DataUploader ## [](#tag/DataUploader/operation/resource_DataUploader_updateCatalog_POST)Update product catalog Update an existing product catalog using a CSV file. This endpoint allows you to modify existing product information in the catalog. ##### Request Body schema: multipart/form-datarequired | | | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | filerequired | string<binary>CSV file containing product catalog data to update | | entityTyperequired | stringEnum: "EDITION" "PRICING\_PLAN" "EDITION\_PRICING" "PRODUCT\_SETTING\_GENERAL" "PRODUCT\_SETTING\_CATEGORY" "PRODUCT\_SETTING\_PRODUCT\_LINE" "PRODUCT\_SETTING\_ATTRIBUTE" "MARKETPLACE\_PRICE" "PRODUCTION\_PRICE" "WHOLESALE\_PRICE" "PRODUCT\_CUSTOM\_ATTRIBUTE" "PRODUCT\_BASIC" "PRODUCT\_FEATURE" "PRODUCT\_BENEFIT" "PRODUCT\_MEDIA" "PRODUCT\_FEATURE\_CHARACTERISTIC" "PRODUCT\_IMAGE" "PRICE\_BOOK" "PRODUCT\_INTEGRATION" "PRODUCT\_INTEGRATION\_CREDENTIAL"Type of entity being uploaded (e.g., PRODUCT\_BASIC) | ### Responses **200** Catalog updated successfully **400** Bad request - Invalid file format or entity type **401** Unauthorized **500** Internal server error post/api/v1/product-uploader-api/updateCatalog https\://marketplace.appdirect.com/api/api/v1/product-uploader-api/updateCatalog https\://virtserver.swaggerhub.com/api/v1/product-uploader-api/updateCatalog ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/api/v1/product-uploader-api/updateCatalog \ --header 'content-type: multipart/form-data' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "message": "Uploaded the file successfully", "data": { "file": { "fieldname": "file", "originalname": "test.csv", "encoding": "7bit", "mimetype": "text/csv", "destination": "/app/resources/static/uploads", "filename": "1750151421696_Single CSV Template (69).csv", "path": "/app/resources/static/uploads/1750151421696_Single CSV Template (69).csv", "size": 3420 }, "processId": "4e4b146c-47dd-4b19-ac00-8214ff1e286d" } }` ## [](#tag/DataUploader/operation/resource_DataUploader_createCatalog_POST)Create product catalog Create a new product catalog using a CSV file. This endpoint allows you to create a completely new catalog with product information. ##### Request Body schema: multipart/form-datarequired | | | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | filerequired | string<binary>CSV file containing product catalog data to create | | entityTyperequired | stringEnum: "CATALOG\_CONSOLIDATED" "PRODUCT\_CONSOLIDATED" "PRICE\_BOOK\_SCHEDULE"Type of entity being uploaded (e.g., PRODUCT\_CONSOLIDATED) | ### Responses **200** Catalog created successfully **400** Bad request - Invalid file format or entity type **401** Unauthorized **500** Internal server error post/api/v1/product-uploader-api/createCatalog https\://marketplace.appdirect.com/api/api/v1/product-uploader-api/createCatalog https\://virtserver.swaggerhub.com/api/v1/product-uploader-api/createCatalog ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/api/v1/product-uploader-api/createCatalog \ --header 'content-type: multipart/form-data' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "message": "Uploaded the file successfully", "data": { "file": { "fieldname": "file", "originalname": "Single CSV Template.csv", "encoding": "7bit", "mimetype": "text/csv", "destination": "/app/resources/static/uploads", "filename": "1750151421697_Product Catalog Template.csv", "path": "/app/resources/static/uploads/1750151421697_Product Catalog Template.csv", "size": 5120 }, "processId": "5f5c257d-58ee-5c2a-bd11-9325ff2f397e" } }` ## [](#tag/DataUploader/operation/resource_DataUploader_publishCatalog_POST)Publish product catalog Publish a product catalog using a CSV file. This endpoint makes the catalog available for use in the marketplace. ##### Request Body schema: multipart/form-datarequired | | | | ------------------ | ------------------------------------------------------------------------------------------------- | | filerequired | string<binary>CSV file containing product catalog data to publish | | entityTyperequired | stringValue: "PRODUCT"Type of entity being uploaded (e.g., PRODUCT) | ### Responses **200** Catalog published successfully **400** Bad request - Invalid file format or entity type **401** Unauthorized **500** Internal server error post/api/v1/product-uploader-api/publishCatalog https\://marketplace.appdirect.com/api/api/v1/product-uploader-api/publishCatalog https\://virtserver.swaggerhub.com/api/v1/product-uploader-api/publishCatalog ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/api/v1/product-uploader-api/publishCatalog \ --header 'content-type: multipart/form-data' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "message": "Uploaded the file successfully", "data": { "file": { "fieldname": "file", "originalname": "Publish Catalog Template.csv", "encoding": "7bit", "mimetype": "text/csv", "destination": "/app/resources/static/uploads", "filename": "1750151421698_Publish Catalog Template.csv", "path": "/app/resources/static/uploads/1750151421698_Publish Catalog Template.csv", "size": 2800 }, "processId": "6g6d368e-69ff-6d3b-ce22-0436ff3f408f" } }` # [](#tag/DefaultNotificationTemplateApi)Default Notification Template Api API endpoint to manage default notification templates (email and sms) When a partner have not customized a notification template, the default template will be used to send notification to users if it exists for the required notification template type and required locale. ## [](#tag/DefaultNotificationTemplateApi/operation/resource_DefaultNotificationTemplateApi_getDefaultTemplateDefinitions_GET)Read default notification templates available for the current channel. Read default notification templates available for the current channel. Reserved for super support users. ### Responses **200** Success **default** Unexpected error. get/notification/v1/templates/default https\://marketplace.appdirect.com/api/notification/v1/templates/default https\://virtserver.swaggerhub.com/notification/v1/templates/default ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/notification/v1/templates/default ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `[ { "audience": "NEW_USER", "category": "ACCOUNTS", "generated": true, "methods": [ { "enabled": true, "method": "EMAIL" } ], "reminder": "NONE", "required": true, "type": "ACCOUNT_ACTIVATION" } ]` ## [](#tag/DefaultNotificationTemplateApi/operation/resource_DefaultNotificationTemplateApi_createOrUpdateDefaultCommonEmailTemplate_POST)Create or update a default common email template element. Create or update a default common email template element ##### Request Body schema: application/json Common element definition | | | | -------------------- | ------------------------------------------------------------------------------------------ | | contentrequired | stringEmail notification content | | defaultCommonElement | booleanIf the elements are default common elements | | enabled | booleanIf the email template is enabled | | id | numberEmail notification template ID | | localerequired | stringEmail notification locale to determine the language | | partner | stringPartner being used to render the email | | typerequired | string (NotificationCommonElementType)Value: "UNSUBSCRIBE" | ### Responses **201** Success **default** Unexpected error. post/notification/v1/templates/default/common/email https\://marketplace.appdirect.com/api/notification/v1/templates/default/common/email https\://virtserver.swaggerhub.com/notification/v1/templates/default/common/email ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "content": "string", "defaultCommonElement": true, "enabled": true, "id": 0, "locale": "string", "partner": "string", "type": "UNSUBSCRIBE" }` ## [](#tag/DefaultNotificationTemplateApi/operation/resource_DefaultNotificationTemplateApi_getDefaultCommonEmailTemplate_GET)Read default common email element by type. Read default common email element by type ##### path Parameters | | | | ------------ | -------------------------------------- | | typerequired | stringNotification common element type | ### Responses **200** Success **default** Unexpected error. get/notification/v1/templates/default/common/email/{type} https\://marketplace.appdirect.com/api/notification/v1/templates/default/common/email/{type} https\://virtserver.swaggerhub.com/notification/v1/templates/default/common/email/{type} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/notification/v1/templates/default/common/email/%7Btype%7D ``` ### Response samples * 200 Content type application/json Copy `{ "content": "string", "defaultCommonElement": true, "enabled": true, "id": 0, "locale": "string", "partner": "string", "type": "UNSUBSCRIBE" }` ## [](#tag/DefaultNotificationTemplateApi/operation/resource_DefaultNotificationTemplateApi_createOrUpdateDefaultEmailTemplate_POST)Create or update default email template Create or update default email template. Reserved for super support users. ##### Request Body schema: application/json Template definition | | | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | contentrequired | stringEmail notification content | | defaultTemplate | booleanIf the template is a default template of it's kind | | directSales | booleanIf the template is used for a direct sale product | | enabled | booleanIf the email template is enabled | | fallbackEmailTemplateId | numberThe ID of the template to fallback to if current one is disabled or not existing | | id | numberEmail notification template ID | | localerequired | stringEmail notification locale to determine the language | | partner | stringPartner being used to render the email | | reminderPattern | stringNotification reminder pattern | | subjectrequired | stringEmail notification subject | | typerequired | string (NotificationTemplateType)Enum: "ACCOUNT\_ACTIVATION" "ACCOUNT\_ACTIVATION\_AFTER\_MIGRATION" "BRANDED\_ACCOUNT\_ACTIVATION" "ACCOUNT\_ACTIVATION\_CREATED\_BY\_ASSISTED\_SALES" "ACTIVE\_USER\_TEMP\_PASSWORD" "NEW\_USER" "INVITE\_USER" "BAAS\_MARKETPLACE\_SIGN\_UP\_REQUEST" "LISTING\_MARKETPLACE\_SIGN\_UP\_REQUEST" "STORE\_MARKETPLACE\_SIGN\_UP\_REQUEST" "LISTING\_MARKETPLACE\_SIGN\_UP\_REMINDER" "STORE\_MARKETPLACE\_SIGN\_UP\_REMINDER" "PASSWORD\_RESET" "PASSWORD\_CHANGED\_NOTICE" "PRIMARY\_EMAIL\_CHANGED\_NOTICE" "EMAIL\_VERIFICATION" "IMPERSONATE\_REQUEST" "PASSWORD\_REMINDER" "REGISTRATION\_REMINDER" "FIRST\_TIME\_LOGIN" "INACTIVE\_USER\_LOGIN\_REMINDER" "INACTIVE\_USER\_PURCHASE\_REMINDER" "ACCOUNT\_ACTIVATION\_FOR\_EMAIL\_CHANGE" "TWO\_FACTOR\_AUTHENTICATION\_EMAIL" "ASSIGNMENT\_NOTICE" "UNASSIGNMENT\_NOTICE" "ASSIGNED\_USERS\_LIMIT" "ADOPTION\_NOTICE" "SUBSCRIPTION\_ADOPTION" "APPLICATION\_ACCESS\_REQUEST\_NOTICE" "APPLICATION\_PURCHASE\_REQUEST\_NOTICE" "EXPIRED\_APPLICATION\_REQUEST" "SUSPENDED\_APPLICATION\_REQUEST" "UPDATED\_DOWNLOAD" "REVIEW\_PURCHASE\_REMINDER" "DENY\_REVIEW" "DISCOUNT\_DEACTIVATED" "CHANGE\_OWNERSHIP" "REACTIVATE\_DOMAIN" "SUBSCRIPTION\_ORDER" "SUBSCRIPTION\_ORDER\_SINGLE\_USER" "SUBSCRIPTION\_ORDER\_FREE\_TRIAL" "PERSONAL\_SUBSCRIPTION\_NOTICE" "SUBSCRIPTION\_ORDER\_DOCUMENT" "SUBSCRIPTION\_ORDER\_MODULE" "FAILED\_ORDER" "SUBSCRIPTION\_UPGRADE" "FREE\_TRIAL\_OVER" "FREE\_TRIAL\_AUTO\_UPGRADE\_TO\_PAID" "EXPIRED\_TRIAL\_UPGRADE\_REMINDER" "INVOICE" "PAYMENT\_SUCCESSFUL" "PAYMENT\_FAILED" "REFUND" "EXPIRED\_CREDIT\_CARD" "SUBSCRIPTION\_SUSPENDED\_OVERDUE\_INVOICE" "SUBSCRIPTION\_SUSPENDED" "SUBSCRIPTION\_CANCEL" "SUBSCRIPTION\_CANCEL\_SCHEDULED" "SCHEDULED\_CANCELLATION\_REMINDER" "TICKET\_SUPPORT\_SUBSCRIPTION\_CANCEL" "FAILED\_TO\_REMOVE\_USER" "FAILED\_TO\_REMOVE\_USER\_HAS\_ACTIVE\_OR\_PENDING\_APPS" "FAILED\_TO\_REMOVE\_USER\_OWNS\_APPS" "FAILED\_TO\_REMOVE\_USER\_SOLE\_SYSADMIN" "END\_OF\_CONTRACT" "OFF\_PURCHASE\_ORDER" "ORDER\_APPROVAL\_REQUEST" "SUBSCRIPTION\_ORDER\_RESELLER" "SUBSCRIPTION\_CHANGE\_RESELLER" "PUBLISH\_REQUEST\_PENDING\_APPROVAL" "APPLICATION\_PUBLISHED" "PUBLISH\_DENIED" "VENDOR\_NOTIFICATION" "VENDOR\_REVIEW" "QUESTION\_ASKED" "VENDOR\_PUBLISH\_REQUEST" "NETWORK\_APPLICATION\_REPUBLISHED" "MANUAL\_EVENT\_RESOLUTION" "NEW\_REPORT\_AVAILABLE" "REPORT\_GENERATED" "REPORT\_SUMMARY" "NEW\_REPORT\_SPECIFIC\_NOTIFICATION" "OFFLINE\_ORDER" "OFFLINE\_ASSIGNMENT" "PRODUCT\_CREDENTIALS" "MOSI\_BOOST\_FAILURE" "CREST\_NEW\_ADMIN" "MOSI\_NEW\_ADMIN" "MOSI\_NEW\_USER" "MOSI\_UPDATE\_USERNAME" "MOSI\_ORDER\_PLACED" "GOOGLE\_NEW\_ADMIN\_USER" "GOOGLE\_NEW\_USER" "SENDGRID\_PURCHASE" "MCAFEE\_PURCHASE" "SCALEXTREME\_ACCOUNT" "SYMANTEC\_CLOUD\_NEW\_ACCOUNT" "SYMANTEC\_CLOUD\_OLD\_ACCOUNT" "SYMANTEC\_EV\_CLOUD\_NOTIFICATION" "MOZY\_NEW\_USER" "NORTON\_NEW\_USER\_PC" "WEBEX\_NEW\_USER" "ASYNCHRONOUS\_PRODUCT\_PURCHASE\_NOTIFICATION" "MARKETPLACE\_REQUEST\_TO\_ADD\_PRODUCT" "VENDOR\_ADD\_REQUEST" "PRODUCT\_ADDED" "VENDOR\_APPROVED" "AZURE\_SYNC\_INVITE\_NEW\_USER" "AZURE\_SYNC\_INVITE\_USER" "DOCUSIGN\_PURCHASE" "DOCUSIGN\_ASSIGN" "RESELLER\_LINKED" "RESELLER\_UNLINKED" "RESELLER\_SIGNUP\_REQUESTED" "RESELLER\_SIGNUP\_APPROVED" "RESELLER\_SIGNUP\_DENIED" "TBILL\_VALIDATION" "TBILL\_APPROVED\_USER\_NOTIFICATION" "TBILL\_REJECTED\_USER\_NOTIFICATION" "TBILL\_APPROVED\_CHANNEL\_NOTIFICATION" "TBILL\_REJECTED\_CHANNEL\_NOTIFICATION" "TBILL\_INVALID\_NOTIFICATION" "LEFTRONIC\_ACCOUNT\_ACTIVATION" "DOMAIN\_REGISTRATION\_DOMAIN\_PURCHASED\_NEW" "DOMAIN\_REGISTRATION\_DOMAIN\_PURCHASED\_TRANSFER" "DOMAIN\_REGISTRATION\_DOMAIN\_TRANSFER\_COMPLETE" "DOMAIN\_REGISTRATION\_END\_OF\_CONTRACT" "DOMAIN\_REGISTRATION\_END\_OF\_CONTRACT\_MANUAL\_RENEWAL" "DOMAIN\_REGISTRATION\_DOMAIN\_SUSPENDED" "DOMAIN\_REGISTRATION\_DOMAIN\_CANCELED" "O365\_RESET\_DOMAIN\_USER\_PASSWORDS" "SALES\_LEAD\_CREATED" "SALES\_LEAD\_ACCEPTED" "SALES\_LEAD\_DENIED" "SALES\_LEAD\_ASSIGNED" "SALES\_LEAD\_WON" "SALES\_LEAD\_LOST" "LEAD\_PRODUCT\_CREATED\_ADMIN" "LEAD\_MANUAL\_CREATED\_RESELLER" "LEAD\_MANUAL\_CREATED\_DEVELOPER" "LEAD\_PRODUCT\_CREATED\_SSR" "LEAD\_REFERRED\_COMPANY\_SSR" "LEAD\_REFERRED\_COMPANY\_RESELLER" "LEAD\_CONVERTED\_ADMIN" "LEAD\_CONVERTED\_SSR" "PRODUCT\_PROFILE\_LEAD\_CREATED" "CUSTOM\_AD\_HOC" "SALES\_OPPORTUNITY\_CREATED" "SALES\_OPPORTUNITY\_APPROVED" "SALES\_OPPORTUNITY\_DENIED" "RESELLER\_PROFILE\_PUBLICATION\_REQUESTED" "RESELLER\_PROFILE\_PUBLICATION\_REQUEST\_CANCELLED" "RESELLER\_PROFILE\_UNPUBLISHED" "RESELLER\_PROFILE\_PUBLICATION\_APPROVED" "RESELLER\_PROFILE\_PUBLICATION\_DENIED" "MICROSOFT\_CREDENTIALS\_SENT" "FAILED\_CONTRACT" "WHOLESALES\_PRICE\_END\_USER\_ACTION\_PENDING\_PRICE\_GRANTED" "WHOLESALE\_PRICE\_END\_USER\_ACTION\_PENDING\_PRICE\_GRANTED\_BY\_SALES\_SUPPORT" "WHOLESALE\_PRICE\_END\_USER\_ACTION\_PENDING\_REJECTED" "WHOLESALE\_PRICE\_END\_USER\_ACTION\_PENDING\_REJECTED\_BY\_CHANNEL" "WHOLESALES\_PRICE\_RESELLER\_ACTION\_PENDING\_PRICE\_REQUESTED" "WHOLESALE\_PRICE\_SALES\_SUPPORT\_ACTION\_PENDING\_PRICE\_REQUESTED" "WHOLESALES\_PRICE\_RESELLER\_ACTION\_PENDING\_PRICE\_REQUESTED\_FOR\_COMPANY\_ADMIN" "WHOLESALE\_PRICE\_RESELLER\_ACTION\_PENDING\_REJECTED\_BY\_RESELLER\_MANAGER" "WHOLESALE\_PRICE\_SALES\_SUPPORT\_ACTION\_PENDING\_REJECTED\_BY\_CHANNEL\_ADMIN" "WHOLESALE\_PRICE\_RESELLER\_ACTION\_PENDING\_REJECTED\_BY\_END\_USER" "WHOLESALE\_PRICE\_SALES\_SUPPORT\_ACTION\_PENDING\_REJECTED\_BY\_END\_USER" "WHOLESALES\_PRICE\_RESELLER\_ACTION\_PENDING\_MANAGER\_APPROVED" "WHOLESALES\_PRICE\_RESELLER\_MANAGER\_ACTION\_PENDING\_PRICE\_REQUESTED" "WHOLESALES\_PRICE\_RESELLER\_MANAGER\_ACTION\_PENDING\_PRICE\_REQUESTED\_FOR\_CHANNEL\_ADMIN" "API\_ALERT" "WELCOME\_USER" "CREDIT\_CARD\_REQUIRED" | ### Responses **201** Success **default** Unexpected error. post/notification/v1/templates/default/email https\://marketplace.appdirect.com/api/notification/v1/templates/default/email https\://virtserver.swaggerhub.com/notification/v1/templates/default/email ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "content": "string", "defaultTemplate": true, "directSales": true, "enabled": true, "fallbackEmailTemplateId": 0, "id": 0, "locale": "string", "partner": "string", "reminderPattern": "string", "subject": "string", "type": "ACCOUNT_ACTIVATION" }` ## [](#tag/DefaultNotificationTemplateApi/operation/resource_DefaultNotificationTemplateApi_getDefaultNotificationEmailTemplate_GET)Read default email template by type Read default email template by type. Reserved for super support user. ##### path Parameters | | | | ------------ | ------------------------- | | typerequired | stringEmail template type | ### Responses **200** Success **default** Unexpected error. get/notification/v1/templates/default/email/{type} https\://marketplace.appdirect.com/api/notification/v1/templates/default/email/{type} https\://virtserver.swaggerhub.com/notification/v1/templates/default/email/{type} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/notification/v1/templates/default/email/%7Btype%7D ``` ### Response samples * 200 Content type application/json Copy `{ "content": "string", "defaultTemplate": true, "directSales": true, "enabled": true, "fallbackEmailTemplateId": 0, "id": 0, "locale": "string", "partner": "string", "reminderPattern": "string", "subject": "string", "type": "ACCOUNT_ACTIVATION" }` # [](#tag/Discount)Discounts ## [](#tag/Discount/operation/resource_Other_readDiscounts_GET)List all discounts Lists all available discounts. The parameters can be used to filter the results. ##### query Parameters | | | | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | code | stringDiscount code | | count | integerDefault:250Number of results to fetch. Used for paging. | | sortField | stringDefault:"CREATED\_ON"Enum: "APPLICATION" "CHANNEL" "CODE" "CREATED\_ON" "END\_DATE" "REDEMPTIONS" "START\_DATE"Sort field. Default value is creation date. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order. Default value is ascending. | | start | integerFirst result index. Used for paging. | ### Responses **200** OK **404** Not Found get/channel/v1/discounts https\://marketplace.appdirect.com/api/channel/v1/discounts https\://virtserver.swaggerhub.com/channel/v1/discounts ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/discounts?code=SOME_STRING_VALUE&count=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Discount/operation/resource_Other_createDiscount_POST)Create discounts Creates a discount with the provided data. Note that percentage discounts cannot exceed two decimal places (for example, 10.15). ##### Request Body schema: application/json Discount data object | | | | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | applicationId | number or nullApplication ID. | | applicationUuid | string or nullApplication UUID. | | applicationName | string or nullName of the application to which the discount applies. | | autoApply | booleanTrue if the discount is automatically applied. Default value is true. | | basePartnerSharePercentage | number or nullBase partner's percentage share of the discount. | | billingCycles | number or nullNumber of billing cycles for which the discount should be applied. | | code | string or nullDiscount code. Must be at least 4 characters, but no longer than 103 characters. | | createdOn | number or nullCreation date of the discount. | | descriptionrequired | stringDescription of discount. Required field. Must be at least 4 characters, but no longer than 255 characters. | | editionId | number or nullEdition ID. | | editionUuid | string or nullEdition UUID. | | expirationDate | number or nullExpiration date for the discount. This date must be in the future. | | id | number or nullDiscount ID. | | uuid | string or nullDiscount UUID. | | industryId | number or nullIndustry ID. | | maxRedemptions | number or nullMaximum number of redemptions available. | | maxUnits | numberMaximum number of units for which to apply the discount. | | minUnits | numberMinimum number of units for which to apply the discount. | | partnerSharePercentage | number or nullPartner's percentage share of the discount. | | paymentPlanId | number or nullPayment plan ID. | | paymentPlanUuid | string or nullPayment plan UUID. | | percentage | numberPercentage discount if discount is of PERCENTAGE type. The percentage value cannot exceed two decimal places (for example, 10.15). | | price | number or nullAmount to discount if discount is of FIXED\_PRICE type. | | redemptionRestriction | string (RedemptionRestriction) | | redemptions | numberNumber of times the discount has been redeemed. | | retainable | booleanTrue if the discount is retainable. Retainable discounts can be redeemed on orders that are updated after the discount expires. For example, if an order includes a discount that expires on 01 January 2019, and the order is then updated on 02 January 2019, the discount would still be redeemable. The default value is false (discounts are not retained). | | startDate | number or nullStart date for the discount. | | typerequired | string (DiscountType) | | unit | string (PricingUnit)Enum: "USER" "GIGABYTE" "MEGABYTE" "HOUR" "MINUTE" "INVOICE" "UNIT" "PROJECT" "PROPERTY" "ITEM" "WORD" "EMAIL" "CONTACT" "CALL" "CREDIT" "ROOM" "HOST" "AGENT" "OPERATOR" "PROVIDER" "MANAGER" "TESTER" "JVM" "SERVER" "WEB\_USE\_MINUTE" "AUDIO\_USE\_MINUTE" "PIECE" "EMPLOYEE\_PAY\_PERIOD" "EMPLOYEE\_PER\_PAY\_PERIOD" "COMPUTER" "NOT\_APPLICABLE" "ONE\_TIME\_SETUP" "DATA\_POINTS" "TIER1\_API\_CALLS" "TIER2\_API\_CALLS" "ADVISORY\_HOURS" "OVERAGE\_AUDIO\_MINUTE" "EMPLOYEE" "CONNECTION" "PUSH\_USER" "THOUSAND\_EMAILS\_PER\_DAY" "PUSH\_NOTIFICATION\_DEVICES" "API\_CALLS" "SMS\_TEXT\_MESSAGE" "CONTACTS\_1000" "CONTRACT\_FEE" "TRANSFER\_FEE" "REACTIVATION\_FEE" "RECIPIENT" "ADDITIONAL\_1000\_CONTACTS\_BLOCK" "SCHEDULE\_PLAN" "EMAILS\_1000" "EMAILS\_2500" "MOBILE\_DEVICE" "PAYSLIP" "PAYSLIP\_CORRECTION" "STORE" "WEBSITE" "EPAPER" "PAGE" "POSTAGE\_AND\_PRINT" "INTERNATIONAL\_POSTAGE\_AND\_PRINT" "TIER1\_TOP\_LEVEL\_DOMAIN" "TIER2\_TOP\_LEVEL\_DOMAIN" "DEDICATED\_IP" "ENABLELCM" "MAXCOMPONENTS" "DATA\_MANAGEMENT\_USER" "SPECIALIST\_USER" "PROFESSIONAL\_USER" "MATERIALITY\_MATRIX" "STAKEHOLDER\_MANAGEMENT" "SCORECARD" "STANDARD\_MAPPING" "DONATION\_MANAGEMENT" "DOCUMENT" "PACKAGE\_SMALL" "PACKAGE\_LARGE" "MEMBER" "ATTENDEE" "MAILING" "RESPONSE" "EXTERNAL\_INVOICE\_FEE" "CLIENT\_TEST" "IMAGE\_TRANSFORMATION" "TOTAL\_IMAGE" "LICENSE" "MAILBOX" "FREE\_40\_INCH\_HDTV\_PC" "FREE\_46\_INCH\_HDTV\_PC" "FREE\_46\_INCH\_HDTV\_PC\_MOUNTING" "EMPLOYEE\_PER\_WEEK" "REGISTER" "END\_USER" "CORE" "DEVICE" "PORT" "MEASURER" "PUBLISHED\_MEASUREMENT" "NODE" "SERVER\_RULE" "VPN\_LP" "PROXY\_LP" "DESKTOP\_CONNECT\_LP" "CAMERA" "MAIN\_SOUND\_ZONE" "SUB\_SOUND\_ZONE" "POST" "REPORT" "BOX" "SESSION" "DISPLAY" "TRUCKROLL" "TRANSACTION\_FEE" "SENDING\_API\_CALL" "LOOKUP\_API\_CALL" "ANALYTICS\_API\_CALL" "MIGRATION\_INSTANCE" "NFON\_SETUP\_PER\_PHONE\_EXTENSION" "NFON\_SETUP\_PER\_PHONE\_EXTENSION\_PLUS" "NFON\_SETUP\_PER\_EFAX\_EXTENSION" "NFON\_PHONE\_EXTENSION" "NFON\_PHONE\_EXTENSION\_PLUS" "NFON\_EFAX\_EXTENSION" "NFON\_CALL\_CENTER\_MONITORING" "NFON\_NMEETING" "NFON\_MOBILE\_NFON\_DEVICE" "NFON\_ISOFTPHONE\_MAC" "NFON\_NSOFTPHONE\_STANDARD\_WINDOWS" "NFON\_NSOFTPHONE\_PREMIUM\_WINDOWS" "NFON\_NCTI\_STANDARD\_WINDOWS" "NFON\_NCTI\_STANDARD\_CRM\_WINDOWS" "NFON\_NCTI\_STANDARD\_MAC" "NFON\_NSOFTPHONE\_STANDARD\_WINDOWS\_OR\_MOBILE" "WESUSTAIN\_PERFORMANCE" "WESUSTAIN\_STAKEHOLDER\_REPUTATION" "WESUSTAIN\_WEAPP" "FAX" "FAX\_LINE" "ROOM\_LINE" "DEPARTMENT\_LINE" "INTERNATIONAL\_LICENSE" "INTERNATIONAL\_DEPARTMENT\_LINE" "INTERNATIONAL\_ROOM\_LINE" "INTERNATIONAL\_LINE" "CALLING\_CREDIT" "LINE" "TOLLFREE\_ROOM\_LINE" "TOLLFREE\_DEPARTMENT\_LINE" "TAXES\_AND\_FEES" "LEAD" "OPPORTUNITY" "CAMPAIGN" "CASE" "CUSTOMER" "TIER1\_STANDARD\_LINE" "TIER1\_ROOM\_LINE" "TIER1\_TOLLFREE\_ROOM\_LINE" "TIER1\_TOLLFREE\_DEPARTMENT\_LINE" "TIER1\_FAX\_LINE" "TIER1\_DEPARTMENT\_LINE" "TIER2\_STANDARD\_LINE" "TIER2\_ROOM\_LINE" "TIER2\_DEPARTMENT\_LINE" "TIER3\_STANDARD\_LINE" "TIER3\_ROOM\_LINE" "TIER3\_DEPARTMENT\_LINE" "TIER4\_STANDARD\_LINE" "TIER4\_ROOM\_LINE" "TIER4\_DEPARTMENT\_LINE" "CLUSTER" "NODE\_4VCPU" "FIVE\_HUNDRED\_GB\_SSD" "TWELVE\_TB\_NETWORK\_IO" "JBOSS\_EAP" "JBOSS\_FUSE" "JBOSS\_A\_MQ" "JBOSS\_BRMS" "JBOSS\_BPM\_SUITE" "JBOSS\_DATA\_GRID" "JBOSS\_DATA\_VIRT" "USER\_LICENSE" "ADDITIONAL\_NUMBER\_LICENSE" "ROOM\_PHONE\_LICENSE" "UBERCONFERENCE\_PRO\_LICENSE" "UBERCONFERENCE\_PRO\_LICENSE\_UNBUNDLED" "INSTANCE" "INDOOR\_CAMERA" "OUTDOOR\_CAMERA" "VINGATE\_LP\_LICENCE" "ADMINISTRATOR" "MOBILE\_USER" "G\_SUITE" "T1" "PHONE" "AUTO\_ATTENDANT" "HUNT\_GROUP" "VOICEMAIL\_BOX" "TOLL\_FREE\_NUMBER" "INBOUND\_LONG\_DISTANCE\_MINUTE" "OUTBOUND\_LONG\_DISTANCE\_MINUTE" "INBOUND\_OUTBOUND\_LONG\_DISTANCE\_MINUTE" "SET\_TOP\_BOX" "MODEM" "ACCESS\_POINT" "CALLING\_FEATURE" "IAD\_DEVICE" "ANALOG\_LINE" "PRI" "SBC\_DEVICE" "ROUTER" "INTERNATIONAL\_MINUTE" "PHONE\_LINE" "DYNAMIC\_IP\_ADDRESS" "STATIC\_IP\_ADDRESS" "GATEWAY" "REMOTE\_CONTROL" "TIER1\_STANDARD\_SEAT" "TIER2\_STANDARD\_SEAT" "TIER3\_STANDARD\_SEAT" "TIER4\_STANDARD\_SEAT" "TIER1\_TOLL\_FREE\_SEAT" "MILLION\_MESSAGES" "MESSAGE" "WEEKLY" "PHONE\_NUMBER" "GUEST" "REVISION\_SAFE\_DATAROOM" "GROUP\_SESSION" "MAILBOX\_AD\_SYNC" "PHONE\_SUPPORT" "EXTRA\_10TB" "EXTRA\_50TB" "EXTRA\_200TB" "MAP\_VIEW" "SVM" "CHANNEL" "NUMBER\_PRINTER\_TABLET" "NUMBER\_ONSITE\_SERVER" "NUMBER\_VISITS" "ONSITE\_TECHNICIAN\_PC" "ONSITE\_TECHNICIAN\_SERVER" "SHORTER\_REACTION\_TIMES" "E\_COMMERCE\_INTEGRATION" "LOCATION" "TRAINING\_SESSION" "GIGABYTES\_PER\_HOUR" "FINANCIAL\_PLANNING" "ONSITE\_WORKPLACE" "INTERNAL\_TOOLS\_ACCESS" "DUTY\_SERVICE" "TERABYTE" "HOST\_UNIT\_HOURS" "WEB\_CHECKS" "ACTIVE\_USERS" "ACTIVE\_EMPLOYEE" "PC\_OF\_NET\_RECURRING\_FEE" "ACTIVE\_VENDOR" "ADVERTISEMENT" "ADVERTISER\_SPENDS" "ANNUAL\_FUNDRAISING\_INCOME" "ANNUAL\_SUBSCRIPTION" "APPLIANCE" "ASSET" "ASSETS\_UNDER\_MANAGEMENT" "BUSINESS\_PARTNERS" "CASH\_FLOWS" "COMPONENT" "CONNECTED\_SYSTEMS" "CONTRACTS" "COSTS" "DATA\_STREAMS" "DATABASE\_SIZE" "EXTERNAL\_SERVICE\_CALLS" "FILE" "FIXED" "FLAT" "FLAT\_FEE\_BASED\_ON\_ASSETS" "FLEET\_PLANNING\_ORDERS" "FORMS" "GIGABYTE\_DATABASE\_SIZES" "INSTALLATION" "INSTALLED\_CAPACITY" "JOB\_POSTING" "LEARNER" "LOGON" "MANAGED\_SYSTEM" "MASTER\_DATA\_OBJECT" "MASTER\_RECORDS" "MBPS" "MONITORED\_USER" "MPLS" "ORDER" "OUTPATIENT\_DAYS" "PAGE\_VIEW" "PATIENT\_CARE\_DAY" "PATIENT\_TREATED" "PLANT" "POINTS\_OF\_DELIVERY" "PREMIUM" "PROCESS" "PRODUCTS" "RECORDS" "RENTAL\_UNIT" "RESOURCES" "REVENUE" "SALES\_ORDER" "SALES\_PORTFOLIOS" "SERVICE\_ORDERS" "SITE\_VISITS" "SPENDS" "SPEND\_VOLUMES" "STREAM" "STUDENT" "SUBSCRIBER" "SUPPLIERS" "TICKETS" "TOTAL\_ANNUAL\_BUDGET" "TUNNEL" "VIRTUAL\_USERS" "SAP\_SYSTEM" "POSITION\_TYPES" "OVERAGE\_FEES" "OVERAGE\_FEE\_TRANSACTION" "OVERAGE\_FEES\_DOCUMENT" "OVERAGE\_FEES\_ITEM" "EVENT" "BUSINESS\_EVENT" "LEGAL\_TENDER" "ANNUAL\_REVENUE" "AD\_SYNC" "FULL\_DATA\_RESTORE" "USED\_STORAGE\_100GB" "COMPANY" "ADDITIONAL\_USER" "VISIT" "VIDEO" "ELECTRONIC\_PAYMENT" "CHECK\_PAYMENT" "EXPRESS\_PAY\_ELECTRONIC\_PAYMENT" "EXPRESS\_PAY\_CHECK\_PAYMENT" "DATA\_ENTRY\_SERVICE" "MONTHLY\_VISIT" "SCRUB\_TRANSACTION" "DEVICE\_LICENSE" "SERVER\_LICENSE" "BASE\_LICENSE" "SERVICE\_CALL" "SUPPORT\_INCIDENT\_TICKET" "CUSTOM\_REPORT\_BUILDING\_TRAINING" "QUOTA" "DOMESTIC\_TRANSACTION" "BEE" "BEE\_FLEET" "BEE\_BEACON\_AMBIENT\_LIGHT" "BEE\_BEACON\_TEMPERATURE\_HUMIDITY" "CONTACTS\_100" "TEMPLATE" "TEMPLATE\_PACKS\_10" "PACK" "SMS\_TEXT\_MESSAGE\_10" "VIRTUAL\_SERVER" "PHYSICAL\_SERVER" "WORKSTATION" "CHATS" "MATCH\_LIST" "CERTIFICATE\_12\_MONTHS" "CERTIFICATE\_24\_MONTHS" "PRIVACY" "PAGE\_VIEWS\_100000" "VOICE\_OUT" "EXAM" "PARTICIPANT" "ENCRYPTION\_ADDON" "ESS" "ETI" "ATP\_ADDON" "PBE\_ADDO" "NETI\_ADDON" "HUNDRED\_SMS\_REMINDER" "CALENDAR\_SYNC" "PAYMENT\_INTERFACE" "MULTILINGUAL\_ONLINE\_EVENT\_BOOKING" "SOCKET" "OFFER" "FREELANCER" "SOAP" "DATEV\_LEXWARE\_INTERFACE" "TOKEN" "SERVICE\_MONTH" "VIDEO\_PACKAGE\_50\_HOURS" "INTERFACE" "TEST\_CASE" "MINUTES\_15" "MINUTES\_30" "CONNECTED\_ACCESS\_POINT" "DAY" "SATURDAY\_SURCHARGE" "NIGHT\_SURCHARGE" "SUNDAY\_SURCHARGE" "PUBLIC\_HOLIDAY\_SURCHARGE" "BASIC\_PACKAGE" "STANDARD\_PACKAGE" "PREMIUM\_PACKAGE" "REPORTS\_MODULE" "WORKFLOW\_MODULE" "NBV\_250K" "NBV" "INVENTORY" "ADDITIONAL\_COMPANY" "TRANSACTION" "PREMIUM\_CREDIT\_REPORTS" "ADDITIONAL\_CONNECTION" "STOCK\_UNIT" "MONTHLY\_USAGE\_FEE" "USAGE\_FEE" "MONTHLY\_CHARGES" "STANDARD\_USER" "ADDITIONAL\_UNIT" "COMMISSION" "KITTING" "WOP" "SFDC" "NAMED\_USER\_LICENSE" "BARCODING\_AND\_WAREHOUSING" "MODULE" "MANUFACTURING\_MODULE" "MRP" "CONSOLE\_MODULE" "CONSOLIDATIONS" "MULTI\_CURRENCY" "ADDON\_LICENSE" "INBOUND\_PAGE" "OUTBOUND\_PAGE" "OPPORTUNITY\_RETENTION" "SOCIAL\_SENTIMENT" "DEMAND\_PRICE" "SETUP\_FEE" "SHAREPOINT" "INTEGRATION\_MAINTENANCE" "VIEWER" "MANAGEMENT\_USER" "SQ\_FT" "LOCATION\_UPTO\_10\_EMPLOYEES" "LOCATION\_UPTO\_20\_EMPLOYEES" "LOCATION\_UPTO\_30\_EMPLOYEES" "LOCATION\_UPTO\_60\_EMPLOYEES" "LOCATION\_UPTO\_99\_EMPLOYEES" "M365\_ONLINE" "WEB\_HOSTING\_SERVER" "STANDARD\_EDITION\_GIGABYTE" "STORAGE\_GIGABYTE" "EGRESS\_GIGABYTE" "FEE\_HW\_DEFECT\_NO\_WARRANTY\_CASE" "SIM\_CARD" "SIM\_CARDS\_10" "APPLICATION\_CONNECTOR" "ADDITIONAL\_API\_CALLS" "USED\_STORAGE\_PER\_GB" "CERTIFICATION" "MACHINE" "CALCULATION\_USER" "MAILBOX\_S" "MAILBOX\_M" "MAILBOX\_L" "STORAGE" "GROUP" "VEHICLE" "ENDPOINT" "MANAGED\_SERVICE" "SOC" "ONLINE\_PLAN" "ENTERPRISE\_PLAN" "FLOATING\_LICENSE" "USER\_PER\_LICENSE" "CONCURRENT\_USER\_PER\_LICENSE" "DASHBOARD" "IT\_INTERFACE" "CONNECTABLE\_IOT\_DEVICE\_VIA\_USB" "CONNECTABLE\_IOT\_DEVICE\_VIA\_TULIP\_GATEWAY" "CONNECTABLE\_MACHINE\_PER\_LICENSE" "OBJECT\_TO\_BE\_CHECKED" "MACHINE\_WITH\_BI\_SUPPORT" "CONNECTED\_DEVICE" "LISTING" "TLS\_ENCRYPTION" "DOMAIN\_LEVEL\_SEND" "EFAX\_ROUTER" "PRORATED\_CREDIT" "NEW\_HIRE" "NAS" "SALESFORCE\_USER" "INTERVIEW" "ASSESSMENT" "NU\_WEBEX\_CALLING\_ENHANCED" "NU\_WEBEX\_CALLING\_PROFESSIONAL" "WEBEX\_ASSISTANT\_FOR\_WEBEX\_MEETINGS\_NU" "NU\_MEETINGS\_BRIDGE\_COUNTRY\_CALL\_BACK\_AUDIO" "FLEX\_TEAMS\_MESSAGING" "ADDON\_ANALYSES" "ADDITIONAL\_LISTING" "MIGRATION\_TENANT" "MIGRATION\_GROUP" "MIGRATION\_DOCUMENT" "MIGRATION\_GSUITE" "MIGRATION\_FOLDER" "ENHANCED\_USER" "SINGLE\_NAME\_CERTIFICATE" "SETUP" "WILDCARD\_CERTIFICATE" "SECURITY\_PACKAGE" "ADDITIONAL\_LANGUAGE" "VANITY\_URL" "BRANDING" "DATA\_SOURCE" "CREATOR\_USER" "ESIGN\_USER" "READ\_ONLY\_USER" "MEASURING\_POINT" "ANDON\_TV" "TABLET" "USER\_10000" "USER\_100" "PUBLIC\_IP" "WORKLOAD" "PUBLIC\_IP\_ADDRESS" "COMPUTE\_POINT" "RESOURCE\_UNIT" "VALUE\_POINT" "ACCOUNT" "REQUEST" "TRANSCRIPT" "NOTIFICATION" "CLAIM" "MID" "ENGAGEMENT" "TEAM\_LICENSE\_DIGITAL\_TEAMBOARD" "TEAM\_LICENSE\_MODULE\_CONNECTIVITY" "TEAM\_LICENSE\_MODULE\_PROBLEM\_SOLUTION" "TEAM\_LICENSE\_MODULE\_AUDITS" "TEAM\_LICENSE\_MODULE\_PROCESS\_CONFIRMATION" "TEAM\_LICENSE\_MODULE\_QUALIFICATION\_MATRIX" "TEAM\_LICENSE\_MODULE\_STANDARD\_WORK\_INSTRUCTION" "TEAM\_LICENSE\_MODULE\_PARETO\_ANALYSIS" "KPI" "YEAR\_KPI\_ARCHIVAL" "CORPORATE\_CLOUD\_HOSTING" "ON\_PREMISES\_HOSTING" "SUPPORT\_SERVICE\_HOUR" "CLASS" "EXPERT" "SPINDLE\_HOUR" "ADDON\_ADMINISTRATION" "ADDON\_CONFIGURATION" "ADDON\_PLANNING" "ADDON\_PLANNING\_OBJECTS" "ADDON\_MASTER\_DATA" "ADDON\_CAPACITY\_PLANS\_CALENDAR" "ADDON\_CONFLICT\_RADAR" "ADDON\_GAP\_LIST" "ADDON\_DASHBOARD" "ADDON\_PLANNING\_READ\_ONLY" "ADDON\_UTILIZATION\_POOLS" "ADDON\_FIXED\_SCHEDULES" "ADDON\_ASSEMBLY\_GROUPS" "ADDON\_ORDER\_ON\_HOLD" "ADDON\_PARALLEL\_RESSOURCES" "ADDON\_MULTI\_FUNCTIONAL\_RESSOURCES" "ADDON\_PLANEUS\_TV\_PER\_TERMINAL" "ADDON\_MASTER\_DATA\_WORK\_PROCEDURES" "ADDON\_MANUAL\_IMPORT" "ADDON\_AUTOMATIC\_IMPORT" "ADDON\_REPORTING\_BASIC" "ADDON\_REPORTING\_ADVANCED" "ADDON\_REPORT\_RESOURCES\_AVAILABILITY\_PER\_DAY" "ADDON\_REPORT\_OEE" "ADDON\_REPORT\_ON\_TIME\_DELIVERY\_HISTORY" "ADDON\_REPORT\_PROCESS\_PERFORMANCE\_HISTORY" "ADDON\_REPORT\_UTILIZATION\_PER\_RESOURCE" "ADDON\_REPORT\_REPORTING\_PLUG\_IN" "ADDON\_EXTERNAL\_PARTNERS\_BASIC\_LICENSE" "ADDON\_WORKBENCH\_PACK\_OF\_5" "ADDON\_WORKBENCH\_PACK\_OF\_10" "ADDON\_WORKBENCH\_PACK\_OF\_15" "CLIENT" "VIRTUAL\_MACHINE" "MODEL\_TRANSFORMATION" "CASE\_REFRESH" "CASE\_VIEW" "CASE\_DOCUMENT\_DOWNLOAD" "VERIFICATION" "ADDON\_CORPORATE\_BRANDING" "CLIENT\_TAX\_FILINGS" "CLIENT\_COMPLIANCE\_SERVICES" "PROPOSAL" "UK\_ID\_CHECK" "INTERNATIONAL\_ID\_CHECK" "CREDIT\_SCREEN" "UK\_COMPANY\_REPORT" "NON\_UK\_COMPANY\_REPORT" "HR\_SCREEN" "COMPANY\_FORMATION" "CLIENT\_ACCOUNTS" "SMARTKIT" "WORKFLOW" "EDITOR" "WORKER" "ADDON\_POTENTIAL\_ANALYSIS" "TRAINING\_PACKAGE\_SMALL" "TRAINING\_PACKAGE\_LARGE" "TOOL\_PATH\_OPTIMIZATION" "CLIENT\_VAT\_FILINGS" "BUNDLE" "PACKAGE" "VM" "INCIDENT" "SEND" "INTEGRATION" "BILLABLE\_HOUR" "TB" "SOURCE" "TRAINING" "SITE" "CONSULTING\_UNIT" "CAPACITY" "MIGRATION" "WORKSHOP" "ONBOARDING" "BENEFIT\_ELIGIBLE\_EMPLOYEE" "SEAT" "MS365\_SEAT" "MS\_EXCHANGE\_MAILBOX" "GWORKSPACE\_SEAT" "INTERNET\_LINE" "BACKUP\_LINE" "USER\_PACK\_50" "USER\_PACK\_100" "CIRCUIT" "NAC" "INFRASTRUCTURE" "TEN\_THOUSAND\_TEST\_RUNS" "ONE\_THOUSAND\_TEST\_RUNS" "INGESTED\_OR\_SCANNED\_GB" "MILLION\_LOG\_EVENTS" "GB\_OUTBOUND\_PER\_DESTINATION" "DESTINATION" "COMMITTER" "INGESTED\_GB" "CPU" "ONE\_THOUSAND\_SESSIONS" "MILLION\_RECORDS" "GB\_OF\_ANALYZED\_LOGS" "ACTIVE\_FUNCTION" "MILLION\_TRACED\_INVOCATIONS" "ACTIVE\_APPLICATION\_INSTANCES" "HUNDRED\_TEST\_RUNS" "ADDITIONAL\_PARALLELIZATION" "TASK" "ONE\_HUNDRED\_WORKFLOW\_EXECUTIONS" "SCANNED\_GB" "USE\_CASE" "ONE\_THOUSAND\_ERROR\_EVENTS" "PERFORMANCE\_GOAL" "SCHOOL" "MICROSOFT\_365\_TENANT" "MARKETPLACE" "LIEN\_PROCESSED" "DISBURSEMENT" "A\_LA\_CARTE" "SECURE" "SECURE\_PLUS" "SECURE\_EXTRA" "PHASR" "ENCRYPTION" "EMAIL\_SECURITY" "MOBILE\_SECURITY" "EXCHANGE" "ATS" "EDR" "EDR\_RETENTION\_90D" "EDR\_RETENTION\_180D" "EDR\_RETENTION\_1Y" "INTEGRITY\_MON" "INTEGRITY\_MON\_RETENTION\_90D" "INTEGRITY\_MON\_RETENTION\_180D" "INTEGRITY\_MON\_RETENTION\_1Y" "MDR\_FOUNDATIONS" "PATCH\_MANAGEMENT" "VIRTUAL\_ENV\_VS" "VIRTUAL\_ENV\_VDI" "CONTAINER\_PROTECTION" "XDR\_IDENTITY\_SENSOR" "XDR\_PRODUCTIVITY\_SENSOR" "XDR\_NETWORK\_SENSOR" "XDR\_CLOUD\_SENSOR" "COMPLIANCE\_MANAGER" "EASM" "SUPERVISOR" "GB\_OF\_PROVISIONED\_VM\_RAM\_PER\_HOUR" "GB\_OF\_USED\_VM\_STORAGE\_PER\_HOUR" "GB\_OF\_USED\_S3\_STORAGE\_PER\_HOUR" "VIRTUAL\_ENVIRONMENT\_VE\_PER\_MONTH" "STORAGE\_100\_GB\_PER\_MONTH" "GB\_RAM\_UNDER\_MANAGEMENT\_PER\_MONTH" "GB\_OF\_VM\_RAM\_PER\_HOUR" "BUSINESS\_CLIENT" "SELF\_EMPLOYED\_CLIENT" "LANDLORD\_CLIENT" "DATA\_HEALTH\_AND\_INSIGHT\_ADDON" "SWITCH\_DAY" "ACCESS\_POINT\_DAY" "DATABASE" "FUNCTION" "APP\_SERVICE" "FIREWALL" "EDR\_SA\_MDR\_FOUNDATIONS" "EDR\_SA" "FED\_USF\_CHARGE" "SERVICE\_FEE" "SERVICE\_FEE\_AP" "SERVICE\_FEE\_SWITCH" "SERVICE\_FEE\_ROUTER" "USER\_LICENCE\_DAY" "DEVICE\_DAY" "VM\_DAY" "ROUTER\_DAY" "FSE" "ON\_SITE\_SERVICE" "BASIC" "BASIC\_PLUS" "STANDARD" "STANDARD\_PLUS" "ADVANCED" "ADVANCED\_PLUS" "PREMIUM\_PLUS" "XXS" "XS" "SMALL" "MEDIUM" "LARGE" "XL" "XXL" "XXXL" "CUSTOM" "ENHANCED" "INCIDENT\_RESPONSE\_SERVICE" "JIRA\_CONNECTOR" "SHAREPOINT\_CONNECTOR" "CONFLUENCE\_CONNECTOR" "PRIVATE\_ACCESS" "INTERNET\_ACCESS" | | vendorSharePercentage | number or nullVendor's percentage share of the discount. | ### Responses **201** Created **400** Bad Request **404** Not Found **409** Conflict post/channel/v1/discounts https\://marketplace.appdirect.com/api/channel/v1/discounts https\://virtserver.swaggerhub.com/channel/v1/discounts ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "applicationId": 0, "applicationUuid": "string", "applicationName": "string", "autoApply": true, "basePartnerSharePercentage": 0, "billingCycles": 0, "code": "string", "createdOn": 0, "description": "string", "editionId": 0, "editionUuid": "string", "expirationDate": 0, "id": 0, "uuid": "string", "industryId": 0, "maxRedemptions": 0, "maxUnits": 0, "minUnits": 0, "partnerSharePercentage": 0, "paymentPlanId": 0, "paymentPlanUuid": "string", "percentage": 0, "price": 0, "redemptionRestriction": "string", "redemptions": 0, "retainable": true, "startDate": 0, "type": "string", "unit": "USER", "vendorSharePercentage": 0 }` ### Response samples * 201 Content type \*/\*\*/\* No sample ## [](#tag/Discount/operation/resource_Other_updateDiscount_PUT)Update discounts Updates the specified discount with the provided data. Note that percentage discounts cannot exceed two decimal places (for example, 10.15). ##### path Parameters | | | | ------------------ | ---------------------------------- | | discountIdrequired | stringDiscount ID or Discount UUID | ##### Request Body schema: application/json Discount data object | | | | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | applicationId | number or nullApplication ID. | | applicationUuid | string or nullApplication UUID. | | applicationName | string or nullName of the application to which the discount applies. | | autoApply | booleanTrue if the discount is automatically applied. Default value is true. | | basePartnerSharePercentage | number or nullBase partner's percentage share of the discount. | | billingCycles | number or nullNumber of billing cycles for which the discount should be applied. | | code | string or nullDiscount code. Must be at least 4 characters, but no longer than 103 characters. | | createdOn | number or nullCreation date of the discount. | | descriptionrequired | stringDescription of discount. Required field. Must be at least 4 characters, but no longer than 255 characters. | | editionId | number or nullEdition ID. | | editionUuid | string or nullEdition UUID. | | expirationDate | number or nullExpiration date for the discount. This date must be in the future. | | id | number or nullDiscount ID. | | uuid | string or nullDiscount UUID. | | industryId | number or nullIndustry ID. | | maxRedemptions | number or nullMaximum number of redemptions available. | | maxUnits | numberMaximum number of units for which to apply the discount. | | minUnits | numberMinimum number of units for which to apply the discount. | | partnerSharePercentage | number or nullPartner's percentage share of the discount. | | paymentPlanId | number or nullPayment plan ID. | | paymentPlanUuid | string or nullPayment plan UUID. | | percentage | numberPercentage discount if discount is of PERCENTAGE type. The percentage value cannot exceed two decimal places (for example, 10.15). | | price | number or nullAmount to discount if discount is of FIXED\_PRICE type. | | redemptionRestriction | string (RedemptionRestriction) | | redemptions | numberNumber of times the discount has been redeemed. | | retainable | booleanTrue if the discount is retainable. Retainable discounts can be redeemed on orders that are updated after the discount expires. For example, if an order includes a discount that expires on 01 January 2019, and the order is then updated on 02 January 2019, the discount would still be redeemable. The default value is false (discounts are not retained). | | startDate | number or nullStart date for the discount. | | typerequired | string (DiscountType) | | unit | string (PricingUnit)Enum: "USER" "GIGABYTE" "MEGABYTE" "HOUR" "MINUTE" "INVOICE" "UNIT" "PROJECT" "PROPERTY" "ITEM" "WORD" "EMAIL" "CONTACT" "CALL" "CREDIT" "ROOM" "HOST" "AGENT" "OPERATOR" "PROVIDER" "MANAGER" "TESTER" "JVM" "SERVER" "WEB\_USE\_MINUTE" "AUDIO\_USE\_MINUTE" "PIECE" "EMPLOYEE\_PAY\_PERIOD" "EMPLOYEE\_PER\_PAY\_PERIOD" "COMPUTER" "NOT\_APPLICABLE" "ONE\_TIME\_SETUP" "DATA\_POINTS" "TIER1\_API\_CALLS" "TIER2\_API\_CALLS" "ADVISORY\_HOURS" "OVERAGE\_AUDIO\_MINUTE" "EMPLOYEE" "CONNECTION" "PUSH\_USER" "THOUSAND\_EMAILS\_PER\_DAY" "PUSH\_NOTIFICATION\_DEVICES" "API\_CALLS" "SMS\_TEXT\_MESSAGE" "CONTACTS\_1000" "CONTRACT\_FEE" "TRANSFER\_FEE" "REACTIVATION\_FEE" "RECIPIENT" "ADDITIONAL\_1000\_CONTACTS\_BLOCK" "SCHEDULE\_PLAN" "EMAILS\_1000" "EMAILS\_2500" "MOBILE\_DEVICE" "PAYSLIP" "PAYSLIP\_CORRECTION" "STORE" "WEBSITE" "EPAPER" "PAGE" "POSTAGE\_AND\_PRINT" "INTERNATIONAL\_POSTAGE\_AND\_PRINT" "TIER1\_TOP\_LEVEL\_DOMAIN" "TIER2\_TOP\_LEVEL\_DOMAIN" "DEDICATED\_IP" "ENABLELCM" "MAXCOMPONENTS" "DATA\_MANAGEMENT\_USER" "SPECIALIST\_USER" "PROFESSIONAL\_USER" "MATERIALITY\_MATRIX" "STAKEHOLDER\_MANAGEMENT" "SCORECARD" "STANDARD\_MAPPING" "DONATION\_MANAGEMENT" "DOCUMENT" "PACKAGE\_SMALL" "PACKAGE\_LARGE" "MEMBER" "ATTENDEE" "MAILING" "RESPONSE" "EXTERNAL\_INVOICE\_FEE" "CLIENT\_TEST" "IMAGE\_TRANSFORMATION" "TOTAL\_IMAGE" "LICENSE" "MAILBOX" "FREE\_40\_INCH\_HDTV\_PC" "FREE\_46\_INCH\_HDTV\_PC" "FREE\_46\_INCH\_HDTV\_PC\_MOUNTING" "EMPLOYEE\_PER\_WEEK" "REGISTER" "END\_USER" "CORE" "DEVICE" "PORT" "MEASURER" "PUBLISHED\_MEASUREMENT" "NODE" "SERVER\_RULE" "VPN\_LP" "PROXY\_LP" "DESKTOP\_CONNECT\_LP" "CAMERA" "MAIN\_SOUND\_ZONE" "SUB\_SOUND\_ZONE" "POST" "REPORT" "BOX" "SESSION" "DISPLAY" "TRUCKROLL" "TRANSACTION\_FEE" "SENDING\_API\_CALL" "LOOKUP\_API\_CALL" "ANALYTICS\_API\_CALL" "MIGRATION\_INSTANCE" "NFON\_SETUP\_PER\_PHONE\_EXTENSION" "NFON\_SETUP\_PER\_PHONE\_EXTENSION\_PLUS" "NFON\_SETUP\_PER\_EFAX\_EXTENSION" "NFON\_PHONE\_EXTENSION" "NFON\_PHONE\_EXTENSION\_PLUS" "NFON\_EFAX\_EXTENSION" "NFON\_CALL\_CENTER\_MONITORING" "NFON\_NMEETING" "NFON\_MOBILE\_NFON\_DEVICE" "NFON\_ISOFTPHONE\_MAC" "NFON\_NSOFTPHONE\_STANDARD\_WINDOWS" "NFON\_NSOFTPHONE\_PREMIUM\_WINDOWS" "NFON\_NCTI\_STANDARD\_WINDOWS" "NFON\_NCTI\_STANDARD\_CRM\_WINDOWS" "NFON\_NCTI\_STANDARD\_MAC" "NFON\_NSOFTPHONE\_STANDARD\_WINDOWS\_OR\_MOBILE" "WESUSTAIN\_PERFORMANCE" "WESUSTAIN\_STAKEHOLDER\_REPUTATION" "WESUSTAIN\_WEAPP" "FAX" "FAX\_LINE" "ROOM\_LINE" "DEPARTMENT\_LINE" "INTERNATIONAL\_LICENSE" "INTERNATIONAL\_DEPARTMENT\_LINE" "INTERNATIONAL\_ROOM\_LINE" "INTERNATIONAL\_LINE" "CALLING\_CREDIT" "LINE" "TOLLFREE\_ROOM\_LINE" "TOLLFREE\_DEPARTMENT\_LINE" "TAXES\_AND\_FEES" "LEAD" "OPPORTUNITY" "CAMPAIGN" "CASE" "CUSTOMER" "TIER1\_STANDARD\_LINE" "TIER1\_ROOM\_LINE" "TIER1\_TOLLFREE\_ROOM\_LINE" "TIER1\_TOLLFREE\_DEPARTMENT\_LINE" "TIER1\_FAX\_LINE" "TIER1\_DEPARTMENT\_LINE" "TIER2\_STANDARD\_LINE" "TIER2\_ROOM\_LINE" "TIER2\_DEPARTMENT\_LINE" "TIER3\_STANDARD\_LINE" "TIER3\_ROOM\_LINE" "TIER3\_DEPARTMENT\_LINE" "TIER4\_STANDARD\_LINE" "TIER4\_ROOM\_LINE" "TIER4\_DEPARTMENT\_LINE" "CLUSTER" "NODE\_4VCPU" "FIVE\_HUNDRED\_GB\_SSD" "TWELVE\_TB\_NETWORK\_IO" "JBOSS\_EAP" "JBOSS\_FUSE" "JBOSS\_A\_MQ" "JBOSS\_BRMS" "JBOSS\_BPM\_SUITE" "JBOSS\_DATA\_GRID" "JBOSS\_DATA\_VIRT" "USER\_LICENSE" "ADDITIONAL\_NUMBER\_LICENSE" "ROOM\_PHONE\_LICENSE" "UBERCONFERENCE\_PRO\_LICENSE" "UBERCONFERENCE\_PRO\_LICENSE\_UNBUNDLED" "INSTANCE" "INDOOR\_CAMERA" "OUTDOOR\_CAMERA" "VINGATE\_LP\_LICENCE" "ADMINISTRATOR" "MOBILE\_USER" "G\_SUITE" "T1" "PHONE" "AUTO\_ATTENDANT" "HUNT\_GROUP" "VOICEMAIL\_BOX" "TOLL\_FREE\_NUMBER" "INBOUND\_LONG\_DISTANCE\_MINUTE" "OUTBOUND\_LONG\_DISTANCE\_MINUTE" "INBOUND\_OUTBOUND\_LONG\_DISTANCE\_MINUTE" "SET\_TOP\_BOX" "MODEM" "ACCESS\_POINT" "CALLING\_FEATURE" "IAD\_DEVICE" "ANALOG\_LINE" "PRI" "SBC\_DEVICE" "ROUTER" "INTERNATIONAL\_MINUTE" "PHONE\_LINE" "DYNAMIC\_IP\_ADDRESS" "STATIC\_IP\_ADDRESS" "GATEWAY" "REMOTE\_CONTROL" "TIER1\_STANDARD\_SEAT" "TIER2\_STANDARD\_SEAT" "TIER3\_STANDARD\_SEAT" "TIER4\_STANDARD\_SEAT" "TIER1\_TOLL\_FREE\_SEAT" "MILLION\_MESSAGES" "MESSAGE" "WEEKLY" "PHONE\_NUMBER" "GUEST" "REVISION\_SAFE\_DATAROOM" "GROUP\_SESSION" "MAILBOX\_AD\_SYNC" "PHONE\_SUPPORT" "EXTRA\_10TB" "EXTRA\_50TB" "EXTRA\_200TB" "MAP\_VIEW" "SVM" "CHANNEL" "NUMBER\_PRINTER\_TABLET" "NUMBER\_ONSITE\_SERVER" "NUMBER\_VISITS" "ONSITE\_TECHNICIAN\_PC" "ONSITE\_TECHNICIAN\_SERVER" "SHORTER\_REACTION\_TIMES" "E\_COMMERCE\_INTEGRATION" "LOCATION" "TRAINING\_SESSION" "GIGABYTES\_PER\_HOUR" "FINANCIAL\_PLANNING" "ONSITE\_WORKPLACE" "INTERNAL\_TOOLS\_ACCESS" "DUTY\_SERVICE" "TERABYTE" "HOST\_UNIT\_HOURS" "WEB\_CHECKS" "ACTIVE\_USERS" "ACTIVE\_EMPLOYEE" "PC\_OF\_NET\_RECURRING\_FEE" "ACTIVE\_VENDOR" "ADVERTISEMENT" "ADVERTISER\_SPENDS" "ANNUAL\_FUNDRAISING\_INCOME" "ANNUAL\_SUBSCRIPTION" "APPLIANCE" "ASSET" "ASSETS\_UNDER\_MANAGEMENT" "BUSINESS\_PARTNERS" "CASH\_FLOWS" "COMPONENT" "CONNECTED\_SYSTEMS" "CONTRACTS" "COSTS" "DATA\_STREAMS" "DATABASE\_SIZE" "EXTERNAL\_SERVICE\_CALLS" "FILE" "FIXED" "FLAT" "FLAT\_FEE\_BASED\_ON\_ASSETS" "FLEET\_PLANNING\_ORDERS" "FORMS" "GIGABYTE\_DATABASE\_SIZES" "INSTALLATION" "INSTALLED\_CAPACITY" "JOB\_POSTING" "LEARNER" "LOGON" "MANAGED\_SYSTEM" "MASTER\_DATA\_OBJECT" "MASTER\_RECORDS" "MBPS" "MONITORED\_USER" "MPLS" "ORDER" "OUTPATIENT\_DAYS" "PAGE\_VIEW" "PATIENT\_CARE\_DAY" "PATIENT\_TREATED" "PLANT" "POINTS\_OF\_DELIVERY" "PREMIUM" "PROCESS" "PRODUCTS" "RECORDS" "RENTAL\_UNIT" "RESOURCES" "REVENUE" "SALES\_ORDER" "SALES\_PORTFOLIOS" "SERVICE\_ORDERS" "SITE\_VISITS" "SPENDS" "SPEND\_VOLUMES" "STREAM" "STUDENT" "SUBSCRIBER" "SUPPLIERS" "TICKETS" "TOTAL\_ANNUAL\_BUDGET" "TUNNEL" "VIRTUAL\_USERS" "SAP\_SYSTEM" "POSITION\_TYPES" "OVERAGE\_FEES" "OVERAGE\_FEE\_TRANSACTION" "OVERAGE\_FEES\_DOCUMENT" "OVERAGE\_FEES\_ITEM" "EVENT" "BUSINESS\_EVENT" "LEGAL\_TENDER" "ANNUAL\_REVENUE" "AD\_SYNC" "FULL\_DATA\_RESTORE" "USED\_STORAGE\_100GB" "COMPANY" "ADDITIONAL\_USER" "VISIT" "VIDEO" "ELECTRONIC\_PAYMENT" "CHECK\_PAYMENT" "EXPRESS\_PAY\_ELECTRONIC\_PAYMENT" "EXPRESS\_PAY\_CHECK\_PAYMENT" "DATA\_ENTRY\_SERVICE" "MONTHLY\_VISIT" "SCRUB\_TRANSACTION" "DEVICE\_LICENSE" "SERVER\_LICENSE" "BASE\_LICENSE" "SERVICE\_CALL" "SUPPORT\_INCIDENT\_TICKET" "CUSTOM\_REPORT\_BUILDING\_TRAINING" "QUOTA" "DOMESTIC\_TRANSACTION" "BEE" "BEE\_FLEET" "BEE\_BEACON\_AMBIENT\_LIGHT" "BEE\_BEACON\_TEMPERATURE\_HUMIDITY" "CONTACTS\_100" "TEMPLATE" "TEMPLATE\_PACKS\_10" "PACK" "SMS\_TEXT\_MESSAGE\_10" "VIRTUAL\_SERVER" "PHYSICAL\_SERVER" "WORKSTATION" "CHATS" "MATCH\_LIST" "CERTIFICATE\_12\_MONTHS" "CERTIFICATE\_24\_MONTHS" "PRIVACY" "PAGE\_VIEWS\_100000" "VOICE\_OUT" "EXAM" "PARTICIPANT" "ENCRYPTION\_ADDON" "ESS" "ETI" "ATP\_ADDON" "PBE\_ADDO" "NETI\_ADDON" "HUNDRED\_SMS\_REMINDER" "CALENDAR\_SYNC" "PAYMENT\_INTERFACE" "MULTILINGUAL\_ONLINE\_EVENT\_BOOKING" "SOCKET" "OFFER" "FREELANCER" "SOAP" "DATEV\_LEXWARE\_INTERFACE" "TOKEN" "SERVICE\_MONTH" "VIDEO\_PACKAGE\_50\_HOURS" "INTERFACE" "TEST\_CASE" "MINUTES\_15" "MINUTES\_30" "CONNECTED\_ACCESS\_POINT" "DAY" "SATURDAY\_SURCHARGE" "NIGHT\_SURCHARGE" "SUNDAY\_SURCHARGE" "PUBLIC\_HOLIDAY\_SURCHARGE" "BASIC\_PACKAGE" "STANDARD\_PACKAGE" "PREMIUM\_PACKAGE" "REPORTS\_MODULE" "WORKFLOW\_MODULE" "NBV\_250K" "NBV" "INVENTORY" "ADDITIONAL\_COMPANY" "TRANSACTION" "PREMIUM\_CREDIT\_REPORTS" "ADDITIONAL\_CONNECTION" "STOCK\_UNIT" "MONTHLY\_USAGE\_FEE" "USAGE\_FEE" "MONTHLY\_CHARGES" "STANDARD\_USER" "ADDITIONAL\_UNIT" "COMMISSION" "KITTING" "WOP" "SFDC" "NAMED\_USER\_LICENSE" "BARCODING\_AND\_WAREHOUSING" "MODULE" "MANUFACTURING\_MODULE" "MRP" "CONSOLE\_MODULE" "CONSOLIDATIONS" "MULTI\_CURRENCY" "ADDON\_LICENSE" "INBOUND\_PAGE" "OUTBOUND\_PAGE" "OPPORTUNITY\_RETENTION" "SOCIAL\_SENTIMENT" "DEMAND\_PRICE" "SETUP\_FEE" "SHAREPOINT" "INTEGRATION\_MAINTENANCE" "VIEWER" "MANAGEMENT\_USER" "SQ\_FT" "LOCATION\_UPTO\_10\_EMPLOYEES" "LOCATION\_UPTO\_20\_EMPLOYEES" "LOCATION\_UPTO\_30\_EMPLOYEES" "LOCATION\_UPTO\_60\_EMPLOYEES" "LOCATION\_UPTO\_99\_EMPLOYEES" "M365\_ONLINE" "WEB\_HOSTING\_SERVER" "STANDARD\_EDITION\_GIGABYTE" "STORAGE\_GIGABYTE" "EGRESS\_GIGABYTE" "FEE\_HW\_DEFECT\_NO\_WARRANTY\_CASE" "SIM\_CARD" "SIM\_CARDS\_10" "APPLICATION\_CONNECTOR" "ADDITIONAL\_API\_CALLS" "USED\_STORAGE\_PER\_GB" "CERTIFICATION" "MACHINE" "CALCULATION\_USER" "MAILBOX\_S" "MAILBOX\_M" "MAILBOX\_L" "STORAGE" "GROUP" "VEHICLE" "ENDPOINT" "MANAGED\_SERVICE" "SOC" "ONLINE\_PLAN" "ENTERPRISE\_PLAN" "FLOATING\_LICENSE" "USER\_PER\_LICENSE" "CONCURRENT\_USER\_PER\_LICENSE" "DASHBOARD" "IT\_INTERFACE" "CONNECTABLE\_IOT\_DEVICE\_VIA\_USB" "CONNECTABLE\_IOT\_DEVICE\_VIA\_TULIP\_GATEWAY" "CONNECTABLE\_MACHINE\_PER\_LICENSE" "OBJECT\_TO\_BE\_CHECKED" "MACHINE\_WITH\_BI\_SUPPORT" "CONNECTED\_DEVICE" "LISTING" "TLS\_ENCRYPTION" "DOMAIN\_LEVEL\_SEND" "EFAX\_ROUTER" "PRORATED\_CREDIT" "NEW\_HIRE" "NAS" "SALESFORCE\_USER" "INTERVIEW" "ASSESSMENT" "NU\_WEBEX\_CALLING\_ENHANCED" "NU\_WEBEX\_CALLING\_PROFESSIONAL" "WEBEX\_ASSISTANT\_FOR\_WEBEX\_MEETINGS\_NU" "NU\_MEETINGS\_BRIDGE\_COUNTRY\_CALL\_BACK\_AUDIO" "FLEX\_TEAMS\_MESSAGING" "ADDON\_ANALYSES" "ADDITIONAL\_LISTING" "MIGRATION\_TENANT" "MIGRATION\_GROUP" "MIGRATION\_DOCUMENT" "MIGRATION\_GSUITE" "MIGRATION\_FOLDER" "ENHANCED\_USER" "SINGLE\_NAME\_CERTIFICATE" "SETUP" "WILDCARD\_CERTIFICATE" "SECURITY\_PACKAGE" "ADDITIONAL\_LANGUAGE" "VANITY\_URL" "BRANDING" "DATA\_SOURCE" "CREATOR\_USER" "ESIGN\_USER" "READ\_ONLY\_USER" "MEASURING\_POINT" "ANDON\_TV" "TABLET" "USER\_10000" "USER\_100" "PUBLIC\_IP" "WORKLOAD" "PUBLIC\_IP\_ADDRESS" "COMPUTE\_POINT" "RESOURCE\_UNIT" "VALUE\_POINT" "ACCOUNT" "REQUEST" "TRANSCRIPT" "NOTIFICATION" "CLAIM" "MID" "ENGAGEMENT" "TEAM\_LICENSE\_DIGITAL\_TEAMBOARD" "TEAM\_LICENSE\_MODULE\_CONNECTIVITY" "TEAM\_LICENSE\_MODULE\_PROBLEM\_SOLUTION" "TEAM\_LICENSE\_MODULE\_AUDITS" "TEAM\_LICENSE\_MODULE\_PROCESS\_CONFIRMATION" "TEAM\_LICENSE\_MODULE\_QUALIFICATION\_MATRIX" "TEAM\_LICENSE\_MODULE\_STANDARD\_WORK\_INSTRUCTION" "TEAM\_LICENSE\_MODULE\_PARETO\_ANALYSIS" "KPI" "YEAR\_KPI\_ARCHIVAL" "CORPORATE\_CLOUD\_HOSTING" "ON\_PREMISES\_HOSTING" "SUPPORT\_SERVICE\_HOUR" "CLASS" "EXPERT" "SPINDLE\_HOUR" "ADDON\_ADMINISTRATION" "ADDON\_CONFIGURATION" "ADDON\_PLANNING" "ADDON\_PLANNING\_OBJECTS" "ADDON\_MASTER\_DATA" "ADDON\_CAPACITY\_PLANS\_CALENDAR" "ADDON\_CONFLICT\_RADAR" "ADDON\_GAP\_LIST" "ADDON\_DASHBOARD" "ADDON\_PLANNING\_READ\_ONLY" "ADDON\_UTILIZATION\_POOLS" "ADDON\_FIXED\_SCHEDULES" "ADDON\_ASSEMBLY\_GROUPS" "ADDON\_ORDER\_ON\_HOLD" "ADDON\_PARALLEL\_RESSOURCES" "ADDON\_MULTI\_FUNCTIONAL\_RESSOURCES" "ADDON\_PLANEUS\_TV\_PER\_TERMINAL" "ADDON\_MASTER\_DATA\_WORK\_PROCEDURES" "ADDON\_MANUAL\_IMPORT" "ADDON\_AUTOMATIC\_IMPORT" "ADDON\_REPORTING\_BASIC" "ADDON\_REPORTING\_ADVANCED" "ADDON\_REPORT\_RESOURCES\_AVAILABILITY\_PER\_DAY" "ADDON\_REPORT\_OEE" "ADDON\_REPORT\_ON\_TIME\_DELIVERY\_HISTORY" "ADDON\_REPORT\_PROCESS\_PERFORMANCE\_HISTORY" "ADDON\_REPORT\_UTILIZATION\_PER\_RESOURCE" "ADDON\_REPORT\_REPORTING\_PLUG\_IN" "ADDON\_EXTERNAL\_PARTNERS\_BASIC\_LICENSE" "ADDON\_WORKBENCH\_PACK\_OF\_5" "ADDON\_WORKBENCH\_PACK\_OF\_10" "ADDON\_WORKBENCH\_PACK\_OF\_15" "CLIENT" "VIRTUAL\_MACHINE" "MODEL\_TRANSFORMATION" "CASE\_REFRESH" "CASE\_VIEW" "CASE\_DOCUMENT\_DOWNLOAD" "VERIFICATION" "ADDON\_CORPORATE\_BRANDING" "CLIENT\_TAX\_FILINGS" "CLIENT\_COMPLIANCE\_SERVICES" "PROPOSAL" "UK\_ID\_CHECK" "INTERNATIONAL\_ID\_CHECK" "CREDIT\_SCREEN" "UK\_COMPANY\_REPORT" "NON\_UK\_COMPANY\_REPORT" "HR\_SCREEN" "COMPANY\_FORMATION" "CLIENT\_ACCOUNTS" "SMARTKIT" "WORKFLOW" "EDITOR" "WORKER" "ADDON\_POTENTIAL\_ANALYSIS" "TRAINING\_PACKAGE\_SMALL" "TRAINING\_PACKAGE\_LARGE" "TOOL\_PATH\_OPTIMIZATION" "CLIENT\_VAT\_FILINGS" "BUNDLE" "PACKAGE" "VM" "INCIDENT" "SEND" "INTEGRATION" "BILLABLE\_HOUR" "TB" "SOURCE" "TRAINING" "SITE" "CONSULTING\_UNIT" "CAPACITY" "MIGRATION" "WORKSHOP" "ONBOARDING" "BENEFIT\_ELIGIBLE\_EMPLOYEE" "SEAT" "MS365\_SEAT" "MS\_EXCHANGE\_MAILBOX" "GWORKSPACE\_SEAT" "INTERNET\_LINE" "BACKUP\_LINE" "USER\_PACK\_50" "USER\_PACK\_100" "CIRCUIT" "NAC" "INFRASTRUCTURE" "TEN\_THOUSAND\_TEST\_RUNS" "ONE\_THOUSAND\_TEST\_RUNS" "INGESTED\_OR\_SCANNED\_GB" "MILLION\_LOG\_EVENTS" "GB\_OUTBOUND\_PER\_DESTINATION" "DESTINATION" "COMMITTER" "INGESTED\_GB" "CPU" "ONE\_THOUSAND\_SESSIONS" "MILLION\_RECORDS" "GB\_OF\_ANALYZED\_LOGS" "ACTIVE\_FUNCTION" "MILLION\_TRACED\_INVOCATIONS" "ACTIVE\_APPLICATION\_INSTANCES" "HUNDRED\_TEST\_RUNS" "ADDITIONAL\_PARALLELIZATION" "TASK" "ONE\_HUNDRED\_WORKFLOW\_EXECUTIONS" "SCANNED\_GB" "USE\_CASE" "ONE\_THOUSAND\_ERROR\_EVENTS" "PERFORMANCE\_GOAL" "SCHOOL" "MICROSOFT\_365\_TENANT" "MARKETPLACE" "LIEN\_PROCESSED" "DISBURSEMENT" "A\_LA\_CARTE" "SECURE" "SECURE\_PLUS" "SECURE\_EXTRA" "PHASR" "ENCRYPTION" "EMAIL\_SECURITY" "MOBILE\_SECURITY" "EXCHANGE" "ATS" "EDR" "EDR\_RETENTION\_90D" "EDR\_RETENTION\_180D" "EDR\_RETENTION\_1Y" "INTEGRITY\_MON" "INTEGRITY\_MON\_RETENTION\_90D" "INTEGRITY\_MON\_RETENTION\_180D" "INTEGRITY\_MON\_RETENTION\_1Y" "MDR\_FOUNDATIONS" "PATCH\_MANAGEMENT" "VIRTUAL\_ENV\_VS" "VIRTUAL\_ENV\_VDI" "CONTAINER\_PROTECTION" "XDR\_IDENTITY\_SENSOR" "XDR\_PRODUCTIVITY\_SENSOR" "XDR\_NETWORK\_SENSOR" "XDR\_CLOUD\_SENSOR" "COMPLIANCE\_MANAGER" "EASM" "SUPERVISOR" "GB\_OF\_PROVISIONED\_VM\_RAM\_PER\_HOUR" "GB\_OF\_USED\_VM\_STORAGE\_PER\_HOUR" "GB\_OF\_USED\_S3\_STORAGE\_PER\_HOUR" "VIRTUAL\_ENVIRONMENT\_VE\_PER\_MONTH" "STORAGE\_100\_GB\_PER\_MONTH" "GB\_RAM\_UNDER\_MANAGEMENT\_PER\_MONTH" "GB\_OF\_VM\_RAM\_PER\_HOUR" "BUSINESS\_CLIENT" "SELF\_EMPLOYED\_CLIENT" "LANDLORD\_CLIENT" "DATA\_HEALTH\_AND\_INSIGHT\_ADDON" "SWITCH\_DAY" "ACCESS\_POINT\_DAY" "DATABASE" "FUNCTION" "APP\_SERVICE" "FIREWALL" "EDR\_SA\_MDR\_FOUNDATIONS" "EDR\_SA" "FED\_USF\_CHARGE" "SERVICE\_FEE" "SERVICE\_FEE\_AP" "SERVICE\_FEE\_SWITCH" "SERVICE\_FEE\_ROUTER" "USER\_LICENCE\_DAY" "DEVICE\_DAY" "VM\_DAY" "ROUTER\_DAY" "FSE" "ON\_SITE\_SERVICE" "BASIC" "BASIC\_PLUS" "STANDARD" "STANDARD\_PLUS" "ADVANCED" "ADVANCED\_PLUS" "PREMIUM\_PLUS" "XXS" "XS" "SMALL" "MEDIUM" "LARGE" "XL" "XXL" "XXXL" "CUSTOM" "ENHANCED" "INCIDENT\_RESPONSE\_SERVICE" "JIRA\_CONNECTOR" "SHAREPOINT\_CONNECTOR" "CONFLUENCE\_CONNECTOR" "PRIVATE\_ACCESS" "INTERNET\_ACCESS" | | vendorSharePercentage | number or nullVendor's percentage share of the discount. | ### Responses **200** OK **400** Bad Request **404** Not Found **409** Conflict put/channel/v1/discounts/{discountId} https\://marketplace.appdirect.com/api/channel/v1/discounts/{discountId} https\://virtserver.swaggerhub.com/channel/v1/discounts/{discountId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "applicationId": 0, "applicationUuid": "string", "applicationName": "string", "autoApply": true, "basePartnerSharePercentage": 0, "billingCycles": 0, "code": "string", "createdOn": 0, "description": "string", "editionId": 0, "editionUuid": "string", "expirationDate": 0, "id": 0, "uuid": "string", "industryId": 0, "maxRedemptions": 0, "maxUnits": 0, "minUnits": 0, "partnerSharePercentage": 0, "paymentPlanId": 0, "paymentPlanUuid": "string", "percentage": 0, "price": 0, "redemptionRestriction": "string", "redemptions": 0, "retainable": true, "startDate": 0, "type": "string", "unit": "USER", "vendorSharePercentage": 0 }` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Discount/operation/resource_Other_readDiscount_GET)Retrieve discounts Retrieves the discount for the given discount ID or UUID. ##### path Parameters | | | | ------------------ | ---------------------------------- | | discountIdrequired | stringDiscount ID or Discount UUID | ### Responses **200** OK **404** Not Found get/channel/v1/discounts/{discountId} https\://marketplace.appdirect.com/api/channel/v1/discounts/{discountId} https\://virtserver.swaggerhub.com/channel/v1/discounts/{discountId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/channel/v1/discounts/%7BdiscountId%7D ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Discount/operation/resource_Other_deleteDiscount_DELETE)Delete discounts Deletes the discount with the specified discount ID or UUID. ##### path Parameters | | | | ------------------ | ---------------------------------- | | discountIdrequired | stringDiscount ID or Discount UUID | ### Responses **204** No Content **404** Not Found delete/channel/v1/discounts/{discountId} https\://marketplace.appdirect.com/api/channel/v1/discounts/{discountId} https\://virtserver.swaggerhub.com/channel/v1/discounts/{discountId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/channel/v1/discounts/%7BdiscountId%7D ``` # [](#tag/Domains)Domains ## [](#tag/Domains/operation/resource_Company_readDomains_GET)List company domains Retrieve a marketplace company's domains. ##### Required Scopes and Authorization Rules * `ROLE_BILLING_ADMIN` - Allows access as a Billing Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### query Parameters | | | | ---------- | --------------------------------------------- | | searchText | stringSearch term used to search domain names | ### Responses **200** Success **401** Unauthorized **404** Company not found get/account/v2/companies/{companyUuid}/domains https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/domains https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/domains ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/domains?searchText=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Domains/operation/resource_Company_readDomain_GET)Read company domain Get a specific company domain ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as owner of the company domain. * `ROLE_BILLING_ADMIN` - Allows access as a Billing Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | domainNamerequired | stringCompany domain name | ### Responses **200** Success **401** Unauthorized **404** Company/Domain name not found get/account/v2/companies/{companyUuid}/domains/{domainName} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/domains/{domainName} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/domains/{domainName} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/domains/%7BdomainName%7D ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Domains/operation/resource_Company_getVerifiedDomains_GET)List verified company domains Retrieve a marketplace company's verified domains. ##### Required Scopes and Authorization Rules * `ROLE_BILLING_ADMIN` - Allows access as a Billing Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ### Responses **200** Success **401** Unauthorized **404** Company not found get/account/v2/companies/{companyUuid}/verifiedDomains https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/verifiedDomains https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/verifiedDomains ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/verifiedDomains ``` ### Response samples * 200 Content type \*/\*\*/\* No sample # [](#tag/Edition)Editions ## [](#tag/Edition/operation/resource_Edition_readEdition_GET)Retrieve an edition This call returns all details related to a specific product edition ##### path Parameters | | | | --------------------- | ---------------- | | applicationIdrequired | numberproduct id | | editionIdrequired | numberEdition id | ### Responses **200** Edition information returned. **404** Application or edition not found. get/marketplace/v1/products/{applicationId}/editions/{editionId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/editions/{editionId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/editions/{editionId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/editions/%7BeditionId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample # [](#tag/Event)Events ## [](#tag/Event/operation/resource_Other_readEvents_GET)List all events This call lists all events on your marketplace. ##### query Parameters | | | | ---------- | ---------------------------------------------------------------------------------------------------------------- | | fromDate | numberSearch events from this date in milliseconds. | | orderId | numberOnly return events for these purchase order. | | page | stringDefault:"0"The desired page. Defaults to "0". | | searchText | string\[ 0 .. 1024 ] charactersSearch term used to search on different fields of an application. | | size | stringDefault:"50"The number of events per page. Defaults to "250". | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Ordering type. Default is "ASC". | | toDate | numberSearch events to this date in milliseconds. | | type | stringOnly return events for these event type. | ### Responses **200** paged events. get/channel/v1/events https\://marketplace.appdirect.com/api/channel/v1/events https\://virtserver.swaggerhub.com/channel/v1/events ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/events?fromDate=SOME_NUMBER_VALUE&orderId=SOME_NUMBER_VALUE&page=SOME_STRING_VALUE&searchText=SOME_STRING_VALUE&size=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&toDate=SOME_NUMBER_VALUE&type=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "links": [ ], "content": [ { "uuid": "EventID", "type": "SUBSCRIPTION_ORDER", "creationDate": 1480310700384, "product": { "productId": 1341, "name": "wvrZh7o1WOrZxmt3", "links": [ { "rel": "self", "href": "http://appdirect/api/marketplace/v1/products/1341" } ] }, "company": { "companyId": null, "name": "companyName", "links": [ { "rel": "self", "href": "http://appdirect/api/account/v1/companies/null" } ] }, "orderId": 362, "subscriptionId": null, "consumed": false, "successful": true, "asynchronous": true, "error": { "code": null, "message": null }, "manuallyResolved": false } ], "page": { "size": 1, "totalElements": 1, "totalPages": 1, "number": 0 } }` ## [](#tag/Event/operation/resource_Other_readEventById_GET)Retrieve an event This call returns all details for a specific event. ##### path Parameters | | | | --------------- | ------------------------------------------- | | eventIdrequired | stringOnly return event with this event id. | ### Responses **200** Event read. **404** Event not found. get/channel/v1/events/{eventId} https\://marketplace.appdirect.com/api/channel/v1/events/{eventId} https\://virtserver.swaggerhub.com/channel/v1/events/{eventId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/channel/v1/events/%7BeventId%7D ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "uuid": "EventID", "type": "SUBSCRIPTION_ORDER", "creationDate": 1480310699136, "product": { "productId": 1335, "name": "rWA4Y3hiV6yU9OHm", "links": [ { "rel": "self", "href": "http://appdirect/api/marketplace/v1/products/1335" } ] }, "company": { "companyId": "acecc1af-174c-467c-9ac6-a1469ff9ef1a", "name": "companyName", "links": [ { "rel": "self", "href": "http://appdirect/api/account/v1/companies/acecc1af-174c-467c-9ac6-a1469ff9ef1a" } ] }, "orderId": 356, "subscriptionId": 354, "consumed": false, "successful": true, "asynchronous": true, "error": { "code": null, "message": null }, "manuallyResolved": false, "links": [ { "rel": "self", "href": "http://appdirect/api/channel/v1/events/EventID" } ] }` # [](#tag/Group)Groups ## [](#tag/Group/operation/resource_Group_readAll_GET)List user groups Retrieve a marketplace company's user groups. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### query Parameters | | | | ---------- | ------------------------------------------------------------------------------------------------------- | | page | integerDefault:0Zero-based page index | | searchText | stringSearch term used to search groups names | | size | integerDefault:50The size of the page to be returned | | sortField | stringDefault:"createdOn"The property to sort by. Supported values are createdOn, name. | | sortOrder | stringDefault:"DESC"Enum: "ASC" "DESC"Ordering type | ### Responses **200** Success **401** Unauthorized **404** Company not found. get/account/v2/companies/{companyUuid}/groups https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/groups https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/groups ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/groups?page=SOME_INTEGER_VALUE&searchText=SOME_STRING_VALUE&size=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE' ``` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/Group/operation/resource_Group_create_POST)Create user group Create a user group for a marketplace company. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### Request Body schema: application/json Group creation data | | | | ----------- | -------------------------------- | | description | stringCompany group description. | | name | stringCompany group name. | ### Responses **201** Created **401** Unauthorized **404** Company not found. post/account/v2/companies/{companyUuid}/groups https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/groups https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/groups ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "name": "HR", "description": "Human Resources" }` ### Response samples * 201 * 404 Content type \*/\*\*/\* No sample ## [](#tag/Group/operation/resource_Group_update_PUT)Update user group Update user group for the requested marketplace company. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | groupUuidrequired | stringUnique identifier of group in the API request | ##### Request Body schema: application/json Updated user grouop data | | | | ----------- | -------------------------------- | | description | stringCompany group description. | | name | stringCompany group name. | ### Responses **200** Success **401** Unauthorized **404** Company or company group not found put/account/v2/companies/{companyUuid}/groups/{groupUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/groups/{groupUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/groups/{groupUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "name": "Engineer", "description": "Engineering" }` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/Group/operation/resource_Group_read_GET)Read user group Retrieve a marketplace company's user group. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | groupUuidrequired | stringUnique identifier of group in the API request | ### Responses **200** Success **401** Unauthorized **404** Group is not found for company get/account/v2/companies/{companyUuid}/groups/{groupUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/groups/{groupUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/groups/{groupUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/groups/%7BgroupUuid%7D ``` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/Group/operation/resource_Group_delete_DELETE)Delete user group Delete a user group for the requested marketplace company. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | groupUuidrequired | stringUnique identifier of group in the API request | ### Responses **204** Success **401** Unauthorized **404** Group is not found for company delete/account/v2/companies/{companyUuid}/groups/{groupUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/groups/{groupUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/groups/{groupUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/groups/%7BgroupUuid%7D ``` ### Response samples * 404 Content type \*/\*\*/\* No sample ## [](#tag/Group/operation/resource_Group_readGroupMemberships_GET)List user group members List members of a user group for the requested marketplace company. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | groupUuidrequired | stringUnique identifier of group in the API request | ##### query Parameters | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | searchText | stringOptional parameter object containing:
searchText - Search term used to search on different fields of a user
role - If specified, only users with the specified marketplace role are returned
status - If specified, only users with the specified status are returned | | member | booleanDefault:trueWhen true, only group members are return. When false, non-members of the group are returned. | | page | integerDefault:0Zero-based page index | | size | integerDefault:50The size of the page to be returned @return List of user/company membership resources | ### Responses **200** Success **401** Unauthorized **404** Company or company group not found get/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/groups/%7BgroupUuid%7D/memberships?searchText=SOME_STRING_VALUE&member=SOME_BOOLEAN_VALUE&page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE' ``` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/Group/operation/resource_Group_batchCreateOrUpdateGroupMemberships_POST)Create batch group memberships change requests. Create batched group memberships change requests. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | groupUuidrequired | stringUnique identifier of group in the API request | ##### query Parameters | | | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------ | | validateOnly | booleanDefault:falseIf specified, the API returns a response without actually persisting it through to the database. | ##### Request Body schema: application/json | | | | ----------------------- | --------------------------------------------------------------- | | appAssignmentRequests | Array of objects (AssignmentRequest) | | appUnassignmentRequests | Array of objects (UassignmentRequest) | | assignments | Array of objects (UserGroupAssignmentRequest) | | unassignments | Array of objects (UserGroupUnassignmentRequest) | ### Responses **200** Success **401** Unauthorized **404** Company or company group not found post/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "assignments": [ { "userUuid": "85c8ccee-8207-45bb-9b3d-ac4e20f14234" } ], "unassignments": [ { "userUuid": "17750a3b-d253-431e-8c72-deb7e0d0ef98" } ], "appAssignmentRequests": [ { "userUuid": "49af5a70-e2ef-4c53-a44b-85510db91056", "companyEntitlementUuid": "e160db9b-9b72-4578-83b5-7bf61ce88069", "parameters": { } } ], "appUnassignmentRequests": [ { "userEntitlementId": 1941 } ] }` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/Group/operation/resource_Group_saveGroupMembership_PUT)Add user to group Add a user to marketplace company's user group. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. ##### path Parameters | | | | ------------------- | -------------------------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | groupUuidrequired | stringUnique identifier of group in the API request | | userUuidrequired | stringUnique identifier of user (part of company) in the API request | ### Responses **204** Success **401** Unauthorized **404** User is not a member of the company or group is not found for company **500** Could not manually assign/unassign a member to/from a system managed group put/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships/{userUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships/{userUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships/{userUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request PUT \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/groups/%7BgroupUuid%7D/memberships/%7BuserUuid%7D ``` ### Response samples * 204 * 404 Content type \*/\*\*/\* No sample ## [](#tag/Group/operation/resource_Group_readGroupMembership_GET)Read user from group Retrieve a user/company membership resource. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | groupUuidrequired | stringUnique identifier of group in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ### Responses **200** Success **401** Unauthorized **404** User is not a member of the company or group is not found for company get/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships/{userUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships/{userUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships/{userUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/groups/%7BgroupUuid%7D/memberships/%7BuserUuid%7D ``` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/Group/operation/resource_Group_deleteGroupMembership_DELETE)Delete user from group Delete a user from a marketplace company's user group. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | groupUuidrequired | stringUnique identifier of group in the API request | | userUuidrequired | stringUnique identifier of user in the API request | ### Responses **204** No Content **401** Unauthorized **404** User is not a member of the company or group is not found for company delete/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships/{userUuid} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships/{userUuid} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/groups/{groupUuid}/memberships/{userUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/groups/%7BgroupUuid%7D/memberships/%7BuserUuid%7D ``` ### Response samples * 404 Content type \*/\*\*/\* No sample # [](#tag/Invitation)Invitations ## [](#tag/Invitation/operation/resource_Company_revokeInvitation_DELETE)Revoke user invitation Revoke a user's invitiation to a marketplace company. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | | emailrequired | stringEmail address of invitee in the API request | ##### query Parameters | | | | ----------- | --------------------------------------------------------------- | | inviterUuid | stringUnique identifier of marketplace user who sent invitation | ### Responses **200** Success **400** Bad Request **401** Unauthorized **403** Forbidden to delete invitation of an active user **404** Company, inviter or invitation not found delete/account/v2/companies/{companyUuid}/invitations/{email} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/invitations/{email} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/invitations/{email} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/invitations/%7Bemail%7D?inviterUuid=SOME_STRING_VALUE' ``` ## [](#tag/Invitation/operation/resource_Company_getInvitedUsers_GET)List company invitations Retrieve a marketplace company's user invitations. ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### query Parameters | | | | ----------- | --------------------------------------------------------------- | | filter | stringFilter query used to reduce the returned result set | | inviterUuid | stringUnique identifier of marketplace user who sent invitation | ### Responses **200** Success **401** Unauthorized **404** Company, inviter or invitation not found get/account/v2/companies/{companyUuid}/invitations https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/invitations https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/invitations ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/invitations?filter=SOME_STRING_VALUE&inviterUuid=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Invitation/operation/resource_Company_inviteUsers_POST)Invite users to company Invite multiple users to a marketplace company using list of Invitation resources. **Note: You cannot set the Marketplace Manager role through the API.** ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### query Parameters | | | | ------------------- | ---------------------------------------------------------------------------------------------------- | | api.usesExternalIds | booleanDefault:falseIf "true", specified companyUuid is used as company external Id. | | inviterUuid | stringUnique identifier of inviter (marketplace user) in the API request | ##### Request Body schema: application/json List of invitation resources. Array | | | | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | email | stringEmail the invitation was sent to. | | role | string (Role)Enum: "USER" "APPLICATION" "PARTNER" "PARTNER\_READ" "COMPANY" "CLIENT" "CHECKOUT\_USER" "BILLING\_ADMIN" "SYS\_ADMIN" "DEVELOPER" "CHANNEL\_PRODUCT\_SUPPORT" "CHANNEL\_SUPPORT" "CHANNEL\_ADMIN" "CORPORATE\_ADMIN" "SUPERUSER" "SUPER\_SUPPORT" "ANALYTICS\_ADMIN" "LAYOUT\_DESIGNER" "SALES\_SUPPORT" "RESTRICTED\_SALES\_SUPPORT" "RESELLER" "RESELLER\_MANAGER" "TESTER" "MONITORING" "SYSTEM" | ### Responses **200** Success **401** Unauthorized **404** Company or inviter not found post/account/v2/companies/{companyUuid}/invitations https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/invitations https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/invitations ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `[ { "email": "test1@email.com", "role": "DEVELOPER" }, { "email": "test2@email.com", "role": "ROLE_USER" }, { "email": "test3@email.com", "role": "ROLE_SYS_ADMIN" } ]` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Invitation/operation/resource_Company_inviteCSVUsers_POST)Invite users to company (CSV) Invite multiple users to a marketplace company using a CSV file. This method expects a Content-Type request header with a value of “multipart/form-data”, “text/plain” or “text/csv”. **Note: You cannot set the Marketplace Manager role through the API.** ##### Required Scopes and Authorization Rules * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ------------------- | ----------------------------------------------------- | | companyUuidrequired | stringUnique identifier of company in the API request | ##### query Parameters | | | | ----------- | ------------------------------------------------------------------------ | | inviterUuid | stringUnique identifier of inviter (marketplace user) in the API request | ##### Request Body schema: multipart/form-data | | | | ----------- | ------------------------------------------------------------------- | | invitations | string<binary>CSV file to uploaded. | ### Responses **200** Success **401** Unauthorized **404** Company or inviter not found post/account/v2/companies/{companyUuid}/invitations/csv https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/invitations/csv https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/invitations/csv ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url 'https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/invitations/csv?inviterUuid=SOME_STRING_VALUE' \ --header 'content-type: multipart/form-data' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Invitation/operation/resource_Invitation_updateInvitationWithRegistration_POST)Accept user invitation Accept a user's invitation to a marketplace company ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. ##### path Parameters | | | | ----------------------- | ------------------------------------------------ | | invitationTokenrequired | stringUnique invitation token in the API request | ##### query Parameters | | | | ------------------- | ------------------------------------------------------------------------------------------------- | | api.usesExternalIds | booleanDefault:falseWhen "true", inviter external Id will be used instead of UUID | ##### Request Body schema: application/json User registration resource | | | | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | | links | Array of objects or null (Link)Resource links | | externalIdentifier | stringExternal identifier of user | | firstName | stringFirst name of user | | lastName | string or nullLast name of user | | locale | stringLocale of user in the standard ISO 639-1 language code + ISO 3166-1 country code format. For example: 'en\_US', 'fr\_CA' etc | | password | stringPassword | | title | stringTitle of user | ### Responses **200** Success **400** Invitee is already an active user, first/last names are missing or a user already exists with the same external id **401** Unauthorized **403** Role hierarchy violation. The user making the request cannot change the password of a user with a higher role than their own. **404** Invitation not found post/account/v2/invitations/{invitationToken}/registration https\://marketplace.appdirect.com/api/account/v2/invitations/{invitationToken}/registration https\://virtserver.swaggerhub.com/account/v2/invitations/{invitationToken}/registration ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "links": [ { "href": "...", "rel": "..." }, { "href": "...", "rel": "..." } ], "externalIdentifier": "123456456", "firstName": "John", "lastName": "Doe", "locale": "en_US", "password": "Admin123", "title": "MS" }` ### Response samples * 200 Content type \*/\*\*/\* No sample # [](#tag/Invoice)Invoices ## [](#tag/Invoice/operation/resource_Other_readUserInvoices_GET)List all invoices for a user List all of the invoices for the given user ##### path Parameters | | | | ----------------- | ------------------------- | | companyIdrequired | stringUser's company UUID | | userIdrequired | stringUser UUID | ##### query Parameters | | | | ----------- | ------------------------------------------------------------------------------------------------------- | | count | integerDefault:250Number of results to fetch. Used for paging. | | excludeFree | booleanExclude invoices with no charges (free) | | fromDate | numberFrom date | | sortField | stringDefault:"INVOICE\_ID"Enum: "DATE" "INVOICE\_ID" "TOTAL"Sort field | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order | | start | integerDefault:0First result index. Used for paging. | | status | stringEnum: "CARRIED" "PAID" "UNPAID" "VOIDED"Invoice status | | toDate | numberTo date | ### Responses **200** OK **404** Not Found get/billing/v1/companies/{companyId}/users/{userId}/invoices https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/invoices https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/invoices ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/companies/%7BcompanyId%7D/users/%7BuserId%7D/invoices?count=SOME_INTEGER_VALUE&excludeFree=SOME_BOOLEAN_VALUE&fromDate=SOME_NUMBER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE&status=SOME_STRING_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Invoice/operation/resource_Other_readCompanyInvoices_GET)List all invoices for a company List all of the invoices for the given company ##### path Parameters | | | | ----------------- | ------------------ | | companyIdrequired | stringCompany UUID | ##### query Parameters | | | | ----------- | ------------------------------------------------------------------------------------------------------- | | count | integerDefault:250Number of results to fetch. Used for paging. | | excludeFree | booleanExclude invoices with no charges (free) | | fromDate | numberFrom date | | sortField | stringDefault:"INVOICE\_ID"Enum: "DATE" "INVOICE\_ID" "TOTAL"Sort field | | sortOrder | stringDefault:"DESC"Enum: "ASC" "DESC"Sort order | | start | integerDefault:0First result index. Used for paging. | | status | stringEnum: "CARRIED" "PAID" "UNPAID" "VOIDED"Invoice status | | toDate | numberTo date | ### Responses **200** OK **404** Not Found get/billing/v1/companies/{companyId}/invoices https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/invoices https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/invoices ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/companies/%7BcompanyId%7D/invoices?count=SOME_INTEGER_VALUE&excludeFree=SOME_BOOLEAN_VALUE&fromDate=SOME_NUMBER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE&status=SOME_STRING_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Invoice/operation/resource_Other_readInvoicePayments_GET)List All Invoice Payments List all payment data for an invoice ##### path Parameters | | | | --------------------- | ---------------------- | | invoiceNumberrequired | integerInvoice number. | ##### query Parameters | | | | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | count | stringDefault:"250"Number of results to fetch. Used for paging. | | fromDate | numberFrom date. | | method | stringEnum: "ADP\_INVOICE" "ARIBAPAY" "BT\_BILL" "CLICKANDBUY" "CLOUDFOUNDRY" "CREDIT\_CARD" "CUMULA\_BILL" "DTAG" "EXTERNAL\_INVOICE" "KREDITKARTE" "LASTSCHRIFT\_MRNEXNET" "MANO\_TEO\_BILL" "MANUAL" "MARKETPLACE\_CREDITS" "NETS\_ARVATO\_INVOICE" "NEXTEL" "PAYPAL" "ROGERS\_CC\_DTMF" "ROGERS\_CC\_POS" "SNAP" "TBILL" "THISTLE" "TOICLEARING"Payment method. | | result | stringEnum: "FAILED" "GATEWAY\_NOT\_AVAILABLE" "MANUAL" "SUCCESSFUL"Payment result. | | sortField | stringDefault:"PAYMENT\_ID"Enum: "AMOUNT" "DATE" "PAYMENT\_ID"Sort field. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order. | | start | stringDefault:"0"First result index. Used for paging. | | toDate | numberTo date. | ### Responses **200** OK **204** No Content **401** Unauthorized **404** Not Found get/billing/v1/invoices/{invoiceNumber}/payments https\://marketplace.appdirect.com/api/billing/v1/invoices/{invoiceNumber}/payments https\://virtserver.swaggerhub.com/billing/v1/invoices/{invoiceNumber}/payments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/invoices/%7BinvoiceNumber%7D/payments?count=SOME_STRING_VALUE&fromDate=SOME_NUMBER_VALUE&method=SOME_STRING_VALUE&result=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_STRING_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 * 204 Content type application/xmlapplication/xml No sample ## [](#tag/Invoice/operation/resource_Other_payInvoice_POST)Pay an Invoice If the invoice is unpaid, will process the payment and return the result. Will return an exception otherwise ##### path Parameters | | | | --------------------- | --------------------------------------------------------------------- | | invoiceNumberrequired | integerThe unique identifier for the invoice provided by the channel. | ##### Request Body schema:application/xmlapplication/xml Payment data object. | | | | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | links | Array of objects or null (Link)Resource links | | amount | number or nullPayment amount. | | company | object or null (LinkWS) | | currency | string (Currency)Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Supported currencies for the system | | date | number or nullPayment date. | | gatewayResponse | object (GatewayResponse) | | id | number or nullPayment number. | | method | string (PaymentMethod)Enum: "CREDIT\_CARD" "PAYPAL" "MANUAL" "EXTERNAL\_INVOICE" "MARKETPLACE\_CREDITS"The supported payment methods | | result | string (PaymentResult)Enum: "SUCCESSFUL" "FAILED" "GATEWAY\_NOT\_AVAILABLE" "MANUAL" | | transactionId | string or nullTransaction ID. | | user | object or null (LinkWS) | ### Responses **200** OK **400** Bad Request **401** Unauthorized **404** Not Found **409** Conflict post/billing/v1/invoices/{invoiceNumber}/payments https\://marketplace.appdirect.com/api/billing/v1/invoices/{invoiceNumber}/payments https\://virtserver.swaggerhub.com/billing/v1/invoices/{invoiceNumber}/payments ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Invoice/operation/resource_Other_readInvoices_GET)List All Invoices List all invoice data ##### query Parameters | | | | ----------- | ----------------------------------------------------------------------------------------------------------------------------------- | | count | stringDefault:"250"Number of results to fetch. Used for paging. | | excludeFree | booleanExclude invoices with no charges. | | fromDate | numberFrom date. | | sortField | stringDefault:"INVOICE\_ID"Enum: "DATE" "INVOICE\_ID" "TOTAL"Sort field. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order. | | start | stringDefault:"0"First result index. Used for paging. | | status | stringEnum: "CARRIED" "PAID" "UNPAID" "VOIDED"Invoice status. | | toDate | numberTo date. | | buyerRole | stringEnum: "ALL" "CUSTOMER" "RESELLER" "SALES\_SUPPORT"Filter invoices with purchases made by user with this role. | ### Responses **200** OK **204** No Content **401** Unauthorized **404** Not Found get/billing/v1/invoices https\://marketplace.appdirect.com/api/billing/v1/invoices https\://virtserver.swaggerhub.com/billing/v1/invoices ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/invoices?count=SOME_STRING_VALUE&excludeFree=SOME_BOOLEAN_VALUE&fromDate=SOME_NUMBER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_STRING_VALUE&status=SOME_STRING_VALUE&toDate=SOME_NUMBER_VALUE&buyerRole=SOME_STRING_VALUE' ``` ### Response samples * 200 * 204 Content type application/xmlapplication/xml No sample ## [](#tag/Invoice/operation/resource_Other_readInvoice_GET)Retrieve an Invoice Read an invoice ##### path Parameters | | | | --------------------- | --------------------------------------------------------------------- | | invoiceNumberrequired | integerThe unique identifier for the invoice provided by the channel. | ### Responses **200** OK **401** Unauthorized **404** Not Found get/billing/v1/invoices/{invoiceNumber} https\://marketplace.appdirect.com/api/billing/v1/invoices/{invoiceNumber} https\://virtserver.swaggerhub.com/billing/v1/invoices/{invoiceNumber} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/billing/v1/invoices/%7BinvoiceNumber%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Invoice/operation/resource_Other_patchInvoice_PATCH)Patch method to partially update an invoice Currently only used to void an invoice by updating the invoice status ##### path Parameters | | | | --------------------- | ------------------------------------------------------------------- | | invoiceNumberrequired | integerThe unique identifier of the invoice that should be patched. | ##### Request Body schema:application/xmlapplication/xml | | | | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | links | Array of objects or null (Link)Resource links | | company | object or null (LinkWS) | | creationDate | number or nullCreation date for the invoice. | | orderIds | Array of stringsArray of Order IDs | | currency | string (Currency)Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Supported currencies for the system | | dueDate | number or nullDue date for the invoice. | | invoiceId | number or nullInvoice ID. | | referenceNumber | string or nullReference number. | | status | string (InvoiceStatus)Enum: "PAID" "UNPAID" "CARRIED" "VOIDED" | | total | number or nullInvoice total. | | user | object or null (LinkWS) | | delegatedToInvoice | object or null (LinkWS) | | includedInvoices | Array of objects or null or null (LinkWS)List of links to the included invoices | | invoiceLines | Array of objects (InvoiceLine)List of Invoice lines | ### Responses **200** OK **400** Bad Request **401** Unauthorized **404** Not Found patch/billing/v1/invoices/{invoiceNumber} https\://marketplace.appdirect.com/api/billing/v1/invoices/{invoiceNumber} https\://virtserver.swaggerhub.com/billing/v1/invoices/{invoiceNumber} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample # [](#tag/Lead)Lead v1 ## [](#tag/Lead/operation/resource_Lead_readLeads_GET)List leads List leads ##### query Parameters | | | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | fromDate | integerSearch for leads created on of after this date, in milliseconds since epoch | | page | integerDefault:0Zero-based page index | | searchText | stringSearch term used to search on different fields of a lead | | size | integerDefault:50The size of the page to be returned | | sortField | stringDefault:"DATE"Enum: "COMPANY\_NAME" "DATE" "RESELLER\_LAST\_NAME" "USER\_FULL\_NAME" "USER\_LAST\_NAME"The property to sort by | | sortOrder | stringDefault:"DESC"Enum: "ASC" "DESC"Ordering type | | source | Array of stringsIf specified, only return leads with matching source(s) | | status | Array of stringsIf specified, only return leads with matching status(es) | | target | Array of stringsIf specified, only return leads with matching target(s) | | toDate | integerSearch for leads created on of before this date, in milliseconds since epoch | ### Responses **200** Success get/prm/v1/leads https\://marketplace.appdirect.com/api/prm/v1/leads https\://virtserver.swaggerhub.com/prm/v1/leads ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/prm/v1/leads?fromDate=SOME_INTEGER_VALUE&page=SOME_INTEGER_VALUE&searchText=SOME_STRING_VALUE&size=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&source=SOME_ARRAY_VALUE&status=SOME_ARRAY_VALUE&target=SOME_ARRAY_VALUE&toDate=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Lead/operation/resource_Lead_createLead_POST)Create a lead Create a lead ##### query Parameters | | | | -------------------- | ---------------------------------------------------------------------------------------------------------------------- | | ignoreDuplicateEmail | booleanDefault:falsewhen true, duplicate emails are accepted. Applies only to reseller referral leads. | ##### Request Body schema: application/json Lead data | | | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------- | | additionalComment | string or nullAny note that you want to add about the lead | | anticipatedCloseDate | number or nullThe anticipated date that the lead will be closed in UNIX Epoch milliseconds | | anticipatedNumberOfSeats | number or nullThe number of licenses required for the subcription | | attributes | objectCustom attributes for the lead | | comment | string or nullAny note that you want to add about the lead | | creationDate | number or nullThe date the lead was created in UNIX Epoch milliseconds | | customer | object (CompanyContact) | | externalIdentifier | string or nullAn optional identifier provided by the markeplace owner | | lastModificationDate | number or nullThe date that the lead was last modified in UNIX Epoch milliseconds | | reseller | object (CompanyContact) | | useCaseDescription | string or nullDescription of what the lead customer needs | | uuid | string or nullThe unique identifier of either the lead or the opportunity | | application | object or null (ApplicationReseller) | | customerLeadForProvider | booleanIndicates whether a lead is for a marketplace owner (true) or not (false) | | customerLeadForReseller | booleanIndicates whether a lead is for a Reseller (true) or not (false) | | customerLeadForVendor | booleanIndicates whether a lead is for a vendor (true) or not (false) | | edition | object or null (LeadEdition) | | referralLead | booleanIndicates whether the lead was created by a Reseller (true) or not (false) | | source | string (SalesLeadSource)Enum: "RESELLER" "CUSTOMER" | | status | string or null (SalesLeadStatus)Enum: "PENDING" "DENIED" "ACCEPTED" "ASSIGNED" "LOST" "WON" | | target | string or null (SalesLeadTarget)Enum: "PROVIDER" "RESELLER" "VENDOR" | ### Responses **204** Lead created **409** Duplicate email address post/prm/v1/leads https\://marketplace.appdirect.com/api/prm/v1/leads https\://virtserver.swaggerhub.com/prm/v1/leads ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "additionalComment": "...", "anticipatedCloseDate": "...", "anticipatedNumberOfSeats": "...", "attrbutes": "...", "comment": "...", "creationDate": "...", "customer": "...", "externalIdentifier": "...", "lastModificationDate": "...", "reseller": "...", "useCaseDescription": "...", "uuid": "...", "application": "...", "attributes": "...", "customerLeadForProvider": "...", "customerLeadForReseller": "...", "customerLeadForVendor": "...", "edition": "...", "referalLead": "...", "source": "...", "status": "...", "target": "..." }` ### Response samples * 204 Content type \*/\*\*/\* No sample ## [](#tag/Lead/operation/resource_Lead_readLead_GET)Read a lead Read a lead ##### path Parameters | | | | ------------ | --------------- | | uuidrequired | stringLead UUID | ### Responses **200** Success get/prm/v1/leads/{uuid} https\://marketplace.appdirect.com/api/prm/v1/leads/{uuid} https\://virtserver.swaggerhub.com/prm/v1/leads/{uuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/prm/v1/leads/%7Buuid%7D ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Lead/operation/resource_Lead_updateLead_PATCH)Update a lead Update a lead ##### path Parameters | | | | ------------ | --------------- | | uuidrequired | stringLead UUID | ##### Request Body schema: application/json (Partial) Lead data. Only specified fields will override current lead fields. Unknown fields, or fields that can't be updated are ignored. | | | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------- | | additionalComment | string or nullAny note that you want to add about the lead | | anticipatedCloseDate | number or nullThe anticipated date that the lead will be closed in UNIX Epoch milliseconds | | anticipatedNumberOfSeats | number or nullThe number of licenses required for the subcription | | attributes | objectCustom attributes for the lead | | comment | string or nullAny note that you want to add about the lead | | creationDate | number or nullThe date the lead was created in UNIX Epoch milliseconds | | customer | object (CompanyContact) | | externalIdentifier | string or nullAn optional identifier provided by the markeplace owner | | lastModificationDate | number or nullThe date that the lead was last modified in UNIX Epoch milliseconds | | reseller | object (CompanyContact) | | useCaseDescription | string or nullDescription of what the lead customer needs | | uuid | string or nullThe unique identifier of either the lead or the opportunity | | application | object or null (ApplicationReseller) | | customerLeadForProvider | booleanIndicates whether a lead is for a marketplace owner (true) or not (false) | | customerLeadForReseller | booleanIndicates whether a lead is for a Reseller (true) or not (false) | | customerLeadForVendor | booleanIndicates whether a lead is for a vendor (true) or not (false) | | edition | object or null (LeadEdition) | | referralLead | booleanIndicates whether the lead was created by a Reseller (true) or not (false) | | source | string (SalesLeadSource)Enum: "RESELLER" "CUSTOMER" | | status | string or null (SalesLeadStatus)Enum: "PENDING" "DENIED" "ACCEPTED" "ASSIGNED" "LOST" "WON" | | target | string or null (SalesLeadTarget)Enum: "PROVIDER" "RESELLER" "VENDOR" | ### Responses **200** Success patch/prm/v1/leads/{uuid} https\://marketplace.appdirect.com/api/prm/v1/leads/{uuid} https\://virtserver.swaggerhub.com/prm/v1/leads/{uuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "additionalComment": "...", "anticipatedCloseDate": "...", "anticipatedNumberOfSeats": "...", "attrbutes": "...", "comment": "...", "creationDate": "...", "customer": "...", "externalIdentifier": "...", "lastModificationDate": "...", "reseller": "...", "useCaseDescription": "...", "uuid": "...", "application": "...", "attributes": "...", "customerLeadForProvider": "...", "customerLeadForReseller": "...", "customerLeadForVendor": "...", "edition": "...", "referalLead": "...", "source": "...", "status": "...", "target": "..." }` ### Response samples * 200 Content type \*/\*\*/\* No sample # [](#tag/AppResellerLeads)Leads v2 ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_getAll_GET)List leads Retrieves a list of all leads visible for a given context. You can filter the list using optional query parameters. Manual leads are visible to only those who created them. Company profile leads are visible to the Reseller that created the profile page as well as the Reseller Managers and Marketplace Managers. Product profile leads are visible to Marketplace Managers and Reseller Managers and can be configured so that the Developers who own the product profile can also see them. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company * `ROLE_REFERRAL` - Allows access as a Referral for the company * `ROLE_DEVELOPER` - Allows access as a Developer for the company * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace ##### query Parameters | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"Supported contexts | | companyIdrequired | stringCompany ID of the user who retrieved the list | | status | stringEnum: "CONVERTED" "DISQUALIFIED" "DELETED" "PENDING\_CONVERSION\_APPROVAL" "CONVERSION\_APPROVED" "PENDING\_SUBMISSION" "SUBMITTED" "ASSIGNED" "LEGACY" "PENDING\_FOR\_MANAGERS" "ACCEPTED\_FOR\_MANAGERS"Lead status | | searchText | stringSearch text, which filters the list of leads | | fromDate | numberDate on which the lead was created (lower bound) in Unix timestamp format | | toDate | numberDate on which the lead was created (upper bound) in Unix timestamp format | | sortField | stringDefault:"DATE"Enum: "DATE" "COMPANY\_NAME"The field by which to order the results | | sortOrder | stringDefault:"DESC"Enum: "ASC" "DESC"Type of ordering used (ascending or descending) | | page | integerDefault:0Page number | | size | integerDefault:50Number of results per page | ### Responses **200** Success **401** Unauthorized **404** Not Found get/lead/v2/leads https\://marketplace.appdirect.com/api/lead/v2/leads https\://virtserver.swaggerhub.com/lead/v2/leads ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/lead/v2/leads?context=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE&status=SOME_STRING_VALUE&searchText=SOME_STRING_VALUE&fromDate=SOME_NUMBER_VALUE&toDate=SOME_NUMBER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "29a1dc26-8088-475c-ba75-7b73915a0fab", "partner": "APPDIRECT", "leadType": "MANUAL", "status": "SUBMITTED", "customer": { "company": { "name": "Acme", "street1": "1234 Main St", "city": "Beverly Hills", "state": "CA", "zip": "90210", "country": "US" }, "contact": { "firstName": "John", "lastName": "Doe", "email": "john.doe@acme.com", "phone": "+14455555555" } }, "createdOn": 1534531428, "lastModified": 1534531428, "creator": { "id": "833d4c99-1939-4366-a5ae-6fb7ae3ec1be", "companyId": "6b4bd452-895d-4098-aa56-e6046b238e0f", "companyName": "AppDirect", "role": "CHANNEL_ADMIN" }, "customAttributes": { }, "referrer": { "participantType": "CHANNEL", "partner": "APPDIRECT" }, "recipient": { "participantType": "CHANNEL", "partner": "APPDIRECT" } }, { "id": "acfce97c-5428-4310-b841-3bf7cca4e047", "partner": "APPDIRECT", "leadType": "MANUAL", "status": "CONVERTED", "customer": { "company": { "name": "Globex", "street1": "5678 Main Av", "city": "Beverly Hills", "state": "CA", "zip": "90210", "country": "US", "companyExists": true }, "contact": { "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@globex.com", "phone": "+18008888080" } }, "reseller": { "id": "01d75b7c-ea78-4dc2-9e58-6ad217bddcbd", "companyId": "386626c0-53e2-4515-8450-4a720bb5d029" }, "createdOn": 1534531428, "lastModified": 1534531428, "creator": { "id": "01d75b7c-ea78-4dc2-9e58-6ad217bddcbd", "companyId": "386626c0-53e2-4515-8450-4a720bb5d029", "companyName": "Reseller Company", "role": "RESELLER" }, "convertedCompany": { "id": "dba89c75-f10c-4314-8a98-0692d04594d3", "name": "Acme" }, "convertedUser": { "id": "ad38f05b-7508-4c70-8ef8-c7929f35e414", "companyId": "dba89c75-f10c-4314-8a98-0692d04594d3" }, "customAttributes": { }, "result": "WON", "referrer": { "participantType": "CHANNEL", "partner": "APPDIRECT" }, "recipient": { "participantType": "COMPANY", "companyId": "386626c0-53e2-4515-8450-4a720bb5d029", "companyName": "Reseller Company" } } ], "page": { "size": 10, "totalElements": 2, "totalPages": 1, "number": 0 } }` ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_create_POST)Create lead Creates a manual, company profile or product profile lead. Manual leads are visible to only those who created them. Company profile leads are visible to the Reseller that created the profile page as well as the Reseller Managers and Marketplace Managers. Product profile leads are visible to Marketplace Managers and Reseller Managers and can be configured so that the Developers who own the product profile can also see them.
Required parameters:
Company name
Contact email
Lead type
Partner
If the lead type is PRODUCT, the product ID
If the lead type is COMPANY, the reseller company ID
The required parameter correspond to the request payload in [LeadCreationRequest](#leadcreationrequest) ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company * `ROLE_REFERRAL` - Allows access as a Referral for the company * `ROLE_DEVELOPER` - Allows access as a Developer for the company * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace * `ROLE_PARTNER` - Allows access to read and write all Marketplace data. Non-interactive OAuth 1.0 credentials with read and write access are required to use this scope. The companyId, userId, and context parameters are also required. ##### query Parameters | | | | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"The supported lead's API contexts. ANONYMOUS context can be used to create a PRODUCT or COMPANY lead without authentication. | | companyIdrequired | stringCompany ID of the user who is creating the lead. Only required when creating a lead of type MANUAL. | | userIdrequired | stringUser ID of the user who is creating the lead. Only required when using OAuth credentials with role PARTNER to create a lead of type MANUAL. In this case, the user ID must correspond to a marketplace user who has the Marketplace Manager role. The user must be a member of a company that has marketplace access. | ##### Request Body schema: application/jsonrequired Information about the lead to create | | | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | partnerrequired | stringMarketplace partner code | | leadTyperequired | string (LeadType)Enum: "MANUAL" "PRODUCT" "COMPANY"The type of lead. Leads created manually by users have the MANUAL type. Leads created by anonymous users through profiles have the PRODUCT or COMPANY types, depending on whether they were created from product profiles or reseller company profiles respectively. | | customerrequired | object (LeadCustomer)Information about the customer and customer company | | customAttributes | objectCustom attributes associated with the lead. This is a key-value object where the values are a set of strings associated with a given key, which is also a String. | | reseller | object (LeadUser)Information about the marketplace user related to the lead | | notes | stringNotes attached to the lead | | creator | object (LeadUser)Information about the marketplace user related to the lead | | profileCompany | object (LeadCompany)Information about the marketplace company related to the lead | | profileProduct | object (LeadProduct)Information about the product related to a lead | | profileProductEdition | object (LeadProductEdition)Information about the product edition related to a lead | ### Responses **201** Lead created **400** Error attempting to create the lead (missing required data, for example) **401** Unauthorized **404** Not Found post/lead/v2/leads https\://marketplace.appdirect.com/api/lead/v2/leads https\://virtserver.swaggerhub.com/lead/v2/leads ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "customer": { "company": { "street1": "1234 Main St", "street2": "30th Floor, Apt B", "city": "Miami", "country": "US", "state": "FL", "zip": "33033", "name": "Acme" }, "contact": { "firstName": "John", "lastName": "Doe", "phone": "+13055555555", "email": "john.doe@acme.com" } }, "leadType": "MANUAL", "partner": "APPDIRECT" }` ### Response samples * 201 Content type application/json Copy Expand all Collapse all `{ "id": "cc146924-afe3-4f6f-b368-2279e1e2039e", "partner": "APPDIRECT", "leadType": "MANUAL", "status": "ASSIGNED", "customer": { "company": { "name": "Acme", "street1": "1234 Main St", "street2": "30th Floor, Apt B", "city": "Miami", "state": "FL", "zip": "33033", "country": "US" }, "contact": { "firstName": "John", "lastName": "Doe", "email": "john.doe@companysrl.com", "phone": "+13055555555" } }, "createdOn": 1534875428054, "lastModified": 1534875428054, "creator": { "id": "e0f7521e-a297-4d02-942e-a8ee3216d5e5", "companyId": "fb2ea14d-2be2-4572-b607-2d70500c14f3", "companyName": "Referral Company", "role": "REFERRAL" }, "referrer": { "participantType": "COMPANY", "companyId": "fb2ea14d-2be2-4572-b607-2d70500c14f3", "companyName": "Referral Company" }, "recipient": { "participantType": "COMPANY", "companyId": "fb2ea14d-2be2-4572-b607-2d70500c14f3", "companyName": "Referral Company" } }` ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_get_GET)Get lead details Retrieves a single lead and its details ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company * `ROLE_REFERRAL` - Allows access as a Referral for the company * `ROLE_DEVELOPER` - Allows access as a Developer for the company * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace ##### path Parameters | | | | -------------- | ------------- | | leadIdrequired | stringLead ID | ##### query Parameters | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"Supported contexts | | companyIdrequired | stringCompany ID of the user who is retrieving the lead | ### Responses **200** Success **401** Unauthorized **404** Not Found get/lead/v2/leads/{leadId} https\://marketplace.appdirect.com/api/lead/v2/leads/{leadId} https\://virtserver.swaggerhub.com/lead/v2/leads/{leadId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/lead/v2/leads/%7BleadId%7D?context=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "29a1dc26-8088-475c-ba75-7b73915a0fab", "partner": "APPDIRECT", "leadType": "MANUAL", "status": "SUBMITTED", "customer": { "company": { "name": "Acme", "street1": "1234 Main St", "city": "Beverly Hills", "state": "CA", "zip": "90210", "country": "US" }, "contact": { "firstName": "John", "lastName": "Doe", "email": "john.doe@acme.com", "phone": "+14455555555" } }, "createdOn": 1534465177000, "lastModified": 1534465179000, "creator": { "id": "833d4c99-1939-4366-a5ae-6fb7ae3ec1be", "companyId": "6b4bd452-895d-4098-aa56-e6046b238e0f", "companyName": "AppDirect", "role": "CHANNEL_ADMIN" }, "customAttributes": { }, "referrer": { "participantType": "CHANNEL", "partner": "APPDIRECT" }, "recipient": { "participantType": "CHANNEL", "partner": "APPDIRECT" } }` ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_delete_DELETE)Discard lead Deletes or disqualifies a lead (depending on type and assignment) ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company * `ROLE_REFERRAL` - Allows access as a Referral for the company * `ROLE_DEVELOPER` - Allows access as a Developer for the company * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace ##### path Parameters | | | | -------------- | ------------- | | leadIdrequired | stringLead ID | ##### query Parameters | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"Supported contexts | | companyIdrequired | stringCompany ID of the user who is discarding the lead | ### Responses **204** Lead deleted or disqualified **400** Error attempting to discard a lead that cannot be deleted or disqualified **401** Unauthorized **404** Not Found delete/lead/v2/leads/{leadId} https\://marketplace.appdirect.com/api/lead/v2/leads/{leadId} https\://virtserver.swaggerhub.com/lead/v2/leads/{leadId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url 'https://marketplace.appdirect.com/api/lead/v2/leads/%7BleadId%7D?context=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE' ``` ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_update_PATCH)Update lead Updates the contact information or notes from a lead ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company * `ROLE_REFERRAL` - Allows access as a Referral for the company * `ROLE_DEVELOPER` - Allows access as a Developer for the company * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace ##### path Parameters | | | | -------------- | ------------- | | leadIdrequired | stringLead ID | ##### query Parameters | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"Supported contexts | | companyIdrequired | stringCompany ID of the user who is updating the lead | ##### Request Body schema: application/jsonrequired Information about the lead to update | | | | -------- | ---------------------------------------------------------------------------------------- | | customer | object (LeadCustomer)Information about the customer and customer company | | notes | stringNotes attached to the lead | ### Responses **200** Success **400** Error attempting to update a lead (for example, it is not possible to modify the lead) **401** Unauthorized **404** Not Found patch/lead/v2/leads/{leadId} https\://marketplace.appdirect.com/api/lead/v2/leads/{leadId} https\://virtserver.swaggerhub.com/lead/v2/leads/{leadId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "customer": { "company": { "name": "Globex", "street2": "5th floor" }, "contact": { "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@globex.com" } }, "notes": "Updated company name, added floor and changed person to be contacted" }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "29a1dc26-8088-475c-ba75-7b73915a0fab", "partner": "APPDIRECT", "leadType": "MANUAL", "status": "SUBMITTED", "customer": { "company": { "name": "Globex", "street1": "1234 Main St", "street2": "5th floor", "city": "Beverly Hills", "state": "CA", "zip": "90210", "country": "US" }, "contact": { "firstName": "Jane", "lastName": "Jane", "email": "jane.doe@globex.com", "phone": "+14455555555" } }, "notes": "Updated company name, added floor and changed person to be contacted", "createdOn": 1534465177000, "lastModified": 1534857159000, "creator": { "id": "833d4c99-1939-4366-a5ae-6fb7ae3ec1be", "companyId": "6b4bd452-895d-4098-aa56-e6046b238e0f", "companyName": "Appdirect", "role": "CHANNEL_ADMIN" }, "customAttributes": { }, "referrer": { "participantType": "CHANNEL", "partner": "APPDIRECT" }, "recipient": { "participantType": "CHANNEL", "partner": "APPDIRECT" } }` ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_assign_POST)Assign lead Assigns a lead to a Reseller company. The assignee will be able to see that lead as long as is not assigned to another company. The owner of the lead retains visibility even if it is assigned to another company. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace ##### query Parameters | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"Supported contexts | | companyIdrequired | stringCompany ID of the user who is assigning the lead | ##### Request Body schema: application/jsonrequired Information about the person to whom the lead is being assigned | | | | ----------------- | ----------------------------------------------------------------------------------------------------------- | | leadIdrequired | stringLead ID | | recipientrequired | object (LeadParticipant)Information about the person who is receiving or referring the lead | ### Responses **201** Lead assigned **400** Error attempting to assign the lead (missing required data, for example) **401** Unauthorized **404** Not Found post/lead/v2/assignment https\://marketplace.appdirect.com/api/lead/v2/assignment https\://virtserver.swaggerhub.com/lead/v2/assignment ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "leadId": "29a1dc26-8088-475c-ba75-7b73915a0fab", "recipient": { "participantType": "COMPANY", "companyId": "386626c0-1234-4515-8450-4a720bb5d029" } }` ### Response samples * 201 Content type application/json Copy Expand all Collapse all `{ "lead": { "id": "29a1dc26-8088-475c-ba75-7b73915a0fab", "partner": "APPDIRECT", "leadType": "MANUAL", "status": "ASSIGNED", "customer": { "company": { "name": "Acme", "street1": "1234 Main St", "street2": "1st floor", "city": "Beverly Hills", "state": "CA", "zip": "90210", "country": "US" }, "contact": { "firstName": "John", "lastName": "Doe", "email": "john.doe@acme.com", "phone": "+14455555555" } }, "notes": "Some notes", "createdOn": 1534465177000, "lastModified": 1534857159000, "creator": { "id": "833d4c99-1939-4366-a5ae-6fb7ae3ec1be", "companyId": "6b4bd452-895d-4098-aa56-e6046b238e0f", "companyName": "Appdirect", "role": "RESELLER_MANAGER" }, "customAttributes": { }, "referrer": { "participantType": "CHANNEL", "partner": "APPDIRECT" }, "recipient": { "participantType": "COMPANY", "companyId": "386626c0-53e2-4515-8450-4a720bb5d029", "companyName": "Reseller Company" } } }` ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_associate_POST)Associate lead Associates a lead with an existing marketplace user and company ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace ##### query Parameters | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"Supported contexts | | companyIdrequired | stringCompany ID of the user who is updating the lead | ##### Request Body schema: application/jsonrequired Information about the user/company that the lead is being associated with | | | | -------------- | ------------------------------------------------------------------------------------------- | | leadIdrequired | stringLead ID | | userrequired | object (LeadUser)Information about the marketplace user related to the lead | ### Responses **200** Lead associated **400** Error attempting to associate the lead (missing required data, for example) **401** Unauthorized **404** Not Found post/lead/v2/companyAssociation https\://marketplace.appdirect.com/api/lead/v2/companyAssociation https\://virtserver.swaggerhub.com/lead/v2/companyAssociation ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "leadId": "ce9d1713-7a48-43e4-bb43-b6880a19df24", "user": { "companyId": "62377315-61ba-4b50-9891-02799bef4257", "id": "1661c8d8-357b-4e8d-a0b9-a571ff00924b" } }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "ce9d1713-7a48-43e4-bb43-b6880a19df24", "partner": "APPDIRECT", "leadType": "MANUAL", "status": "SUBMITTED", "customer": { "company": { "name": "Globex", "street1": "1234 Main St", "city": "Beverly Hills", "state": "CA", "zip": "90210", "country": "US", "companyExists": true, "linked": false }, "contact": { "firstName": "Jane", "lastName": "Doe", "email": "jane.doe@company.com" } }, "createdOn": 1534845351000, "lastModified": 1534845352000, "creator": { "id": "833d4c99-1939-4366-a5ae-6fb7ae3ec1be", "companyId": "6b4bd452-895d-4098-aa56-e6046b238e0f", "companyName": "Appdirect", "role": "CHANNEL_ADMIN" }, "convertedCompany": { "id": "62377315-61ba-4b50-9891-02799bef4257", "name": "Acme" }, "convertedUser": { "id": "1661c8d8-357b-4e8d-a0b9-a571ff00924b", "companyId": "62377315-61ba-4b50-9891-02799bef4257" }, "customAttributes": { }, "referrer": { "participantType": "CHANNEL", "partner": "APPDIRECT" }, "recipient": { "participantType": "CHANNEL", "partner": "APPDIRECT" } }` ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_activities_GET)List activities Retrieves a list of all lead activities visible for a given context. You can filter the list using optional query parameters. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company * `ROLE_REFERRAL` - Allows access as a Referral for the company * `ROLE_DEVELOPER` - Allows access as a Developer for the company * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace ##### path Parameters | | | | -------------- | ------------- | | leadIdrequired | stringLead ID | ##### query Parameters | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"Supported contexts | | companyIdrequired | stringCompany ID of the user who is retrieving the list | | fromDate | numberDate on which the lead activity was created (lower bound) in Unix timestamp format | | toDate | numberDate on which the lead activity was created (upper bound) in Unix timestamp format | | creationDateOrder | stringDefault:"DESC"Enum: "ASC" "DESC"Type of ordering used (ascending or descending) for the creation date | | page | integerDefault:0Page number | | size | integerDefault:50Number of results per page | ### Responses **200** Success **401** Unauthorized **404** Not Found get/lead/v2/leads/{leadId}/activities https\://marketplace.appdirect.com/api/lead/v2/leads/{leadId}/activities https\://virtserver.swaggerhub.com/lead/v2/leads/{leadId}/activities ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/lead/v2/leads/%7BleadId%7D/activities?context=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE&fromDate=SOME_NUMBER_VALUE&toDate=SOME_NUMBER_VALUE&creationDateOrder=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "9d0957c8-d78d-44ac-9789-4b60a5859a3a", "createdOn": 1528922810000, "verb": "LEAD_CONVERSION_REQUESTED", "verbContext": "COMPANY", "partner": "APPDIRECT", "actorCompany": { "id": "386626c0-53e2-4515-8450-4a720bb5d029", "name": "Reseller Company" }, "allowedResourcesAccess": [ "ACTOR_COMPANY" ] }, { "id": "259558f5-da66-4ce9-aede-0f15f68478f5", "createdOn": 1528922659000, "verb": "LEAD_CREATED", "verbContext": "COMPANY", "partner": "APPDIRECT", "actorCompany": { "id": "386626c0-1234-4515-8450-4a720bb5d029", "name": "Reseller Company" }, "allowedResourcesAccess": [ "ACTOR_COMPANY" ] }, { "id": "c6350331-caa9-4942-b53c-611df7d7c1d7", "createdOn": 1528922904000, "verb": "LEAD_CONVERSION_APPROVED", "verbContext": "MARKETPLACE", "partner": "APPDIRECT", "actorCompany": { "id": "6b4bd452-895d-4098-aaaa-e6046b238e0f", "name": "Appdirect" }, "allowedResourcesAccess": [ "ACTOR_COMPANY" ] }, { "id": "49479105-36a9-4740-b9a3-b768c6755378", "createdOn": 1528922952000, "verb": "LEAD_CONVERTED", "verbContext": "COMPANY", "partner": "APPDIRECT", "actorCompany": { "id": "386626c0-1234-4515-8450-4a720bb5d029", "name": "Reseller Company" }, "allowedResourcesAccess": [ "ACTOR_COMPANY" ] }, { "id": "45e3a909-e3ec-46fc-8b08-bcc264fdc2f7", "createdOn": 1528923325000, "verb": "LEAD_QUOTE_LINKED", "verbContext": "COMPANY", "partner": "APPDIRECT", "actorCompany": { "id": "386626c0-1234-4515-8450-4a720bb5d029", "name": "Reseller Company" }, "contextQuote": { "id": "5f7a98c8-deac-40b2-8cef-cd41af042233", "friendlyId": "I4HNJM", "applicationName": "AUTO_WEBAPP_NEW" }, "allowedResourcesAccess": [ "ACTOR_COMPANY" ] } ], "page": { "size": 5, "totalElements": 17, "totalPages": 4, "number": 0 } }` ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_convert_POST)Convert lead Converts the lead to a marketplace company ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company ##### query Parameters | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"Supported contexts | | companyIdrequired | stringCompany ID of the user who is converting the lead | | leadIdrequired | stringLead ID | ### Responses **200** Success **400** Error attempting to convert the lead (for example, it is not possible to convert the lead) **401** Unauthorized **404** Not Found **409** Conflict post/lead/v2/conversion https\://marketplace.appdirect.com/api/lead/v2/conversion https\://virtserver.swaggerhub.com/lead/v2/conversion ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url 'https://marketplace.appdirect.com/api/lead/v2/conversion?context=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE&leadId=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "lead": { "id": "94890613-265d-4635-93d1-9fdddf70cf73", "partner": "APPDIRECT", "leadType": "COMPANY", "status": "CONVERTED", "customer": { "company": { "name": "Acme", "companyExists": true, "linked": true }, "contact": { "firstName": "John", "lastName": "Doe", "email": "john.doe@acme.com" } }, "reseller": { "id": "01d75b7c-ea78-4dc2-9e58-6ad217bddcbd", "companyId": "386626c0-1234-4515-8450-4a720bb5d029" }, "createdOn": 1534846329000, "lastModified": 1534985564812, "convertedCompany": { "id": "b3577d6f-8f29-454e-9d9d-da99e1e9618f", "name": "Acme" }, "convertedUser": { "id": "6f3b8110-4e66-49bd-aec9-2e2fbe8c54ea", "companyId": "b3577d6f-8f29-454e-9d9d-da99e1e9618f" }, "referrer": { "participantType": "CHANNEL", "partner": "APPDIRECT" }, "recipient": { "participantType": "COMPANY", "companyId": "386626c0-53e2-4515-8450-4a720bb5d029", "companyName": "Reseller Company" }, "profileCompany": { "id": "386626c0-53e2-4515-8450-4a720bb5d029", "name": "Reseller Company" } } }` ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_convert_request_POST)Request conversion approval Request permission to convert the lead to a marketplace company ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company ##### query Parameters | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"Supported contexts | | companyIdrequired | stringCompany ID of the user who is requesting the lead conversion | | leadIdrequired | stringLead ID | ### Responses **200** Lead conversion request successful **400** Error attempting to request approval (for example, approval has already been requested) **401** Unauthorized **404** Not Found post/lead/v2/conversionRequest https\://marketplace.appdirect.com/api/lead/v2/conversionRequest https\://virtserver.swaggerhub.com/lead/v2/conversionRequest ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url 'https://marketplace.appdirect.com/api/lead/v2/conversionRequest?context=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE&leadId=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "lead": { "id": "94890613-265d-4635-93d1-9fdddf70cf73", "partner": "APPDIRECT", "leadType": "COMPANY", "status": "PENDING_CONVERSION_APPROVAL", "customer": { "company": { "name": "Acme" }, "contact": { "firstName": "John", "lastName": "Doe", "email": "john.doe@acme.com" } }, "createdOn": 1534846329000, "lastModified": 1534846331000, "customAttributes": { }, "referrer": { "participantType": "COMPANY", "companyId": "386626c0-1234-4515-8450-4a720bb5d029", "companyName": "Reseller Company" }, "recipient": { "participantType": "CHANNEL", "partner": "APPDIRECT" }, "profileCompany": { "id": "386626c0-1234-4515-8450-4a720bb5d029", "name": "Reseller Company" } } }` ## [](#tag/AppResellerLeads/operation/resource_AppResellerLeadsApi_convert_approval_POST)Approve conversion request Approves the conversion request made by a Reseller company ##### Required Scopes and Authorization Rules * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace ##### query Parameters | | | | --------------- | ------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringEnum: "RESELLER" "REFERRAL" "DEVELOPER" "RESELLER\_MANAGER" "PARTNER" "ANONYMOUS"Supported contexts | | leadIdrequired | stringLead ID | ### Responses **200** Lead conversion approval successful **400** Error attempting to approve the request (for example, conversion is already approved) **401** Unauthorized **404** Not Found post/lead/v2/conversionApproval https\://marketplace.appdirect.com/api/lead/v2/conversionApproval https\://virtserver.swaggerhub.com/lead/v2/conversionApproval ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url 'https://marketplace.appdirect.com/api/lead/v2/conversionApproval?context=SOME_STRING_VALUE&leadId=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "lead": { "id": "94890613-265d-4635-93d1-9fdddf70cf73", "partner": "APPDIRECT", "leadType": "COMPANY", "status": "CONVERSION_APPROVED", "customer": { "company": { "name": "Acme" }, "contact": { "firstName": "John", "lastName": "Doe", "email": "john.doe@acme.com" } }, "createdOn": 1534846329000, "lastModified": 1534984995000, "customAttributes": { }, "referrer": { "participantType": "CHANNEL", "partner": "APPDIRECT" }, "recipient": { "participantType": "COMPANY", "companyId": "386626c0-1234-4515-8450-4a720bb5d029", "companyName": "Reseller Company" }, "profileCompany": { "id": "386626c0-1234-4515-8450-4a720bb5d029", "name": "Reseller Company" } } }` # [](#tag/Marketplace-Product-Settings)Marketplace Product Settings ## [](#tag/Marketplace-Product-Settings/operation/resource_Product_Active_Setting_readSettings_GET)Retrieve active settings for a given marketplace Retrieve the settings, sections, tabs that should be visible to end user on the marketplace product settings UI for a given marketplace. ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CHANNEL_PRODUCT_SUPPORT` - Allows access as a Product Support agent for the marketplace. ##### path Parameters | | | | ----------------- | ----------------------------- | | productIdrequired | integerThe product identifier | ### Responses **200** Success **401** Unauthorized **404** Product not found **500** Internal server error get/v3/marketplaceProduct/activeSettings/{productId} https\://marketplace.appdirect.com/api/v3/marketplaceProduct/activeSettings/{productId} https\://virtserver.swaggerhub.com/v3/marketplaceProduct/activeSettings/{productId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/v3/marketplaceProduct/activeSettings/%7BproductId%7D ``` ### Response samples * 200 * 404 Content type application/json Copy Expand all Collapse all `{ "productInformation": { "productName": "AUTO_WEBAPP_NEW", "appFromNetwork": false }, "showSettingsContainer": true, "showVisibleOnNetwork": true, "showVisibleOnMarketplace": true, "showSellDomainAsStandalone": false, "showAsComingSoon": true, "showCollectLeads": true, "showCompanyGroupSegmentsContainer": true, "showHideAllPricing": true, "showDisableSelfService": false, "showTermsOfServiceURL": false, "showSortingRank": true, "showAdditionalSettingsContainer": false, "showAPIHealthMaintenanceContainer": true, "showSKUsContainer": false, "showFID1Number": false, "showProductTab": true, "showCategoriesContainer": true, "showAttributesContainer": true, "showProductLinesContainer": true, "showCustomerGroupsContainer": true, "showMerchandisingOptionsContainer": true, "showBillingTab": true, "showBillingSettingsContainer": true, "showSkipFirstPayment": false, "showTaxCode": true, "showSetupFeeTaxCode": false, "showBillingCycleStartDay": false, "showFreeTrialBillingOptionsContainer": true, "showBillingPatternsContainer": false }` ## [](#tag/Marketplace-Product-Settings/operation/resource_Product_Setting_readSettings_GET)Retrieve product settings on a given marketplace Retrieve product settings, including product information, general settings, product group, and billing settings for a product on a given marketplace. ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CHANNEL_PRODUCT_SUPPORT` - Allows access as a Product Support agent for the marketplace. ##### path Parameters | | | | ----------------- | ----------------------------- | | productIdrequired | integerThe product identifier | ### Responses **200** Success **401** Unauthorized **404** Product not found **500** Internal server error get/v3/marketplaceProduct/productSettings/{productId} https\://marketplace.appdirect.com/api/v3/marketplaceProduct/productSettings/{productId} https\://virtserver.swaggerhub.com/v3/marketplaceProduct/productSettings/{productId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/v3/marketplaceProduct/productSettings/%7BproductId%7D ``` ### Response samples * 200 * 404 Content type application/json Copy Expand all Collapse all `{ "productInformation": { "productName": "AUTO_WEBAPP_NEW", "iconUrl": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/157/thumbs_64/img7932941780668708927.png", "appFromNetwork": false }, "general": { "settings": { "validations": [ { "field": "termsOfServiceURL", "maxLength": 1024 } ], "visibleOnNetwork": true, "visibleOnMarketplace": true, "sellDomainAsStandalone": true, "showAsComingSoon": true, "collectLeads": { "options": [ "inAdditionToPurchase", "insteadOfPurchase" ], "enabled": true, "selectedOption": "inAdditionToPurchase", "assignLeadsToDevelopers": false, "editionLeadGenEnabled": false }, "hideAllPricing": true, "disableSelfServe": true, "termsOfServiceURL": "http://www.google.com", "sortingRank": { "selectedOption": "Very Low", "options": [ "Very High", "High", "Medium", "Low", "Very Low" ] } }, "additionalSettings": { "validations": [ { "field": "externalIdentifier", "maxLength": 36 }, { "field": "productStockNumber", "maxLength": 36 } ] }, "apiHealthMaintenance": { "purchase": { "value": true, "disabled": false }, "singleSignOn": { "value": false, "disabled": false }, "updateSubscription": { "value": true, "disabled": true, "tooltip": "The product is part of a bundle." }, "assignAndUnassign": { "value": false, "disabled": true, "tooltip": "This endpoint has been disabled by the developer." } } }, "productGroups": { "categories": { "tooltip": "Add categories to your application", "required": false, "options": [ { "categoryId": 0, "name": "Select a Category", "subCategories": [ { "subCategoryId": 0, "name": "Select a Sub Category" } ] }, { "categoryId": 186, "name": "Numbers", "subCategories": [ { "subCategoryId": 0, "name": "Select a Sub Category" }, { "subCategoryId": 113, "name": "One" }, { "subCategoryId": 114, "name": "Two" } ] } ], "selectedOptions": [ { "categoryId": 0, "subCategoryId": 0 }, { "categoryId": 186, "subCategoryId": 0 }, { "categoryId": 186, "subCategoryId": 115 } ] }, "attributes": [ { "attributeId": 56, "name": "English", "required": false, "options": [ { "attributeOptionId": 128, "name": "EngOpt1", "selected": true }, { "attributeOptionId": 129, "name": "EngOpt2", "selected": false }, { "attributeOptionId": 130, "name": "EngOpt3", "selected": false }, { "attributeOptionId": 131, "name": "EngOpt4", "selected": false }, { "attributeOptionId": 132, "name": "EngOpt5", "selected": false }, { "attributeOptionId": 133, "name": "EngOpt6", "selected": false }, { "attributeOptionId": 134, "name": "EngOpt7", "selected": false } ] } ], "productLines": [ { "productLineId": 1, "name": "MSFT", "selected": false } ], "customerGroups": [ { "userAttributeId": 31, "name": "New Customer Group", "required": true, "options": [ { "industryId": 55, "name": "Industry1", "selected": true }, { "industryId": 56, "name": "Industry2", "selected": false } ] } ], "merchandisingOptions": { "ribbons": { "options": [ { "ribbonId": 0, "text": "Choose One" }, { "ribbonId": 8, "color": "#0004FF", "text": "Discount", "textColor": "#FFFFF" }, { "ribbonId": 7, "color": "#0004FF", "text": "Free", "textColor": "#FFFFF" }, { "ribbonId": 9, "color": "#0004FF", "text": "Special", "textColor": "#FFFFF" } ], "selectedOption": 7 }, "badges": { "options": [ { "badgeId": 7, "name": "EngOpt1", "imageUrl": "common_resources/attributeOptions/128/badge.png?e5dc31b07b947203ce979bd55032f960", "position": 1 }, { "badgeId": 8, "name": "EngOpt2", "imageUrl": "common_resources/attributeOptions/129/badge.png?e5dc31b07b947203ce979bd55032f960", "position": 2 }, { "badgeId": 9, "name": "EngOpt3", "imageUrl": "common_resources/attributeOptions/130/badge.png?fd55e224f0cc01dd33f6ae864002e880" }, { "badgeId": 10, "name": "EngOpt4", "imageUrl": "common_resources/attributeOptions/null/badge.png?e5dc31b07b947203ce979bd55032f960" } ], "selectedOptions": [ 7, 8 ] } }, "segmentSelections": { "availableCompanyGroups": [ { "id": "1b0cc1f0-4945-4c6a-989c-d5f350a1b9d1", "name": "cda", "segments": [ { "id": "e96f1bd2-c6c7-4546-ad9c-518f5ff650a9", "name": "fd" } ] } ], "selectedSegments": [ "e96f1bd2-c6c7-4546-ad9c-518f5ff650a9" ] } }, "billing": { "billingSettings": { "validations": [ { "field": "startDay", "numeric": true, "minValue": 1, "maxValue": 31 }, { "field": "taxCode", "maxLength": 255 }, { "field": "setupFeeTaxCode", "maxLength": 25 } ], "skipFirstPayment": true, "taxCode": "ABC123", "setupFeeTaxCode": "DEF456", "billingCycle": { "options": [ "MP_DEFAULT_CYCLE", "FIRST_DAY_OF_THE_MONTH", "LAST_DAY_OF_THE_MONTH", "PURCHASE_DAY", "CUSTOM_DAY_OF_THE_MONTH" ], "selectedOption": "FIRST_DAY_OF_THE_MONTH", "startDay": 1 } }, "freeTrialBillingOptions": [ { "editionId": 9890, "editionName": "Free Trial", "requireBillingInfo": true, "automaticUpgradeToPaidEnabled": true } ], "skuSettings": { "validations": [ { "field": "sku", "required": true, "alphanumeric": true, "minLength": 6, "maxLength": 6 }, { "field": "fid1", "required": false, "minLength": 2, "maxLength": 25 } ], "editionPricingItems": [ { "editionName": "Free Trial Edition", "paymentPlanId": 123, "skus": [ { "pricingItemId": 20423, "price": "$0.03", "sku": "A1B2C3", "fid1": "yyyy-yyyyyy-yyyy" }, { "pricingItemId": 20424, "price": "$0.17", "sku": "321CBA", "fid1": "yyyy-yyyyyy-yyyy" } ] } ] } } }` ## [](#tag/Marketplace-Product-Settings/operation/resource_Product_Setting_updateSettings_PUT)Update product settings on a given marketplace Update product settings for a product on a given marketplace. ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CHANNEL_PRODUCT_SUPPORT` - Allows access as a Product Support agent for the marketplace. ##### path Parameters | | | | ----------------- | ----------------------------- | | productIdrequired | integerThe product identifier | ##### Request Body schema: application/jsonrequired Information about the product settings that will be updated. | | | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | | productInformation | object (ProductInformation)Information about the product, such as the name, icon URL, and if it is a network product. | | general | object (GeneralSettings)Information about the availability of the product, API health maintenance, and additional settings. | | productGroups | object (ProductGroups)Information about the tooltip, attribute, and list of categories associated to the product. | | billing | object (Billing)Information about the billing settings, free trials, billing patterns, or SKU settings of the product. | ### Responses **200** Success **401** Unauthorized **404** Product not found **500** Internal server error put/v3/marketplaceProduct/productSettings/{productId} https\://marketplace.appdirect.com/api/v3/marketplaceProduct/productSettings/{productId} https\://virtserver.swaggerhub.com/v3/marketplaceProduct/productSettings/{productId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "productInformation": { "productName": "AUTO_WEBAPP_NEW", "iconUrl": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/157/thumbs_64/img7932941780668708927.png", "appFromNetwork": false }, "general": { "settings": { "validations": [ { "field": "termsOfServiceURL", "maxLength": 1024 } ], "visibleOnNetwork": true, "visibleOnMarketplace": true, "sellDomainAsStandalone": true, "showAsComingSoon": true, "collectLeads": { "options": [ "inAdditionToPurchase", "insteadOfPurchase" ], "enabled": true, "selectedOption": "inAdditionToPurchase", "assignLeadsToDevelopers": false, "editionLeadGenEnabled": false }, "hideAllPricing": true, "disableSelfServe": true, "termsOfServiceURL": "http://www.google.com", "sortingRank": { "selectedOption": "Very Low", "options": [ "Very High", "High", "Medium", "Low", "Very Low" ] } }, "additionalSettings": { "validations": [ { "field": "externalIdentifier", "maxLength": 36 }, { "field": "productStockNumber", "maxLength": 36 } ] }, "apiHealthMaintenance": { "purchase": { "value": true, "disabled": false }, "singleSignOn": { "value": false, "disabled": false }, "updateSubscription": { "value": true, "disabled": true, "tooltip": "The product is part of a bundle." }, "assignAndUnassign": { "value": false, "disabled": true, "tooltip": "This endpoint has been disabled by the developer." } } }, "productGroups": { "categories": { "tooltip": "Add categories to your application", "required": false, "options": [ { "categoryId": 0, "name": "Select a Category", "subCategories": [ { "subCategoryId": 0, "name": "Select a Sub Category" } ] }, { "categoryId": 186, "name": "Numbers", "subCategories": [ { "subCategoryId": 0, "name": "Select a Sub Category" }, { "subCategoryId": 113, "name": "One" }, { "subCategoryId": 114, "name": "Two" } ] } ], "selectedOptions": [ { "categoryId": 0, "subCategoryId": 0 }, { "categoryId": 186, "subCategoryId": 0 }, { "categoryId": 186, "subCategoryId": 115 } ] }, "attributes": [ { "attributeId": 56, "name": "English", "required": false, "options": [ { "attributeOptionId": 128, "name": "EngOpt1", "selected": true }, { "attributeOptionId": 129, "name": "EngOpt2", "selected": false }, { "attributeOptionId": 130, "name": "EngOpt3", "selected": false }, { "attributeOptionId": 131, "name": "EngOpt4", "selected": false }, { "attributeOptionId": 132, "name": "EngOpt5", "selected": false }, { "attributeOptionId": 133, "name": "EngOpt6", "selected": false }, { "attributeOptionId": 134, "name": "EngOpt7", "selected": false } ] } ], "productLines": [ { "productLineId": 1, "name": "MSFT", "selected": false } ], "customerGroups": [ { "userAttributeId": 31, "name": "New Customer Group", "required": true, "options": [ { "industryId": 55, "name": "Industry1", "selected": true }, { "industryId": 56, "name": "Industry2", "selected": false } ] } ], "merchandisingOptions": { "ribbons": { "options": [ { "ribbonId": 0, "text": "Choose One" }, { "ribbonId": 8, "color": "#0004FF", "text": "Discount", "textColor": "#FFFFF" }, { "ribbonId": 7, "color": "#0004FF", "text": "Free", "textColor": "#FFFFF" }, { "ribbonId": 9, "color": "#0004FF", "text": "Special", "textColor": "#FFFFF" } ], "selectedOption": 7 }, "badges": { "options": [ { "badgeId": 7, "name": "EngOpt1", "imageUrl": "common_resources/attributeOptions/128/badge.png?e5dc31b07b947203ce979bd55032f960", "position": 1 }, { "badgeId": 8, "name": "EngOpt2", "imageUrl": "common_resources/attributeOptions/129/badge.png?e5dc31b07b947203ce979bd55032f960", "position": 2 }, { "badgeId": 9, "name": "EngOpt3", "imageUrl": "common_resources/attributeOptions/130/badge.png?fd55e224f0cc01dd33f6ae864002e880" }, { "badgeId": 10, "name": "EngOpt4", "imageUrl": "common_resources/attributeOptions/null/badge.png?e5dc31b07b947203ce979bd55032f960" } ], "selectedOptions": [ 7, 8 ] } } }, "billing": { "billingSettings": { "validations": [ { "field": "startDay", "numeric": true, "minValue": 1, "maxValue": 31 }, { "field": "taxCode", "maxLength": 255 }, { "field": "setupFeeTaxCode", "maxLength": 25 } ], "skipFirstPayment": true, "taxCode": "ABC123", "setupFeeTaxCode": "DEF456", "billingCycle": { "options": [ "MP_DEFAULT_CYCLE", "FIRST_DAY_OF_THE_MONTH", "LAST_DAY_OF_THE_MONTH", "PURCHASE_DAY", "CUSTOM_DAY_OF_THE_MONTH" ], "selectedOption": "FIRST_DAY_OF_THE_MONTH", "startDay": 1 } }, "freeTrialBillingOptions": [ { "editionId": 9890, "editionName": "Free Trial", "requireBillingInfo": true, "automaticUpgradeToPaidEnabled": true } ], "skuSettings": { "validations": [ { "field": "sku", "required": true, "alphanumeric": true, "minLength": 6, "maxLength": 6 }, { "field": "fid1", "required": false, "minLength": 2, "maxLength": 25 } ], "editionPricingItems": [ { "editionName": "Free Trial Edition", "paymentPlanId": 123, "skus": [ { "pricingItemId": 20423, "price": "$0.03", "sku": "A1B2C3", "fid1": "yyyy-yyyyyy-yyyy" }, { "pricingItemId": 20424, "price": "$0.17", "sku": "321CBA", "fid1": "yyyy-yyyyyy-yyyy" } ] } ] } } }` ### Response samples * 404 Content type application/json Copy Expand all Collapse all `[ { "code": "Not Found", "message": "Product with id 10 not found." } ]` # [](#tag/Integration)Metered Usage ## [](#tag/Integration/operation/resource_Other_billUsage_POST)Billing Usage V1 Submit usage data to be billed for the given account identifier ##### query Parameters | | | | ----- | --------------------------------------------------------------------------------- | | async | booleanDefault:falseTrue if asynchronous. Default value is false. | ##### Request Body schema:application/xmlapplication/xml Usage data information. | | | | ------------- | ------------------------------------------------ | | account | object or null (AccountInfo) | | addonInstance | object (AddonInstanceInfo) | | item | Array of objects (UsageItemBean) | ### Responses **200** Success (only returned when async=false) **202** Accepted (only returned when async=true) **400** Bad Request **404** Not Found **500** Internal Server Error post/integration/v1/billing/usage https\://marketplace.appdirect.com/api/integration/v1/billing/usage https\://virtserver.swaggerhub.com/integration/v1/billing/usage ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Integration/operation/resource_Other_domainVerificationStatus_POST)Status verification Status verification ##### path Parameters | | | | -------------------------- | ------ | | customerIdentifierrequired | string | | domainrequired | string | ##### Request Body schema: application/json | | | | -------- | ------- | | verified | boolean | ### Responses **204** No Content **400** Bad Request **404** Not Found **500** Internal Server Error post/integration/v1/customers/{customerIdentifier}/domains/{domain}/verificationStatus https\://marketplace.appdirect.com/api/integration/v1/customers/{customerIdentifier}/domains/{domain}/verificationStatus https\://virtserver.swaggerhub.com/integration/v1/customers/{customerIdentifier}/domains/{domain}/verificationStatus ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "verified": true }` ## [](#tag/Integration/operation/resource_Other_billUsageV2_POST)Billing Usage V2 Submit preconfigured, custom, or volume-priced metered usage data to be billed for a customer account.

Volume pricing usage is always preconfigured, not custom. It is processed at 6:00 PM UTC, either on the last day of the billing period or, if delayed billing is configured (always recommended for volume pricing), on the last day of a defined number of days after the billing period ends. It must be submitted in requests that do not include other pricing models. ##### Request Body schema: application/json Metered usage request body. The request body example includes a preconfigured metered usage item followed by a custom metered usage item. For volume price usage, the request is the same. | | | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | idempotencyKey | stringUnique caller-generated identifier for the metered usage that is sent. Ensures duplicate submissions can be identified and an error returned. Required. | | requestGroupId | string or nullA caller-generated identifier to group related metered usage requests. For example, 'January 2022' to group all requests that include January billing period events. | | billable | booleanIndicates usage is billable (true) or estimated (false). Required. | | usages | Array of objects (MeteredUsageItem)List of metered usage events. | ### Responses **202** Metered usage report successfully received **400** Bad Request **404** Not Found **500** Internal Server Error post/integration/v2/billing/usage https\://marketplace.appdirect.com/api/integration/v2/billing/usage https\://virtserver.swaggerhub.com/integration/v2/billing/usage ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "idempotencyKey": "string", "requestGroupId": "string", "billable": true, "usages": [ { "accountId": "string", "usageList": [ { "eventId": "string", "eventDate": "2019-08-24T14:15:22Z", "pricingUnit": "string", "customUnit": "string", "quantity": "string", "unitPrice": "string", "description": "string", "currency": "string", "attributes": { "property1": "string", "property2": "string" } } ] } ] }` ### Response samples * 202 * 400 * 404 * 500 Content type application/json Copy `{ "requestId": "067464f3-be67-4dd3-b1a3-b2ac75180222", "idempotencyKey": "20210429-b436h7j2", "queryUsageStatus": "/api/integration/v2/billing/usage/requests/fade1f71-3f40-4f4e-81c1-e835cb459c30" }` ## [](#tag/Integration/operation/resource_Other_billUsageV2_GET)Fetch usage processing status Retrieve whether the metered usage events submitted with a Billing Usage V2 request were successfully processed. In the Billing Usage V2 response, locate the path that is unique to the request (queryUsageStatus). Use it to retrieve the processing status for the submitted usage events, and error details if applicable. ##### path Parameters | | | | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | requestIdrequired | stringUnique system-assigned identifier for the API request used to submit the metered usage; returned with the Billing Usage V2 submission response. | ### Responses **200** Successfully returned usage event processing status **403** Access Denied **404** Not Found **500** Internal Server Error get/integration/v2/billing/usage/requests/{requestId} https\://marketplace.appdirect.com/api/integration/v2/billing/usage/requests/{requestId} https\://virtserver.swaggerhub.com/integration/v2/billing/usage/requests/{requestId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/integration/v2/billing/usage/requests/%7BrequestId%7D ``` ### Response samples * 200 Content type \*/\*\*/\* No sample # [](#tag/MyApps)MyApps ## [](#tag/MyApps/operation/resource_MyApps_readApps)List applications List all applications assigned to a marketplace company user. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as the owner of the user entitlements. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. ##### path Parameters | | | | ------------------- | ------------------ | | companyUuidrequired | stringCompany UUID | | userUuidrequired | stringUser UUID | ### Responses **200** Success **401** Unauthorized get/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D/myapps ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/MyApps/operation/resource_MyApps_updateAppsOrder)Update MyApps order Update the order in which applications will should show up on the MyApps page. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as the owner of the user entitlements. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to read and write all marketplace data. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. ##### path Parameters | | | | ------------------- | ------------------ | | companyUuidrequired | stringCompany UUID | | userUuidrequired | stringUser UUID | ##### Request Body schema: application/jsonrequired Ordered list of app hrefs Array string ( MyAppsUrl ) MyApps URL ### Responses **204** No Content **401** Unauthorized **404** Not Found put/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `[ "http://appdirect.com/api/account/v2/companies/6b4bd452-895d-4098-aa56-e6046b238e0f/memberships/2f93cb24-f7b9-433f-875e-bb0dd9b0f1c1/myapps/assigned/1891", "http://appdirect.com/api/account/v2/companies/6b4bd452-895d-4098-aa56-e6046b238e0f/memberships/2f93cb24-f7b9-433f-875e-bb0dd9b0f1c1/myapps/assigned/1892" ]` ## [](#tag/MyApps/operation/resource_MyApps_readAppByUserEntitlement)Read application with completed assignment Retrieve a marketplace user's application when assignment is complete. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as the owner of the user entitlement. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. ##### path Parameters | | | | ------------------------- | -------------------------- | | companyUuidrequired | stringCompany UUID | | userUuidrequired | stringUser UUID | | userEntitlementIdrequired | integerUser entitlement ID | ### Responses **200** Success **401** Unauthorized **404** Not Found get/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps/assigned/{userEntitlementId} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps/assigned/{userEntitlementId} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps/assigned/{userEntitlementId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D/myapps/assigned/%7BuserEntitlementId%7D ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/MyApps/operation/resource_MyApps_readAppByPendingId)Read application with pending assignment Retrieve a marketplace user's application when assignment is pending. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as the owner of the user entitlement. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_SUPERUSER` - Allows access as a Super User for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. ##### path Parameters | | | | -------------------- | --------------------- | | companyUuidrequired | stringCompany UUID | | userUuidrequired | stringUser UUID | | pendingAppIdrequired | integerPending App ID | ### Responses **200** Success **401** Unauthorized **404** Not Found get/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps/pending/{pendingAppId} https\://marketplace.appdirect.com/api/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps/pending/{pendingAppId} https\://virtserver.swaggerhub.com/account/v2/companies/{companyUuid}/memberships/{userUuid}/myapps/pending/{pendingAppId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/companies/%7BcompanyUuid%7D/memberships/%7BuserUuid%7D/myapps/pending/%7BpendingAppId%7D ``` ### Response samples * 200 Content type \*/\*\*/\* No sample # [](#tag/Navigation)Navigation ## [](#tag/Navigation/operation/resource_Navigation_readNavigator_GET)List all product tags This call lists all product groups (attributes, categories, and customer tags) that are used on your marketplace. ##### query Parameters | | | | ------ | --------------------------------------------------------------------------------------- | | pl | Array of numbersThe IDs of the product line to filter on. This is an optional parameter | | locale | stringSpecify the locale context | ### Responses **200** Product tags information get/marketplace/v1/navigator https\://marketplace.appdirect.com/api/marketplace/v1/navigator https\://virtserver.swaggerhub.com/marketplace/v1/navigator ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/marketplace/v1/navigator?pl=SOME_ARRAY_VALUE&locale=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample # [](#tag/AppResellerOpportunities)Opportunities ## [](#tag/AppResellerOpportunities/operation/createOpportunity)Create opportunity Creates a new opportunity Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support Representative to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### query Parameters | | | | ------- | ------------------------------------------------------------------------------------------------- | | context | stringEnum: "RESELLER" "SSR"Deprecated. Parameter has no impact on this endpoint. | ##### Request Body schema: application/jsonrequired Information about the opportunity being created | | | | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | customerCompanyIdrequired | stringCustomer company ID | | customerIdrequired | stringCustomer user ID | | ownerCompanyIdrequired | stringSales agent company ID | | ownerIdrequired | stringSales agent user ID | | currency | string (OpportunityCurrency) ^\[A-Z]{3}$Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"The currency using the ISO-4217 currency code | | itemsrequired | Array of objects (OpportunityItem)List of items in the opportunity | | purchaseEffectiveDate | numberOpportunity purchase effective date, in UNIX Epoch milliseconds | | name | stringOpportunity name | | createdByCompanyId | stringCreated by company ID | | createdById | stringCreated by user ID | | purchaseCustomAttributes | object (CustomAttribute)Custom attributes as key-value pairs. Values must be a string array | ### Responses **200** Opportunity created **400** The owner's or customer's company membership is invalid, or the owner is a Reseller who is not linked to the opportunity customer **401** Unauthorized **409** There is at least one restriction for a product in the opportunity post/assistedSales/v1/opportunities https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "customerCompanyId": "498c62ea-ad14-48e6-96ce-5400c617444c", "customerId": "505f0a0c-57a7-4d9e-9fac-66bbf557ac4d", "ownerCompanyId": "6a62244e-aa2f-461b-8c7a-3a0e091be9d3", "ownerId": "d781ac09-b4fe-4d57-8ba2-4640fc5b7c49", "items": [ { "pricingPlanId": "85d30404-c56b-4dff-9f3b-06636477fe55", "units": [ { "quantity": 10, "unit": "USER" } ] }, { "pricingPlanId": "d12931cf-eac6-45fa-8965-d33b1c5698b0", "units": [ ] } ], "currency": "USD", "createdByCompanyId": "b7e0c48b-6d0d-45fc-9c8a-3fa3fd84d9f1", "createdById": "8f6b3d29-4169-4fb0-91ff-bad9b7a3d0d4", "purchaseCustomAttributes": { "paid_off_platform_contact": [ "janet.doe@accounting.acme.com" ] } }` ### Response samples * 200 * 400 * 401 * 409 Content type application/json Copy Expand all Collapse all `{ "id": "ef6c414f-39da-401f-a4b8-81adc6190fda", "ownerUser": { "id": "d781ac09-b4fe-4d57-8ba2-4640fc5b7c49", "email": "john.doe@acme.com", "firstName": "John", "lastName": "Doe", "company": { "id": "1", "name": "Acme Corp." } }, "customerUser": { "id": "498c62ea-ad14-48e6-96ce-5400c617444c", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "100", "name": "Customer Company" } }, "createdOn": "1546300800000", "currency": "USD", "purchaseEffectiveDate": "1577750400000", "name": "Prospect N1", "status": "OPEN", "items": [ { "id": "4ccf689b-4339-4fc9-a8b3-b05c5a87c1be", "pricingPlanId": "4bc864b5-f63f-4933-be19-3700aa9a8cc4", "units": [ { "quantity": "20", "unit": "USER" } ], "subscriptionCustomAttributes": { "intended_os": [ "other", "ios", "macos" ], "sales_agent_id": [ "R353113R" ] }, "vendorRequiredFields": { "name": [ "John" ], "lastname": [ "Doe" ], "email": [ "john.doe@acme.com" ] } }, { "id": "dece524d-0466-4185-b3bb-1f8a300c37cd", "pricingPlanId": "80b85538-ffc1-4c4b-acb1-1bf87c8c2fc4", "units": [ ] } ], "availableActions": [ "ADD_PRODUCT", "EDIT", "FINALIZE", "SET_CUSTOM_PRICE", "SET_CUSTOM_CONTRACT", "SET_PROVISIONING_DATE", "SET_BILLING_DATE", "CHANGE_OPPORTUNITY_OWNER" ], "actionRestrictions": { }, "createdByUser": { "id": "8f6b3d29-4169-4fb0-91ff-bad9b7a3d0d4", "email": "peter.parker@marvel.com", "firstName": "Peter", "lastName": "Parker", "company": { "id": "99", "name": "Marvel Corp." } } }` ## [](#tag/AppResellerOpportunities/operation/readOpportunities)List opportunities Retrieve a list of opportunities. Returned opportunities are limited to role visibility: Marketplace Manager, Partner, Partner Read: all opportunities. Reseller Manager: all opportunities owned by Reseller companies. Reseller, SSR: all opportunities owned by the company to which the Reseller or SSR belongs. When users have multiple roles, visibility is the sum of visibility for all their roles. Additional filter parameters are available for some roles. Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity * `ROLE_PARTNER_READ` - Allows read access as a Partner to the opportunity ##### query Parameters | | | | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ownerId | stringSales agent's user ID | | ownerCompanyId | stringSales agent's company ID, which defines which company owns opportunities. This is an optional filter to only return opportunities that the sale's agent's company owns. Only valid for Marketplace Manager, Reseller Manager, Partner, and Partner Read roles (invalid for Reseller and SSR roles because they can only see opportunities owned by their company). No opportunities are returned when the call is filtered by a company ID for which the user does not have access. | | customerId | stringCustomer's user ID | | customerCompanyId | stringCustomer's company ID | | context | stringEnum: "RESELLER" "SSR"Optional. For Marketplace Manager, Partner, and Partner Read roles, filter the returned opportunities by those owned by SSRs or Resellers. | | status | stringEnum: "OPEN" "CLOSED" "PENDING\_REVIEW"Opportunity status | | purchaseEffectiveDate | Array of stringsOpportunity purchase effective date filter, defined by upper or lower inclusive or exclusive limits, in Unix timestamp format. Acceptable values are: gte(\[timestamp]) - 'greater than or equal to'; or lte(\[timestamp]) - 'less than or equal to' | | createdOn | Array of stringsOpportunity creation date filter, defined by upper or lower inclusive or exclusive limits, in Unix timestamp format. Acceptable values are: gte(\[timestamp]) - 'greater than or equal to'; or lte(\[timestamp]) - 'less than or equal to' | | searchText | stringGeneral text search filter used for any ID (opportunity, sales agent, sales agent company, customer, or customer company) and opportunity name | | number | integerDefault:1Page number | | size | integerDefault:10Number of results per page | | sort | stringSort field and order. For ascending sort order, use the '+\[FieldName]' format. For descending order, use the '-\[FieldName]' format. | ### Responses **200** Success **403** The user does not have permission to execute the action get/assistedSales/v1/opportunities https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/assistedSales/v1/opportunities?ownerId=SOME_STRING_VALUE&ownerCompanyId=SOME_STRING_VALUE&customerId=SOME_STRING_VALUE&customerCompanyId=SOME_STRING_VALUE&context=SOME_STRING_VALUE&status=SOME_STRING_VALUE&purchaseEffectiveDate=SOME_ARRAY_VALUE&createdOn=SOME_ARRAY_VALUE&searchText=SOME_STRING_VALUE&number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sort=SOME_STRING_VALUE' ``` ### Response samples * 200 * 403 Content type application/json Copy Expand all Collapse all `{ "page": { "number": 1, "size": 10, "totalElements": 2, "totalPages": 1 }, "content": [ { "id": "ef6c414f-39da-401f-a4b8-81adc6190fda", "name": "Prospect N1", "ownerUser": { "id": "d781ac09-b4fe-4d57-8ba2-4640fc5b7c49", "email": "john.doe@acme.com", "firstName": "John", "lastName": "Doe", "company": { "id": "1", "name": "Acme Corp." } }, "customerUser": { "id": "498c62ea-ad14-48e6-96ce-5400c617444c", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "100", "name": "Customer Company" } }, "createdOn": 1557861989000, "purchaseEffectiveDate": 1577750400000, "status": "CLOSED", "ownerType": "PLATFORM_OWNER", "createdByUser": { "id": "8f6b3d29-4169-4fb0-91ff-bad9b7a3d0d4", "email": "peter.parker@marvel.com", "firstName": "Peter", "lastName": "Parker", "company": { "id": "99", "name": "Marvel Corp." } } }, { "id": "70826bb4-bb6c-43b8-9c39-2c4e481a8b5e", "name": null, "ownerUser": { "id": "d11cf5ef-6270-492f-9d2c-07fa01eeb5c2", "email": "jane.smith@globex.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "2", "name": "Globex Inc." } }, "customerUser": { "id": "e0a6bec0-7e25-43a1-b601-6a8cec5a847f", "email": "gsymons@stark.com", "firstName": "Gary", "lastName": "Symons", "company": { "id": "100", "name": "Customer Company" } }, "createdOn": 1557861989000, "purchaseEffectiveDate": null, "status": "OPEN", "ownerType": "PLATFORM_OWNER", "createdByUser": { "id": "8f6b3d29-4169-4fb0-91ff-bad9b7a3d0d4", "email": "peter.parker@marvel.com", "firstName": "Peter", "lastName": "Parker", "company": { "id": "99", "name": "Marvel Corp." } } } ] }` ## [](#tag/AppResellerOpportunities/operation/deleteOpportunities)Remove opportunities Removes a list of opportunities Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows Sales Support Representative access to opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### query Parameters | | | | --------------------- | ------------------------------------------------------------------------------------ | | opportunityIdrequired | Array of stringsThis parameter is required. The parameter lists the opportunity IDs. | ### Responses **204** No Content **400** Bad Request **401** Unauthorized delete/assistedSales/v1/opportunities https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url 'https://marketplace.appdirect.com/api/assistedSales/v1/opportunities?opportunityId=SOME_ARRAY_VALUE' ``` ### Response samples * 204 * 400 * 401 Content type application/json Copy `{ }` ## [](#tag/AppResellerOpportunities/operation/readOpportunity)Get opportunity details Read an opportunity Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity * `ROLE_PARTNER_READ` - Allows read access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ### Responses **200** Success **206** The creation of the opportunity is still in progress and a partial result is returned. **401** Unauthorized **403** The user does not have access to the opportunity **404** Invalid opportunity ID get/assistedSales/v1/opportunities/{opportunityId} https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId} https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/assistedSales/v1/opportunities/%7BopportunityId%7D ``` ### Response samples * 200 * 206 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `{ "id": "ef6c414f-39da-401f-a4b8-81adc6190fda", "ownerUser": { "id": "d781ac09-b4fe-4d57-8ba2-4640fc5b7c49", "email": "john.doe@acme.com", "firstName": "John", "lastName": "Doe", "company": { "id": "1", "name": "Acme Corp." } }, "customerUser": { "id": "498c62ea-ad14-48e6-96ce-5400c617444c", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "100", "name": "Customer Company" } }, "createdOn": "1546300800000", "currency": "USD", "purchaseEffectiveDate": "1577750400000", "name": "Prospect N1", "status": "OPEN", "items": [ { "id": "4ccf689b-4339-4fc9-a8b3-b05c5a87c1be", "pricingPlanId": "4bc864b5-f63f-4933-be19-3700aa9a8cc4", "units": [ { "quantity": "20", "unit": "USER" } ], "subscriptionCustomAttributes": { "intended_os": [ "other", "ios", "macos" ], "sales_agent_id": [ "R353113R" ] }, "vendorRequiredFields": { "name": [ "John" ], "lastname": [ "Doe" ], "email": [ "john.doe@acme.com" ] } }, { "id": "dece524d-0466-4185-b3bb-1f8a300c37cd", "pricingPlanId": "80b85538-ffc1-4c4b-acb1-1bf87c8c2fc4", "units": [ ] } ], "availableActions": [ "ADD_PRODUCT", "EDIT", "FINALIZE", "SET_CUSTOM_PRICE", "SET_CUSTOM_CONTRACT", "SET_PROVISIONING_DATE", "SET_BILLING_DATE", "CHANGE_OPPORTUNITY_OWNER" ], "actionRestrictions": { }, "createdByUser": { "id": "8f6b3d29-4169-4fb0-91ff-bad9b7a3d0d4", "email": "peter.parker@marvel.com", "firstName": "Peter", "lastName": "Parker", "company": { "id": "99", "name": "Marvel Corp." } } }` ## [](#tag/AppResellerOpportunities/operation/updateOpportunity)Update opportunity Updates an existing opportunity: name, purchase effective date and purchase custom attributes Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ##### Request Body schema: application/jsonrequired Information about the opportunity being updated | | | | ------------------------ | ----------------------------------------------------------------------------------------------------------- | | name | stringOpportunity name | | purchaseEffectiveDate | numberOpportunity purchase effective date, in UNIX Epoch milliseconds | | purchaseCustomAttributes | object (CustomAttribute)Custom attributes as key-value pairs. Values must be a string array | ### Responses **200** Success **401** Unauthorized **403** The user does not have access to the opportunity or the opportunity status does not allow the action **404** Invalid opportunity ID patch/assistedSales/v1/opportunities/{opportunityId} https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId} https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "name": "New opportunity", "purchaseEffectiveDate": 1577750400000, "purchaseCustomAttributes": { "paid_off_platform_contact": [ "janet.doe@accounting.acme.com" ] } }` ### Response samples * 200 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `{ "id": "ef6c414f-39da-401f-a4b8-81adc6190fda", "ownerUser": { "id": "d781ac09-b4fe-4d57-8ba2-4640fc5b7c49", "email": "john.doe@acme.com", "firstName": "John", "lastName": "Doe", "company": { "id": "1", "name": "Acme Corp." } }, "customerUser": { "id": "498c62ea-ad14-48e6-96ce-5400c617444c", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "100", "name": "Customer Company" } }, "createdOn": "1546300800000", "currency": "USD", "purchaseEffectiveDate": "1577750400000", "name": "Prospect N1", "status": "OPEN", "items": [ { "id": "4ccf689b-4339-4fc9-a8b3-b05c5a87c1be", "pricingPlanId": "4bc864b5-f63f-4933-be19-3700aa9a8cc4", "units": [ { "quantity": "20", "unit": "USER" } ], "subscriptionCustomAttributes": { "intended_os": [ "other", "ios", "macos" ], "sales_agent_id": [ "R353113R" ] }, "vendorRequiredFields": { "name": [ "John" ], "lastname": [ "Doe" ], "email": [ "john.doe@acme.com" ] } }, { "id": "dece524d-0466-4185-b3bb-1f8a300c37cd", "pricingPlanId": "80b85538-ffc1-4c4b-acb1-1bf87c8c2fc4", "units": [ ] } ], "availableActions": [ "ADD_PRODUCT", "EDIT", "FINALIZE", "SET_CUSTOM_PRICE", "SET_CUSTOM_CONTRACT", "SET_PROVISIONING_DATE", "SET_BILLING_DATE", "CHANGE_OPPORTUNITY_OWNER" ], "actionRestrictions": { }, "createdByUser": { "id": "8f6b3d29-4169-4fb0-91ff-bad9b7a3d0d4", "email": "peter.parker@marvel.com", "firstName": "Peter", "lastName": "Parker", "company": { "id": "99", "name": "Marvel Corp." } } }` ## [](#tag/AppResellerOpportunities/operation/addItems)Add items Add one or more items to an opportunity Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support for the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity. Role permissions are required to execute this action. * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ##### Request Body schema: application/jsonrequired Information about the items being added to the opportunity. Request body must include either a product ID or pricing plan ID for each item. Item IDs are returned by the API after the items are added to the opportunity Array | | | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | stringItem ID | | parentItemId | stringThe parent product's Product ID. Only relevant to and required for add-on products. | | pricingPlanId | stringPricing plan ID | | units | Array of objects (BillingConfiguration)List of units (quantity and type) associated with the item | | productId | stringProduct ID | | subscriptionCustomAttributes | object (CustomAttribute)Custom attributes as key-value pairs. Values must be a string array | | vendorRequiredFields | object (CustomAttribute)Custom attributes as key-value pairs. Values must be a string array | | provisioningConfiguration | object (ProvisioningConfiguration)Determines when to send the service activation request to the vendor, either immediately after the opportunity is finalized (set the provisioning strategy to IMMEDIATELY) or at a future date (set the provisioning strategy to CUSTOM and set the desired date). | | billingConfiguration | object (BillingConfiguration)Determines when the billing cycle starts. Set UPON\_SERVICE\_ACTIVATION to start the billing cycle according to the specified provisioning strategy (either immediately after the opportunity is finalized or on a custom provisioning date). Set NEXT\_BILLING\_CYCLE to start the billing cycle according to the marketplace billing configuration (for example, first of the month). Set CUSTOM to start the billing cycle on a specified date in the future. | ### Responses **200** Success **400** Missing or invalid required parameter **401** Unauthorized **403** The user does not have access to the opportunity, or the user does not have permission to execute the action, or the opportunity status does not allow the action **404** Invalid opportunity ID, or product or pricing plan not found **409** Restrictions apply to one or more products post/assistedSales/v1/opportunities/{opportunityId}/items https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/items https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/items ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `[ { "pricingPlanId": "a22c03e9-9e27-4e85-8433-78f246345685", "units": [ { "quantity": "8", "unit": "USER" } ], "subscriptionCustomAttributes": { "intended_os": [ "other", "ios", "macos" ], "sales_agent_id": [ "R353113R" ] }, "vendorRequiredFields": { "name": [ "jonh" ], "lastname": [ "doe" ], "email": [ "john.doe@acme.com" ] }, "provisioningConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" } } ]` ### Response samples * 200 * 400 * 401 * 403 * 404 * 409 Content type application/json Copy Expand all Collapse all `[ { "id": "37f56046-2cec-4bf4-a4e2-5a733dc849a9", "pricingPlanId": "a22c03e9-9e27-4e85-8433-78f246345685", "units": [ { "quantity": "8", "unit": "USER" } ], "subscriptionCustomAttributes": { "intended_os": [ "other", "ios", "macos" ], "sales_agent_id": [ "R353113R" ] }, "vendorRequiredFields": { "name": [ "jonh" ], "lastname": [ "doe" ], "email": [ "john.doe@acme.com" ] }, "provisioningConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" } } ]` ## [](#tag/AppResellerOpportunities/operation/readItems)List items Lists all items in an opportunity. Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity * `ROLE_PARTNER_READ` - Allows read access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ### Responses **200** Success **401** Unauthorized **403** The user does not have access to the opportunity **404** Invalid opportunity ID get/assistedSales/v1/opportunities/{opportunityId}/items https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/items https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/items ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/assistedSales/v1/opportunities/%7BopportunityId%7D/items ``` ### Response samples * 200 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `[ { "id": "37f56046-2cec-4bf4-a4e2-5a733dc849a9", "product": { "id": "cc0c7c28-ea65-4bab-8a4a-5e84d90ab291", "name": "Appsome Webapp", "type": "WEB_APP", "logo": "https://logs.acme.com/400x400/ddd/000.png&text=Appsome+App" }, "pricingPlan": { "id": "031d9ed2-3df1-44f5-876a-6b4318ba7bdb", "name": "Recurring Edition with Unlimited Included Users" }, "units": [ { "quantity": "8", "unit": "USER" } ], "pricing": [ { "costId": "cd3c7c22-sd64-4bag-8a4v-5e84d90ab291", "costTypeCategory": "RECURRING", "costType": "RECURRING_FLAT", "pricingStrategy": "FREE", "priceRanges": [ ], "description": "RECURRING_FLAT", "quantity": "1.0000000000", "salePrice": "0.0000000000", "wholesalePrice": "0.0000000000", "totalSalePrice": "0.0000000000" }, { "costId": "kl3c7c24-sd33-4bui-8a4v-8u84d98ab333", "costTypeCategory": "RECURRING", "costType": "INCLUDED", "pricingStrategy": "UNLIMITED", "priceRanges": [ ], "description": "INCLUDED", "unit": "USER", "salePrice": "0.0000000000", "wholesalePrice": "0.0000000000", "totalSalePrice": "0.0000000000" } ], "subscriptionCustomAttributes": { "intended_os": [ "other", "ios", "macos" ], "sales_agent_id": [ "R353113R" ] }, "vendorRequiredFields": { "name": [ "John" ], "lastname": [ "Doe" ], "email": [ "john.doe@acme.com" ] }, "contractConfiguration": { "minimumServiceLength": 3, "minimumServiceLengthUnit": "MONTHLY", "terminationFee": { "feeType": "FIXED", "amount": 2 }, "renewalConfiguration": "MONTH_TO_MONTH", "terminationFeeGracePeriod": 7, "terminationFeeGracePeriodUnit": "DAY", "contractCancellationPeriodLimit": null, "contractCancellationPeriodUnit": "NONE", "endOfContractGracePeriod": null, "endOfContractGracePeriodUnit": "INFINITY", "unitTerms": { "USER": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "blockContractUpgrades": false, "blockContractDowngrades": true, "blockSwitchToShorterContract": true, "keepContractDateOnPlanChange": false }, "provisioningConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" } } ]` ## [](#tag/AppResellerOpportunities/operation/deleteOpportunityItem)Remove item Removes an item from the opportunity Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | | itemIdrequired | stringItem ID | ### Responses **204** No Content **401** Unauthorized **403** The user does not have access to the opportunity or the opportunity status does not allow the action **404** Invalid opportunity ID delete/assistedSales/v1/opportunities/{opportunityId}/items/{itemId} https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/items/{itemId} https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/items/{itemId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/assistedSales/v1/opportunities/%7BopportunityId%7D/items/%7BitemId%7D ``` ### Response samples * 401 * 403 * 404 Content type application/json Copy `{ "status": 401, "code": "UNAUTHORIZED", "message": "HTTP 401 Unauthorized" }` ## [](#tag/AppResellerOpportunities/operation/editItem)Edit item Edit an item on the opportunity. Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allow access as a Reseller to the opportunity. Role permissions are required to update, for example, custom prices, custom contracts, provisioning configuration, and billing configuration. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support Representative to the opportunity. Role permissions are required to update, for example, custom prices, custom contracts, provisioning configuration, and billing configuration. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity. Role permissions are required to update, for example, custom prices. * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | | itemIdrequired | stringItem ID | ##### Request Body schema: application/jsonrequired Information about the item being edited | | | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | stringItem ID | | pricingPlanIdrequired | stringPricing plan ID | | units | Array of objects (Unit)List of units (quantity and type) associated with the item | | customPrices | Array of objects (CustomPrice)List of custom prices per cost | | contractConfiguration | object (ContractConfiguration)Contract configuration options for subscriptions that customers purchase. For example: contract length and cancellation penalities. | | provisioningConfiguration | object (ProvisioningConfiguration)Determines when to send the service activation request to the vendor, either immediately after the opportunity is finalized (set the provisioning strategy to IMMEDIATELY) or at a future date (set the provisioning strategy to CUSTOM and set the desired date). | | billingConfiguration | object (BillingConfiguration)Determines when the billing cycle starts. Set UPON\_SERVICE\_ACTIVATION to start the billing cycle according to the specified provisioning strategy (either immediately after the opportunity is finalized or on a custom provisioning date). Set NEXT\_BILLING\_CYCLE to start the billing cycle according to the marketplace billing configuration (for example, first of the month). Set CUSTOM to start the billing cycle on a specified date in the future. | | subscriptionCustomAttributes | object (CustomAttribute)Custom attributes as key-value pairs. Values must be a string array | | vendorRequiredFields | object (CustomAttribute)Custom attributes as key-value pairs. Values must be a string array | ### Responses **200** Success **400** Missing or invalid required parameter **401** Unauthorized **403** The user does not have access to the opportunity, or does not have permission to update part or the whole item information, or the opportunity status does not allow the action **404** Invalid opportunity ID put/assistedSales/v1/opportunities/{opportunityId}/items/{itemId} https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/items/{itemId} https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/items/{itemId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "id": "37f56046-2cec-4bf4-a4e2-5a733dc849a9", "pricingPlanId": "a22c03e9-9e27-4e85-8433-78f246345685", "units": [ { "quantity": "8", "unit": "USER" } ], "customPrices": [ { "costId": "e5f403a3-7ba0-45d4-8117-8dd8cbceb6c6", "price": 100 }, { "costId": "9742e09a-e1b4-4b9e-b1a7-66df3e41cebe", "price": 20 } ], "contractConfiguration": { "minimumServiceLength": "3", "minimumServiceLengthUnit": "MONTHLY", "terminationFee": { "feeType": "FIXED", "amount": "2" }, "renewalConfiguration": "MONTH_TO_MONTH", "terminationFeeGracePeriod": "7", "terminationFeeGracePeriodUnit": "DAY", "contractCancellationPeriodLimit": null, "contractCancellationPeriodUnit": "NONE", "endOfContractGracePeriod": null, "endOfContractGracePeriodUnit": "INFINITY", "unitTerms": { "USER": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "blockContractUpgrades": false, "blockContractDowngrades": true, "blockSwitchToShorterContract": true, "keepContractDateOnPlanChange": false }, "provisioningConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "subscriptionCustomAttributes": { "intended_os": [ "other", "ios", "macos" ], "sales_agent_id": [ "R353113R" ] }, "vendorRequiredFields": { "name": [ "John" ], "lastname": [ "Doe" ], "email": [ "john.doe@acme.com" ] } }` ### Response samples * 200 * 400 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `{ "id": "37f56046-2cec-4bf4-a4e2-5a733dc849a9", "product": { "id": "cc0c7c28-ea65-4bab-8a4a-5e84d90ab291", "name": "Appsome Webapp", "type": "WEB_APP", "logo": "https://logs.acme.com/400x400/ddd/000.png&text=Appsome+App" }, "pricingPlan": { "id": "031d9ed2-3df1-44f5-876a-6b4318ba7bdb", "name": "Recurring Edition with Unlimited Included Users" }, "units": [ { "quantity": "8", "unit": "USER" } ], "pricing": [ { "costId": "cd3c7c22-sd64-4bag-8a4v-5e84d90ab291", "costTypeCategory": "RECURRING", "costType": "RECURRING_FLAT", "pricingStrategy": "FREE", "priceRanges": [ ], "description": "RECURRING_FLAT", "quantity": "1.0000000000", "salePrice": "0.0000000000", "wholesalePrice": "0.0000000000", "totalSalePrice": "0.0000000000" }, { "costId": "kl3c7c24-sd33-4bui-8a4v-8u84d98ab333", "costTypeCategory": "RECURRING", "costType": "INCLUDED", "pricingStrategy": "UNLIMITED", "priceRanges": [ ], "description": "INCLUDED", "unit": "USER", "salePrice": "0.0000000000", "wholesalePrice": "0.0000000000", "totalSalePrice": "0.0000000000" } ], "subscriptionCustomAttributes": { "intended_os": [ "other", "ios", "macos" ], "sales_agent_id": [ "R353113R" ] }, "vendorRequiredFields": { "name": [ "John" ], "lastname": [ "Doe" ], "email": [ "john.doe@acme.com" ] }, "contractConfiguration": { "minimumServiceLength": "3", "minimumServiceLengthUnit": "MONTHLY", "terminationFee": { "feeType": "FIXED", "amount": "2" }, "renewalConfiguration": "MONTH_TO_MONTH", "terminationFeeGracePeriod": "7", "terminationFeeGracePeriodUnit": "DAY", "contractCancellationPeriodLimit": null, "contractCancellationPeriodUnit": "NONE", "endOfContractGracePeriod": null, "endOfContractGracePeriodUnit": "INFINITY", "unitTerms": { "USER": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "blockContractUpgrades": false, "blockContractDowngrades": true, "blockSwitchToShorterContract": true, "keepContractDateOnPlanChange": false }, "provisioningConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" } }` ## [](#tag/AppResellerOpportunities/operation/finalizeOpportunity)Finalize opportunity Finalize an opportunity Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity. Role permissions are required to execute this action. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity. Role permissions are required to execute this action. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity. Role permissions are required to execute this action. * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ### Responses **202** Accepted **401** Unauthorized **403** The user does not have access to the opportunity, or the user does not have permission to execute the action, or the opportunity status does not allow the action, or restrictions apply such as customer account being inactive. **404** Invalid opportunity ID post/assistedSales/v2/opportunities/{opportunityId}/finalize https\://marketplace.appdirect.com/api/assistedSales/v2/opportunities/{opportunityId}/finalize https\://virtserver.swaggerhub.com/assistedSales/v2/opportunities/{opportunityId}/finalize ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/assistedSales/v2/opportunities/%7BopportunityId%7D/finalize ``` ### Response samples * 202 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `{ "id": "ef6c414f-39da-401f-a4b8-81adc6190fda", "ownerUser": { "id": "d781ac09-b4fe-4d57-8ba2-4640fc5b7c49", "email": "john.doe@acme.com", "firstName": "John", "lastName": "Doe", "company": { "id": "1", "name": "Acme Corp." } }, "customerUser": { "id": "498c62ea-ad14-48e6-96ce-5400c617444c", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "100", "name": "Customer Company" } }, "createdOn": "1546300800000", "currency": "USD", "name": "Prospect N1", "status": "PROCESSING", "items": [ { "id": "4ccf689b-4339-4fc9-a8b3-b05c5a87c1be", "pricingPlanId": "4bc864b5-f63f-4933-be19-3700aa9a8cc4", "units": [ { "quantity": "20", "unit": "USER" } ], "subscriptionCustomAttributes": { "intended_os": [ "other", "ios", "macos" ], "sales_agent_id": [ "R353113R" ] }, "vendorRequiredFields": { "name": [ "John" ], "lastname": [ "Doe" ], "email": [ "john.doe@acme.com" ] } }, { "id": "dece524d-0466-4185-b3bb-1f8a300c37cd", "pricingPlanId": "80b85538-ffc1-4c4b-acb1-1bf87c8c2fc4", "units": [ ] } ], "availableActions": [ ], "purchaseId": "62e0f81b-a016-403a-8b9b-a01b515837ca", "purchaseNumber": "006204", "createdByUser": { "id": "8f6b3d29-4169-4fb0-91ff-bad9b7a3d0d4", "email": "peter.parker@marvel.com", "firstName": "Peter", "lastName": "Parker", "company": { "id": "99", "name": "Marvel Corp." } } }` ## [](#tag/AppResellerOpportunities/operation/requestOpportunityReview)Request opportunity review Submit the opportunity to the manager for review. After it is submitted, the sales agent cannot modify the opportunity. Managers can still modify and finalize it. Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity. Role permmission required to execute this action. ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ### Responses **200** Success **401** Unauthorized **403** The user does not have access to the opportunity, or the user does not have permissions to execute the action, or the opportunity status does not allow the action, or restrictions apply such as customer account being inactive. **404** Invalid opportunity ID post/assistedSales/v1/opportunities/{opportunityId}/requestReview https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/requestReview https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/requestReview ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/assistedSales/v1/opportunities/%7BopportunityId%7D/requestReview ``` ### Response samples * 200 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `{ "id": "ef6c414f-39da-401f-a4b8-81adc6190fda", "ownerUser": { "id": "d781ac09-b4fe-4d57-8ba2-4640fc5b7c49", "email": "john.doe@acme.com", "firstName": "John", "lastName": "Doe", "company": { "id": "1", "name": "Acme Corp." } }, "customerUser": { "id": "498c62ea-ad14-48e6-96ce-5400c617444c", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "100", "name": "Customer Company" } }, "createdOn": "1546300800000", "currency": "USD", "purchaseEffectiveDate": "1577750400000", "name": "Prospect N1", "status": "PENDING_REVIEW", "items": [ { "id": "4ccf689b-4339-4fc9-a8b3-b05c5a87c1be", "pricingPlanId": "4bc864b5-f63f-4933-be19-3700aa9a8cc4", "units": [ { "quantity": "20", "unit": "USER" } ], "subscriptionCustomAttributes": { "intended_os": [ "other", "ios", "macos" ], "sales_agent_id": [ "R353113R" ] }, "vendorRequiredFields": { "name": [ "John" ], "lastname": [ "Doe" ], "email": [ "john.doe@acme.com" ] } }, { "id": "dece524d-0466-4185-b3bb-1f8a300c37cd", "pricingPlanId": "80b85538-ffc1-4c4b-acb1-1bf87c8c2fc4", "units": [ ] } ], "availableActions": [ ], "createdByUser": { "id": "8f6b3d29-4169-4fb0-91ff-bad9b7a3d0d4", "email": "peter.parker@marvel.com", "firstName": "Peter", "lastName": "Parker", "company": { "id": "99", "name": "Marvel Corp." } } }` ## [](#tag/AppResellerOpportunities/operation/readOpportunitySummary)Get opportunity summary Read the pricing summary of an opportunity Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity * `ROLE_PARTNER_READ` - Allows read access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ### Responses **200** Success **401** Unauthorized **403** The user does not have access to the opportunity **404** Invalid opportunity ID get/assistedSales/v1/opportunities/{opportunityId}/summary https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/summary https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/summary ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/assistedSales/v1/opportunities/%7BopportunityId%7D/summary ``` ### Response samples * 200 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `{ "amountDueBeforeTax": "11.0000000000", "taxSummary": [ { "description": "Flat Tax", "taxAmount": "2.0000000000" } ], "amountDueAfterTax": "13.0000000000", "items": [ { "id": "c57331b7-0820-44ac-ad75-ee4ab2783b7c", "product": { "id": "fa776d2e-cda5-4256-9a27-125a0fe3f448", "name": "Supported Product for Opportunity MVP", "type": "WEB_APP_STACKED", "isAddon": false, "hasAddons": false }, "pricingPlan": { "id": "7e1fd1fa-de0e-49e9-9e6a-9c474c57f22d", "name": "Tiered monthly+yearly flat with included YEARLY", "editionCode": "Tiered monthly+yearly flat with included" }, "pricing": [ { "costType": "RECURRING_FLAT", "description": "Tiered monthly+yearly flat with included", "quantity": "1.0000000000", "totalSalePrice": "240.0000000000" }, { "costType": "INCLUDED", "description": "INCLUDED", "quantity": "1.0000000000", "totalSalePrice": "0.0000000000" } ], "contractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "YEARLY", "unitTerms": { }, "blockContractUpgrades": true, "blockContractDowngrades": true, "blockSwitchToShorterContract": true, "keepContractDateOnPlanChange": true }, "unitDefinitions": [ { "unit": "USER", "minimum": "1.0000000000", "meteredUsage": false, "allowDecimals": false, "readOnly": true, "pricePerIncrement": false } ] } ], "recurringTotals": [ { "billingCycle": { "period": "YEARLY", "dayOfMonth": 17 }, "totalSalePrice": "240.0000000000" } ] }` ## [](#tag/AppResellerOpportunities/operation/readPricingPlanCosts)Get opportunity pricing plan costs Read initial costs for a pricing plan of an opportunity item. 'Required: Accept-Language' header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity * `ROLE_PARTNER_READ` - Allows read access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ##### query Parameters | | | | --------------------- | ------------------------------------------------------------ | | pricingPlanIdrequired | stringPricing plan ID | | currencyrequired | stringOpportunity currency, using the ISO-4217 currency code | ### Responses **200** Success **401** Unauthorized **403** The user does not have access to the opportunity **404** Invalid opportunity ID get/assistedSales/v1/opportunities/{opportunityId}/pricingPlanCosts https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/pricingPlanCosts https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/pricingPlanCosts ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/assistedSales/v1/opportunities/%7BopportunityId%7D/pricingPlanCosts?pricingPlanId=SOME_STRING_VALUE¤cy=SOME_STRING_VALUE' ``` ### Response samples * 200 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `{ "pricingPlanId": "a01c46d4-8925-4719-a891-2c036e2216a1", "pricing": [ { "costId": "0121502b-0bac-4927-825c-d1f6c19e79c7", "costTypeCategory": "ONE_TIME", "frequency": "ONE_TIME", "costType": "CONTRACT_FEE", "pricingStrategy": "FLAT", "priceRanges": [ ], "description": "Contract charge", "unit": "CONTRACT_FEE", "quantity": "1.0000000000", "salePrice": "300.0000000000", "wholesalePrice": "300.0000000000", "totalSalePrice": "300.0000000000" }, { "costId": "78092def-eeb6-42dc-917e-182e38b53d16", "costTypeCategory": "RECURRING", "frequency": "MONTHLY", "costType": "RECURRING_FLAT", "pricingStrategy": "FLAT", "priceRanges": [ ], "description": "Recurring monthly flat+ppu+ot with contract+ot+tf with included", "quantity": "1.0000000000", "salePrice": "10.0000000000", "wholesalePrice": "10.0000000000", "totalSalePrice": "10.0000000000" }, { "costId": "ea5b596d-950f-427b-87d0-7c82340b468b", "costTypeCategory": "ONE_TIME", "frequency": "ONE_TIME", "costType": "SETUP_FEE", "pricingStrategy": "FLAT", "priceRanges": [ ], "description": "Recurring monthly flat+ppu+ot with contract+ot+tf with included", "quantity": "1.0000000000", "salePrice": "100.0000000000", "wholesalePrice": "100.0000000000", "totalSalePrice": "100.0000000000" }, { "costId": "6160b953-88f7-49ec-a90d-aef0f9ae5d17", "costTypeCategory": "RECURRING", "frequency": "MONTHLY", "costType": "RECURRING_PER_UNIT", "pricingStrategy": "UNIT", "priceRanges": [ { "min": "0.0000000000" } ], "description": "Per User Fee", "unit": "USER", "quantity": "0.0000000000", "salePrice": "8.5000000000", "wholesalePrice": "8.5000000000", "totalSalePrice": "0.0000000000" }, { "costTypeCategory": "RECURRING", "frequency": "MONTHLY", "costType": "INCLUDED", "pricingStrategy": "UNIT", "priceRanges": [ { "min": "1.0000000000", "max": "1.0000000000" } ], "description": "INCLUDED", "unit": "USER", "quantity": "1.0000000000", "salePrice": "0.0000000000", "wholesalePrice": "0.0000000000", "totalSalePrice": "0.0000000000" } ], "contractConfiguration": { "minimumServiceLength": 12, "minimumServiceLengthUnit": "MONTHLY", "renewalConfiguration": "AUTO_RENEW", "terminationFee": { "feeType": "FIXED", "amount": 400, "description": "Termination fee!" }, "terminationFeeGracePeriodUnit": "NONE", "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodUnit": "NONE", "unitTerms": { }, "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "isDefault": true }, "unitDefinitions": [ { "unit": "USER", "minimum": "1.0000000000", "meteredUsage": false, "allowDecimals": false, "readOnly": false, "quantity": "1.0000000000", "increment": 1, "pricePerIncrement": false } ] }` ## [](#tag/AppResellerOpportunities/operation/readPricingPlanCostsWithoutOpportunity)Get opportunity pricing plan costs without specifying an opportunity Read initial costs for a pricing plan of an opportunity item without specifying an opportunity. 'Required: Accept-Language' header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as Partner to the opportunity * `ROLE_PARTNER_READ` - Allows read access as Partner to the opportunity ##### query Parameters | | | | ---------------------- | ------------------------------------------------------------ | | pricingPlanIdrequired | stringPricing plan ID | | ownerIdrequired | stringSales agent's user ID | | ownerCompanyIdrequired | stringSales agent's company ID | | currencyrequired | stringOpportunity currency, using the ISO-4217 currency code | ##### header Parameters | | | | ----------------------- | ----------------------------- | | Accept-Languagerequired | stringLocale. Format: 'en-US' | ### Responses **200** Success **400** Missing or invalid required parameter **403** The user does not have permission to execute the action. get/assistedSales/v1/opportunities/pricingPlanCosts https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/pricingPlanCosts https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/pricingPlanCosts ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/assistedSales/v1/opportunities/pricingPlanCosts?pricingPlanId=SOME_STRING_VALUE&ownerId=SOME_STRING_VALUE&ownerCompanyId=SOME_STRING_VALUE¤cy=SOME_STRING_VALUE' \ --header 'Accept-Language: SOME_STRING_VALUE' ``` ### Response samples * 200 * 400 * 403 Content type application/json Copy Expand all Collapse all `{ "pricingPlanId": "a01c46d4-8925-4719-a891-2c036e2216a1", "pricing": [ { "costId": "0121502b-0bac-4927-825c-d1f6c19e79c7", "costTypeCategory": "ONE_TIME", "frequency": "ONE_TIME", "costType": "CONTRACT_FEE", "pricingStrategy": "FLAT", "priceRanges": [ ], "description": "Contract charge", "unit": "CONTRACT_FEE", "quantity": "1.0000000000", "salePrice": "300.0000000000", "wholesalePrice": "300.0000000000", "totalSalePrice": "300.0000000000" }, { "costId": "78092def-eeb6-42dc-917e-182e38b53d16", "costTypeCategory": "RECURRING", "frequency": "MONTHLY", "costType": "RECURRING_FLAT", "pricingStrategy": "FLAT", "priceRanges": [ ], "description": "Recurring monthly flat+ppu+ot with contract+ot+tf with included", "quantity": "1.0000000000", "salePrice": "10.0000000000", "wholesalePrice": "10.0000000000", "totalSalePrice": "10.0000000000" }, { "costId": "ea5b596d-950f-427b-87d0-7c82340b468b", "costTypeCategory": "ONE_TIME", "frequency": "ONE_TIME", "costType": "SETUP_FEE", "pricingStrategy": "FLAT", "priceRanges": [ ], "description": "Recurring monthly flat+ppu+ot with contract+ot+tf with included", "quantity": "1.0000000000", "salePrice": "100.0000000000", "wholesalePrice": "100.0000000000", "totalSalePrice": "100.0000000000" }, { "costId": "6160b953-88f7-49ec-a90d-aef0f9ae5d17", "costTypeCategory": "RECURRING", "frequency": "MONTHLY", "costType": "RECURRING_PER_UNIT", "pricingStrategy": "UNIT", "priceRanges": [ { "min": "0.0000000000" } ], "description": "Per User Fee", "unit": "USER", "quantity": "0.0000000000", "salePrice": "8.5000000000", "wholesalePrice": "8.5000000000", "totalSalePrice": "0.0000000000" }, { "costTypeCategory": "RECURRING", "frequency": "MONTHLY", "costType": "INCLUDED", "pricingStrategy": "UNIT", "priceRanges": [ { "min": "1.0000000000", "max": "1.0000000000" } ], "description": "INCLUDED", "unit": "USER", "quantity": "1.0000000000", "salePrice": "0.0000000000", "wholesalePrice": "0.0000000000", "totalSalePrice": "0.0000000000" } ], "contractConfiguration": { "minimumServiceLength": 12, "minimumServiceLengthUnit": "MONTHLY", "renewalConfiguration": "AUTO_RENEW", "terminationFee": { "feeType": "FIXED", "amount": 400, "description": "Termination fee!" }, "terminationFeeGracePeriodUnit": "NONE", "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodUnit": "NONE", "unitTerms": { }, "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "isDefault": true }, "unitDefinitions": [ { "unit": "USER", "minimum": "1.0000000000", "meteredUsage": false, "allowDecimals": false, "readOnly": false, "quantity": "1.0000000000", "increment": 1, "pricePerIncrement": false } ] }` ## [](#tag/AppResellerOpportunities/operation/changeOwner)Change opportunity owner Changes the owner of an opportunity. When the owner changes, all products are removed from the opportunity. Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ##### Request Body schema: application/jsonrequired Information about the new owner of the opportunity | | | | ---------------------- | ---------------------------------------- | | ownerIdrequired | stringThe unique user ID of the owner | | ownerCompanyIdrequired | stringThe unique company ID of the owner | ### Responses **200** The updated opportunity with the new owner and empty of products **400** Missing or invalid required parameter, or the new owner's company membership is invalid, or the Reseller is not linked to the opportunity customer **401** Unauthorized **403** The user does not have access to the opportunity, or the user does not have permission to execute the action, or the opportunity status does not allow the action **404** Invalid opportunity ID patch/assistedSales/v1/opportunities/{opportunityId}/owner https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/owner https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/owner ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "ownerId": "d781ac09-b4fe-4d57-8ba2-4640fc5b7c49", "ownerCompanyId": "6a62244e-aa2f-461b-8c7a-3a0e091be9d3" }` ### Response samples * 200 * 400 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `{ "id": "ef6c414f-39da-401f-a4b8-81adc6190fda", "ownerUser": { "id": "d781ac09-b4fe-4d57-8ba2-4640fc5b7c49", "email": "john.doe@acme.com", "firstName": "John", "lastName": "Doe", "company": { "id": "6a62244e-aa2f-461b-8c7a-3a0e091be9d3", "name": "Acme Corp." } }, "customerUser": { "id": "498c62ea-ad14-48e6-96ce-5400c617444c", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "100", "name": "Customer Company" } }, "createdOn": "1546300800000", "status": "OPEN", "availableActions": [ "ADD_PRODUCT" ], "actionRestrictions": { }, "createdByUser": { "id": "8f6b3d29-4169-4fb0-91ff-bad9b7a3d0d4", "email": "peter.parker@marvel.com", "firstName": "Peter", "lastName": "Parker", "company": { "id": "99", "name": "Marvel Corp." } } }` ## [](#tag/AppResellerOpportunities/operation/getOpportunityValidationResults)Retrieve validation results Retrieve the latest validation results for an opportunity Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity * `ROLE_PARTNER_READ` - Allows read access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ##### query Parameters | | | | ------- | -------------------------------------------------------------------- | | enforce | booleanIndicates that a new validation must be executed and returned | ### Responses **200** Validation results were retrieved successfully **400** Missing required parameter **401** Unauthorized **403** The user does not have access to the opportunity, or the user does not have permission to execute the action. **404** Invalid opportunity ID **503** Unable to retrieve validation results because the service is unavailable get/assistedSales/v1/opportunities/{opportunityId}/validation https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/validation https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/validation ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/assistedSales/v1/opportunities/%7BopportunityId%7D/validation?enforce=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 * 400 * 401 * 403 * 404 * 503 Content type application/json Copy Expand all Collapse all `{ "blockingErrors": [ { "itemId": "f9b31739-ee52-42dd-bd3c-44d40d4875f9", "code": "ASSOCIATION_VALIDATION_API_ERROR", "message": "Invalid parent product", "messageParameters": [ ] }, { "itemId": "eb690c8d-1c57-497c-82bf-a4194362d954", "code": "REQUIRED_FIELD_VALIDATION_ERROR", "message": "There are validation errors", "messageParameters": [ { "key": "REQUIRED_FIELD_KEY", "value": "DOMAIN" }, { "key": "REQUIRED_FIELD_ERROR_MESSAGE", "value": "The domain is not valid" } ] }, { "itemId": "eb690c8d-1c57-497c-82bf-a4194362d954", "code": "REQUIRED_FIELD_VALIDATION_ERROR", "message": "There are validation errors", "messageParameters": [ { "key": "REQUIRED_FIELD_KEY", "value": "USERNAME" }, { "key": "REQUIRED_FIELD_ERROR_MESSAGE", "value": "The username is not valid" } ] } ], "pendingValidations": [ "SUBSCRIPTION_VALIDATIONS" ] }` ## [](#tag/AppResellerOpportunities/operation/getRequiredFieldsDefinitions)Required field definitions For a customer/sales agent combination, returns the vendor-required fields for one or more products, and a description of the fields. Request can be made before or after an opportunity is created. It returns the fields that will be required, and any values previously saved on the AppDirect platform that can be prepopulated when an opportunity is created. It does not return required field values edited, added, or saved with an opportunity. Some vendors (for example, Microsoft) have business rules that exclude required fields from the response when the vendor already has the information stored on their platform for the customer/sales agent/product combination. Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support Representative to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity * `ROLE_PARTNER_READ` - Allows read access as a Partner to the opportunity ##### query Parameters | | | | --------------------------- | ----------------------------------------------- | | userIdrequired | stringCustomer's unique identifier | | companyIdrequired | stringCustomer's company's unique identifier | | salesAgentUserIdrequired | stringSales agent's unique user identifier | | salesAgentCompanyIdrequired | stringSales agent's company's unique identifier | ##### header Parameters | | | | ----------------------- | ----------------------------- | | Accept-Languagerequired | stringLocale. Format: 'en-US' | ##### Request Body schema: application/jsonrequired List of product IDs for which to retrieve required field details. Required: editionID and productID. Array | | | | ----------------- | ---------------------- | | productIdrequired | stringThe product ID | | editionIdrequired | stringThe edition code | ### Responses **200** Required field definitions retrieved successfully **400** Missing or invalid required parameter **401** Unauthorized **404** Product ID not found post/assistedSales/v1/opportunities/items/requiredFields/definitions https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/items/requiredFields/definitions https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/items/requiredFields/definitions ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `[ { "productId": "dfc9cefb-610b-4e49-ade8-6ae51a4d35c9", "editionId": "EDITION_CODE" } ]` ### Response samples * 200 * 400 * 401 * 404 Content type application/json Copy Expand all Collapse all `{ "productId": "dfc9cefb-610b-4e49-ade8-6ae51a4d35c9", "editionId": "EDITION_CODE", "forms": [ { "isvIdentifier": "ISV", "context": "CART_LEVEL", "title": "Additional Information", "subTitle": "Additional Information Subtitle", "fields": [ { "inputCode": "FirstName", "inputTitle": "First name", "subTitle": "", "tooltip": "", "value": "John", "fieldType": "TEXT", "validations": { "required": true, "readonly": false, "minLength": "2", "maxLength": "255", "expression": "^[A-Za-z]+(((\\'|\\-|\\.(\\s)?|\\,(\\s)?|\\s)?([A-Za-z])+))*$" }, "options": { "suffix": { "text": "", "inputCode": "" } } }, { "inputCode": "Address/ISO3Country", "inputTitle": "Country", "subTitle": "", "tooltip": "", "value": "USA", "fieldType": "COUNTRY", "validations": { "required": true, "readonly": false, "minLength": "2", "maxLength": "3", "expression": "^[A-Za-z]{2}$" }, "options": { "suffix": { "text": "" }, "placeholder": "" } }, { "inputCode": "SubDomain", "inputTitle": "Your primary domain name", "subTitle": "", "tooltip": "Your subdomain and domain names. For example: When subdomain=movies, and domain=entertainment.com, the subdomain value is: movies.entertainment.com", "value": "", "fieldType": "TEXT", "validations": { "required": true, "readonly": false, "minLength": "1", "maxLength": "255", "expression": "^([^\\W|http(s?)://][a-zA-Z]+)(\\.[a-zA-Z]+)*" }, "options": { "suffix": { "text": ".thedomain.com", "inputCode": "" }, "placeholder": "movies.entertainment.com" } } ] } ] }` ## [](#tag/AppResellerOpportunities/operation/applyDiscount)Apply discount Apply a discount to an opportunity. More than one discount (one per call) can be applied to an opportunity. The response is an updated opportunity summary. The discount is applied to all eligible products. However, redemption limits apply. When the redemption limits exceed the contents of the opportunity, the discount is not applied. Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ##### Request Body schema: application/jsonrequired The discount to be applied | | | | ------------ | ---------------------------------------------------------------------------------------- | | discountCode | stringThe discount code can be a combination of letters, numbers, and special characters | | itemIds | Array of stringsThe opportunity's item IDs to which the discount is applied or removed | ### Responses **200** The discount was applied and the request returned an updated opportunity summary **400** Either the discount code is invalid or one of the required parameters is missing or invalid **401** Unauthorized **403** The user does not have access to the opportunity or have the permission to execute the action, or the opportunity status does not allow the action **404** Invalid opportunity ID **409** The discount could not be applied because the redemption limits have exceeded **410** The discount has expired post/assistedSales/v2/opportunities/{opportunityId}/applyDiscount https\://marketplace.appdirect.com/api/assistedSales/v2/opportunities/{opportunityId}/applyDiscount https\://virtserver.swaggerhub.com/assistedSales/v2/opportunities/{opportunityId}/applyDiscount ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "discountCode": "10%OFF", "itemIds": [ "166e0ce6-4309-4a16-ac9b-61bea7ce1cbc", "fa776d2e-cda5-4256-9a27-125a0fe3f448" ] }` ### Response samples * 200 * 400 * 401 * 403 * 404 * 409 * 410 Content type application/json Copy Expand all Collapse all `{ "amountDueBeforeTax": "-8.0000000000", "taxSummary": [ ], "amountDueAfterTax": "-8.0000000000", "items": [ { "id": "ea1e0548-888b-402a-8cbc-1e3c6754a2bd", "discount": { "description": "10% off, applicable to all products", "code": "DISCOUNT_ABC" }, "product": { "id": "fa776d2e-cda5-4256-9a27-125a0fe3f448", "name": "Supported Product for Opportunity MVP", "type": "WEB_APP_STACKED", "isAddon": false, "hasAddons": false }, "pricingPlan": { "id": "19c06143-b21c-43c4-b236-eeca61512753", "name": "Gold plan", "editionCode": "1" }, "pricing": [ { "costType": "RECURRING_FLAT", "description": "Gold plan", "quantity": "1.0000000000", "totalSalePrice": "12.0000000000" }, { "costType": "INCLUDED", "description": "INCLUDED", "quantity": "1.0000000000", "totalSalePrice": "0.0000000000" }, { "costType": "DISCOUNT_FLAT", "description": "10% off, applicable to all products", "quantity": "1.0000000000", "totalSalePrice": "-20.0000000000" } ], "unitDefinitions": [ { "unit": "USER", "minimum": "1.0000000000", "meteredUsage": false, "allowDecimals": false, "readOnly": true, "pricePerIncrement": false } ] } ], "recurringTotals": [ { "billingCycle": { "period": "MONTHLY", "dayOfMonth": 10 }, "totalSalePrice": "-8.0000000000" } ] }` ## [](#tag/AppResellerOpportunities/operation/removeDiscount)Remove discount Remove a discount from an opportunity. The response is an updated opportunity summary. Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allow access as Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ##### Request Body schema: application/jsonrequired The discount to be removed | | | | ------------ | ---------------------------------------------------------------------------------------- | | discountCode | stringThe discount code can be a combination of letters, numbers, and special characters | | itemIds | Array of stringsThe opportunity's item IDs to which the discount is applied or removed | ### Responses **200** The discount was removed and the request returned an updated opportunity summary **400** Either the discount code is invalid or one of the required parameters is missing or invalid **401** Unauthorized **403** The user does not have access to the opportunity or have the permission to execute the action, or the opportunity status does not allow the action **404** Invalid opportunity ID post/assistedSales/v2/opportunities/{opportunityId}/deleteDiscount https\://marketplace.appdirect.com/api/assistedSales/v2/opportunities/{opportunityId}/deleteDiscount https\://virtserver.swaggerhub.com/assistedSales/v2/opportunities/{opportunityId}/deleteDiscount ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "discountCode": "10%OFF", "itemIds": [ "166e0ce6-4309-4a16-ac9b-61bea7ce1cbc", "fa776d2e-cda5-4256-9a27-125a0fe3f448" ] }` ### Response samples * 200 * 400 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `{ "amountDueBeforeTax": "11.0000000000", "taxSummary": [ { "description": "Flat Tax", "taxAmount": "2.0000000000" } ], "amountDueAfterTax": "13.0000000000", "items": [ { "id": "c57331b7-0820-44ac-ad75-ee4ab2783b7c", "product": { "id": "fa776d2e-cda5-4256-9a27-125a0fe3f448", "name": "Supported Product for Opportunity MVP", "type": "WEB_APP_STACKED", "isAddon": false, "hasAddons": false }, "pricingPlan": { "id": "7e1fd1fa-de0e-49e9-9e6a-9c474c57f22d", "name": "Tiered monthly+yearly flat with included YEARLY", "editionCode": "Tiered monthly+yearly flat with included" }, "pricing": [ { "costType": "RECURRING_FLAT", "description": "Tiered monthly+yearly flat with included", "quantity": "1.0000000000", "totalSalePrice": "240.0000000000" }, { "costType": "INCLUDED", "description": "INCLUDED", "quantity": "1.0000000000", "totalSalePrice": "0.0000000000" } ], "contractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "YEARLY", "unitTerms": { }, "blockContractUpgrades": true, "blockContractDowngrades": true, "blockSwitchToShorterContract": true, "keepContractDateOnPlanChange": true }, "unitDefinitions": [ { "unit": "USER", "minimum": "1.0000000000", "meteredUsage": false, "allowDecimals": false, "readOnly": true, "pricePerIncrement": false } ] } ], "recurringTotals": [ { "billingCycle": { "period": "YEARLY", "dayOfMonth": 17 }, "totalSalePrice": "240.0000000000" } ] }` ## [](#tag/AppResellerOpportunities/operation/updateRequiredFieldsOnItems)Update required fields Update required fields for all products from the same vendor on an opportunity, with identical required field values. When a vendor requires the same required fields for all products (also known as vendor 'cart level' required fields), the required field values must be identical for all the vendor's products on an opportunity. To ensure all values remain identical, always include the itemIds for all the vendor's products on the opportunity in the array, even if required field values are already saved for some items. Warning: Previously saved required field values for the items in the array will be removed. Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ##### Request Body schema: application/jsonrequired Required fields update request with the item IDs to be updated and required field values. Required. | | | | ---------------------- | ----------------------------------------------------------------------------------------------------------- | | itemIdsrequired | Array of stringsIDs of the items to be updated | | requiredFieldsrequired | object (CustomAttribute)Custom attributes as key-value pairs. Values must be a string array | ### Responses **200** Required fields updated successfully **400** Missing or invalid data, or one or more items not found **401** Unauthorized **403** The user does not have access to the opportunity, or the user does not have permission to execute the action, or the opportunity status does not allow the action **404** Invalid opportunity ID put/assistedSales/v1/opportunities/{opportunityId}/items/requiredFields https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/items/requiredFields https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/items/requiredFields ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "itemIds": [ "a11b60a8-a16a-4aaf-8696-dadb738496fa", "eb690c8d-1c57-497c-82bf-a4194362d954" ], "requiredFields": { "SubDomain": [ "acme.entertainment.com" ], "UserPrincipleName": [ "john.smith" ], "AlternateEmail": [ "secondary@acme.com" ], "FirstName": [ "John" ], "LastName": [ "Smith" ], "BusinessName": [ "Acme Corp" ], "Address/ISO3Country": [ "USA" ], "Address/Line1": [ "Main Street 465" ], "Address/Line2": [ "" ], "Address/City": [ "Greenbow" ], "Address/State": [ "AL" ], "Address/PostalCode": [ "50505" ], "Address/PhoneNumber": [ "5417543010" ], "ConsentUser/FirstName": [ "John" ], "ConsentUser/LastName": [ "Smith" ], "ConsentUser/Email": [ "john.smith@acme.com" ], "ConsentUser/PhoneNumber": [ "5417543010" ], "DateConsentConfirmed": [ "2021-06-02T00:00:00Z" ] } }` ### Response samples * 200 * 400 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `[ { "id": "a11b60a8-a16a-4aaf-8696-dadb738496fa", "pricingPlanId": "a22c03e9-9e27-4e85-8433-78f246345685", "units": [ { "quantity": "8", "unit": "USER" } ], "vendorRequiredFields": { "SubDomain": [ "acme.entertainment.com" ], "UserPrincipleName": [ "john.smith" ], "AlternateEmail": [ "secondary@acme.com" ], "FirstName": [ "John" ], "LastName": [ "Smith" ], "BusinessName": [ "Acme Corp" ], "Address/ISO3Country": [ "USA" ], "Address/Line1": [ "Main Street 465" ], "Address/Line2": [ "" ], "Address/City": [ "Greenbow" ], "Address/State": [ "AL" ], "Address/PostalCode": [ "50505" ], "Address/PhoneNumber": [ "5417543010" ], "ConsentUser/FirstName": [ "John" ], "ConsentUser/LastName": [ "Smith" ], "ConsentUser/Email": [ "john.smith@acme.com" ], "ConsentUser/PhoneNumber": [ "5417543010" ], "DateConsentConfirmed": [ "2021-06-02T00:00:00Z" ] } }, { "id": "eb690c8d-1c57-497c-82bf-a4194362d954", "pricingPlanId": "4bc864b5-f63f-4933-be19-3700aa9a8cc4", "units": [ { "quantity": "8", "unit": "USER" } ], "vendorRequiredFields": { "SubDomain": [ "acme.entertainment.com" ], "UserPrincipleName": [ "john.smith" ], "AlternateEmail": [ "secondary@acme.com" ], "FirstName": [ "John" ], "LastName": [ "Smith" ], "BusinessName": [ "Acme Corp" ], "Address/ISO3Country": [ "USA" ], "Address/Line1": [ "Main Street 465" ], "Address/Line2": [ "" ], "Address/City": [ "Greenbow" ], "Address/State": [ "AL" ], "Address/PostalCode": [ "50505" ], "Address/PhoneNumber": [ "5417543010" ], "ConsentUser/FirstName": [ "John" ], "ConsentUser/LastName": [ "Smith" ], "ConsentUser/Email": [ "john.smith@acme.com" ], "ConsentUser/PhoneNumber": [ "5417543010" ], "DateConsentConfirmed": [ "2021-06-02T00:00:00Z" ] } } ]` ## [](#tag/AppResellerOpportunities/operation/getShippingAddress)Get shipping address Retrieve the shipping address for the opportunity Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity * `ROLE_PARTNER_READ` - Allows read access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ### Responses **200** Shipping address retrieved successfully **401** Unauthorized **403** The user does not have access to the opportunity, or the user does not have permission to execute the action, or the opportunity status does not allow the action **404** Invalid opportunity ID get/assistedSales/v1/opportunities/{opportunityId}/shipping https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/shipping https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/shipping ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/assistedSales/v1/opportunities/%7BopportunityId%7D/shipping ``` ### Response samples * 200 * 401 * 403 * 404 Content type application/json Copy Expand all Collapse all `{ "sameAsBillingAddress": false, "deliveryAddress": { "name": "John Smith", "city": "Greenbow", "addressLine1": "Main Street 446", "countryCode": "US", "subdivisionCode": "AL", "postalCode": "50505" } }` ## [](#tag/AppResellerOpportunities/operation/createOrUpdateShippingAddress)Create or replace shipping address Create or replace a shipping address for physical goods that require one on an opportunity. There is one shipping address per opportunity. Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ##### Request Body schema: application/jsonrequired The shipping address information | | | | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | sameAsBillingAddress | booleanWhether customer requests to use billing address as shipping address. WARNING: Does not manage addresses; does not change shipping address to billing address, nor update shipping address if billing address changes. | | deliveryAddress | object (DeliveryAddress)The shipping address | ### Responses **200** Shipping address created or replaced successfully **400** Missing or invalid required parameter, or the vendor does not ship to the provided address **401** Unauthorized **404** No opportunity found with the given ID **409** Conflict post/assistedSales/v1/opportunities/{opportunityId}/shipping https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/shipping https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/shipping ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "sameAsBillingAddress": false, "deliveryAddress": { "name": "John Smith", "city": "Greenbow", "addressLine1": "Main Street 446", "countryCode": "US", "subdivisionCode": "AL", "postalCode": "50505" } }` ### Response samples * 200 * 400 * 401 * 404 * 409 Content type application/json Copy Expand all Collapse all `{ "sameAsBillingAddress": false, "deliveryAddress": { "name": "John Smith", "city": "Greenbow", "addressLine1": "Main Street 446", "countryCode": "US", "subdivisionCode": "AL", "postalCode": "50505" } }` ## [](#tag/AppResellerOpportunities/operation/cloneOpportunity)Clone opportunity Clone an existing opportunity Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity * `ROLE_PARTNER` - Allows access as a Partner to the opportunity ##### path Parameters | | | | --------------------- | -------------------- | | opportunityIdrequired | stringOpportunity ID | ##### Request Body schema: application/jsonrequired Parameters to be used when cloning the opportunity | | | | ------------------------- | ----------------------------------------------------------- | | namerequired | stringThe name of the opportunity | | customerCompanyIdrequired | stringThe company ID of the customer | | customerIdrequired | stringThe user ID of the customer | | ownerCompanyIdrequired | stringThe company ID of the sales agent | | ownerIdrequired | stringThe user ID of the sales agent | | createdByCompanyId | stringThe user's company ID that's creating the opportunity | | createdById | stringThe user's ID that's creating the opportunity | ### Responses **202** The response includes the new opportunity ID in the Location header in the following path: /api/assistedSales/v1/opportunities/{opportunityId}. The path contained in the location header is used by the client to fetch the opportunity. **400** Missing or invalid required parameter **401** Unauthorized **403** The user does not have access to the opportunity, or the user does not have permission to execute the action **404** Either the opportunity ID is invalid, or the customer or owner cannot be found. post/assistedSales/v1/opportunities/{opportunityId}/clone https\://marketplace.appdirect.com/api/assistedSales/v1/opportunities/{opportunityId}/clone https\://virtserver.swaggerhub.com/assistedSales/v1/opportunities/{opportunityId}/clone ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "name": "Opportunity name - COPY", "customerCompanyId": "498c62ea-ad14-48e6-96ce-5400c617444c", "customerId": "505f0a0c-57a7-4d9e-9fac-66bbf557ac4d", "ownerCompanyId": "6a62244e-aa2f-461b-8c7a-3a0e091be9d3", "ownerId": "d781ac09-b4fe-4d57-8ba2-4640fc5b7c49", "createdByCompanyId": "b7e0c48b-6d0d-45fc-9c8a-3fa3fd84d9f1", "createdById": "8f6b3d29-4169-4fb0-91ff-bad9b7a3d0d4" }` ### Response samples * 202 * 400 * 401 * 403 * 404 Content type application/json Copy `{ "opportunityId": "498c62ea-ad14-48e6-96ce-5400c617444c" }` # [](#tag/PaymentInstrument)Payment Instruments ## [](#tag/PaymentInstrument/operation/resource_Other_readUserPaymentInstruments_GET)List all payment instruments for a user List all of the payment instruments for the given user ##### path Parameters | | | | ----------------- | ------------------------- | | companyIdrequired | stringUser's company UUID | | userIdrequired | stringUser UUID | ### Responses **200** OK **404** Not Found get/billing/v1/companies/{companyId}/users/{userId}/paymentInstruments https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/paymentInstruments https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/paymentInstruments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/billing/v1/companies/%7BcompanyId%7D/users/%7BuserId%7D/paymentInstruments ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PaymentInstrument/operation/resource_Other_createPaymentInstrument_POST)Create a payment instrument Create a payment instrument for the given user and company using the provided data ##### path Parameters | | | | ----------------- | ------------------------- | | companyIdrequired | stringUser's company UUID | | userIdrequired | stringUser UUID | ##### Request Body schema:application/xmlapplication/xml Payment instrument data object | | | | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | accountDisplay | string\[ 0 .. 255 ] charactersAccount display text. | | billingAddress | object (BillingAddressWS) | | company | object or null (LinkWS) | | createdOn | numberPayment instrument creation date. | | creditCard | object (CreditCard) | | id | stringID | | isDefault | booleanTrue if this payment instrument is the default. | | paymentMethod | string (PaymentMethod)Enum: "CREDIT\_CARD" "PAYPAL" "MANUAL" "EXTERNAL\_INVOICE" "MARKETPLACE\_CREDITS"The supported payment methods | | user | object or null (LinkWS) | | vatId | stringVAT ID. | ### Responses **201** Created **400** Bad Request **404** Not Found **409** Conflict post/billing/v1/companies/{companyId}/users/{userId}/paymentInstruments https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/paymentInstruments https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/paymentInstruments ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 201 Content type application/xmlapplication/xml No sample ## [](#tag/PaymentInstrument/operation/resource_Other_updatePaymentInstrument_PUT)Update a payment instrument Update the payment instrument for the given user and company using the provided data ##### path Parameters | | | | --------------------------- | -------------------------------------- | | companyIdrequired | stringUser's company UUID | | paymentInstrumentIdrequired | stringExisting payment instrument UUID | | userIdrequired | stringUser UUID | ##### Request Body schema:application/xmlapplication/xml Payment instrument data object | | | | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | accountDisplay | string\[ 0 .. 255 ] charactersAccount display text. | | billingAddress | object (BillingAddressWS) | | company | object or null (LinkWS) | | createdOn | numberPayment instrument creation date. | | creditCard | object (CreditCard) | | id | stringID | | isDefault | booleanTrue if this payment instrument is the default. | | paymentMethod | string (PaymentMethod)Enum: "CREDIT\_CARD" "PAYPAL" "MANUAL" "EXTERNAL\_INVOICE" "MARKETPLACE\_CREDITS"The supported payment methods | | user | object or null (LinkWS) | | vatId | stringVAT ID. | ### Responses **200** OK **400** Bad Request **404** Not Found **409** Conflict put/billing/v1/companies/{companyId}/users/{userId}/paymentInstruments/{paymentInstrumentId} https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/paymentInstruments/{paymentInstrumentId} https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/paymentInstruments/{paymentInstrumentId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PaymentInstrument/operation/resource_Other_readDefaultPaymentInstrument_GET)Retrieve the default payment instrument Retrieve the default payment instrument for a given user and company ##### query Parameters | | | | ----------- | ------------------------- | | companyUuid | stringUser's company UUID | | userUuid | stringUser's UUID | ### Responses **200** OK **404** Not Found get/billing/v1/paymentInstruments/default https\://marketplace.appdirect.com/api/billing/v1/paymentInstruments/default https\://virtserver.swaggerhub.com/billing/v1/paymentInstruments/default ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/paymentInstruments/default?companyUuid=SOME_STRING_VALUE&userUuid=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "ce6266c9-7939-42ee-8cdb-a7a2bc240be4", "company": { "id": "81ae9b52-f6d6-446e-a1b7-7107998cb4e0", "href": "http://appdirect/api/account/v1/companies/81ae9b52-f6d6-446e-a1b7-7107998cb4e0" }, "user": { "id": "b665be4f-42a8-47d8-bebc-8e2387fb86d8", "href": "http://appdirect/api/account/v1/users/b665be4f-42a8-47d8-bebc-8e2387fb86d8" }, "accountDisplay": "1111", "paymentMethod": "CREDIT_CARD", "billingAddress": { "street1": "50 Grove St.", "street2": "500 Grove St.", "city": "Somerville", "state": "Massachusetts", "zip": "02114", "country": "US", "firstName": "John", "lastName": "Doe", "companyName": "AppDirect", "phone": "9999999999" }, "creditCard": { "number": "333", "securityCode": "333", "name": "John Doe", "expirationMonth": 12, "expirationYear": 2016, "type": "VISA" }, "createdOn": 1481065767448, "default": false }` ## [](#tag/PaymentInstrument/operation/resource_Other_readPaymentInstrument_GET)Retrieve a payment instrument ##### path Parameters | | | | --------------------------- | --------------------------- | | paymentInstrumentIdrequired | stringPayment Instrument Id | ### Responses **200** OK **404** Not Found get/billing/v1/paymentInstruments/{paymentInstrumentId} https\://marketplace.appdirect.com/api/billing/v1/paymentInstruments/{paymentInstrumentId} https\://virtserver.swaggerhub.com/billing/v1/paymentInstruments/{paymentInstrumentId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/billing/v1/paymentInstruments/%7BpaymentInstrumentId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PaymentInstrument/operation/resource_Other_deletePaymentInstrument_DELETE)Delete a payment instrument Delete a payment instrument ##### path Parameters | | | | --------------------------- | --------------------------- | | paymentInstrumentIdrequired | stringPayment Instrument Id | ### Responses **204** No Content **404** Not Found delete/billing/v1/paymentInstruments/{paymentInstrumentId} https\://marketplace.appdirect.com/api/billing/v1/paymentInstruments/{paymentInstrumentId} https\://virtserver.swaggerhub.com/billing/v1/paymentInstruments/{paymentInstrumentId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/billing/v1/paymentInstruments/%7BpaymentInstrumentId%7D ``` # [](#tag/Payment-Methods)Payment Methods ## [](#tag/Payment-Methods/operation/createPaymentMethodToken)Tokenize payment methods Calls the payment gateway to validate the payment method, which is not yet associated with a user. A front-end should call this endpoint directly, not a back-end. Requires a public developer key (use the AD-Public-Developer-Key header), which you must obtain from AppDirect. ##### header Parameters | | | | ------------------------------- | ------ | | AD-Public-Developer-Keyrequired | string | ##### Request Body schema: application/jsonrequired The payment method to tokenize | | | | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | paymentMethodTyperequired | stringThe type of payment method, such as CARD, BANKACCOUNT, and so on. | | propertiesrequired | objectThe properties of the payment method, as listed in [getPaymentMethodTypes](#returns-all-supported-payment-method-types) | | billingAddressrequired | object (BillingAddress)Billing address | ### Responses **200** OK **400** Bad Request **401** Unauthorized **500** Internal Server Error **502** Bad Gateway **504** Gateway Timeout post/appMarket/v2/paymentMethodTokens https\://marketplace.appdirect.com/api/appMarket/v2/paymentMethodTokens https\://virtserver.swaggerhub.com/appMarket/v2/paymentMethodTokens ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "paymentMethodType": "CARD", "properties": { "number": "4111111111111111", "cardHolderName": "John Smith", "expirationMonth": "5", "expirationYear": "2019", "brand": "VISA", "securityCode": "123" }, "billingAddress": { "street1": "279 Prince St", "city": "Montreal", "state": "Quebec", "country": "CA", "zip": "H3C 2N4" } }` ### Response samples * 200 * 400 * 500 * 502 * 504 Content type application/json Copy Expand all Collapse all `{ "id": "pm_0838a859-dfa6-4863-aa38-042d50a9e69a", "expiration": "2018-04-112T19:15:00Z", "paymentMethod": { "accountDisplay": "1111", "paymentMethodType": "CARD", "properties": { "cardHolderName": "John Smith", "expirationMonth": "5", "expirationYear": "2019", "brand": "VISA" }, "billingAddress": { "street1": "279 Prince St", "city": "Montreal", "state": "Quebec", "country": "CA", "zip": "H3C 2N4" } } }` ## [](#tag/Payment-Methods/operation/getPaymentMethods)List payment methods for a user Returns all available payment methods for the specified user in the specified company. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER` - Allows access to read all marketplace data. ##### query Parameters | | | | ----------------- | -------------------------------------------------------------- | | ownerIdrequired | stringID of the user whose payment method you want to retrieve | | companyIdrequired | stringID of the company of which the user is a member | ### Responses **200** OK **401** Unauthorized **500** Internal Server Error get/appMarket/v2/paymentMethods https\://marketplace.appdirect.com/api/appMarket/v2/paymentMethods https\://virtserver.swaggerhub.com/appMarket/v2/paymentMethods ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appMarket/v2/paymentMethods?ownerId=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE' ``` ### Response samples * 200 * 500 Content type application/json Copy Expand all Collapse all `[ { "id": "e35c2f85-ef92-4a8f-89f0-45b62fb95fa7", "default": false, "accountDisplay": "1111", "paymentMethodType": "CARD", "properties": { "cardHolderName": "John Smith", "expirationMonth": "5", "expirationYear": "2019", "brand": "VISA" }, "billingAddress": { "street1": "279 Prince St", "city": "Montreal", "state": "Quebec", "country": "CA", "zip": "H3C 2N4" } }, { "id": "e35c2f85-ef92-4a8f-89f0-45b62fb95fa7", "default": false, "accountDisplay": "11111111", "paymentMethodType": "BANKACCOUNT", "properties": { "accountNumber": "11111111", "routingNumber": "123456789", "accountType": "CHECKING", "isCorporateAccount": "false", "firstName": "John", "lastname": "Smith" }, "billingAddress": { "street1": "279 Prince St", "city": "Montreal", "state": "Quebec", "country": "CA", "zip": "H3C 2N4" } }, { "id": "e35c2f85-ef92-4a8f-89f0-45b62fb95fa7", "default": false, "accountDisplay": "5555555555", "paymentMethodType": "MYRANDOMTYPE", "properties": { "msisdn": "5555555555" }, "billingAddress": { "street1": "279 Prince St", "city": "Montreal", "state": "Quebec", "country": "CA", "zip": "H3C 2N4" } } ]` ## [](#tag/Payment-Methods/operation/createPaymentMethod)Create payment methods using a token OR by providing all of the payment method data When using a token, the validated payment method is assigned to the current user on the current marketplace. When providing all of the payment method data, the payment gateway is called, and the payment method is validated and assigned to the user. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER` - Allows access to create a payment method with a token. * `ROLE_USER` - Allows access to create a payment method with a full payload. ##### Request Body schema: application/jsonrequired | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ownerIdrequired | string\[ 0 .. 255 ] charactersThe ID of the user who owns the payment method. | | companyIdrequired | string\[ 0 .. 255 ] charactersThe ID of the company in which to create the payment method. | | token | string\[ 0 .. 255 ] charactersToken of the payment method, as returned by createPaymentMethodToken. Required when creating a payment method from a token, not applicable when creating it from payment method data. | | paymentMethodType | stringThe type of payment method, such as CARD, BANKACCOUNT, and so on. Required when creating a payment method from payment method data, not applicable when creating it from token. | | properties | objectThe properties of the payment method, as listed in [getPaymentMethodTypes](#returns-all-supported-payment-method-types) Required when creating a payment method from payment method data, not applicable when creating it from token. | | billingAddress | object (BillingAddress)Billing address | ### Responses **200** OK **400** Bad Request **401** Unauthorized **500** Internal Server Error **502** Bad Gateway **504** Gateway Timeout post/appMarket/v2/paymentMethods https\://marketplace.appdirect.com/api/appMarket/v2/paymentMethods https\://virtserver.swaggerhub.com/appMarket/v2/paymentMethods ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "ownerId": "40e8af95-4caf-415a-96d9-7b023207b535", "companyId": "9c130291-cf29-4272-8005-a280b1e81388", "token": "pm_0838a859-dfa6-4863-aa38-042d50a9e69a" }` ### Response samples * 200 * 400 * 500 * 502 * 504 Content type application/json Copy Expand all Collapse all `{ "id": "e35c2f85-ef92-4a8f-89f0-45b62fb95fa7", "accountDisplay": "1111", "default": true, "paymentMethodType": "CARD", "properties": { "cardHolderName": "John Smith", "expirationMonth": "5", "expirationYear": "2019", "brand": "VISA" }, "billingAddress": { "street1": "279 Prince St", "city": "Montreal", "state": "Quebec", "country": "CA", "zip": "H3C 2N4" } }` ## [](#tag/Payment-Methods/operation/deletePaymentMethod)Delete payment methods The payment method is deleted from the system and cannot be used anymore. ##### path Parameters | | | | ----------------------- | --------------------------- | | paymentMethodIdrequired | stringThe Payment Method ID | ### Responses **204** No Content **401** Unauthorized **500** Internal Server Error **502** Bad Gateway **504** Gateway Timeout delete/appMarket/v2/paymentMethods/{paymentMethodId} https\://marketplace.appdirect.com/api/appMarket/v2/paymentMethods/{paymentMethodId} https\://virtserver.swaggerhub.com/appMarket/v2/paymentMethods/{paymentMethodId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/appMarket/v2/paymentMethods/%7BpaymentMethodId%7D ``` ### Response samples * 500 * 502 * 504 Content type application/json Copy `{ "status": 500, "code": "INTERNAL_SERVER_ERROR" }` ## [](#tag/Payment-Methods/operation/getDefaultPaymentMethods)List default payment methods Returns the default payment methods for the specified user in the specified company ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access to get default payment method(s). ##### query Parameters | | | | ----------------- | ---------------------------------------------------------------------- | | ownerIdrequired | stringID of the user whose default payment method you want to retrieve | | companyIdrequired | stringID of the company of which the user is a member | ### Responses **200** OK **401** Unauthorized **500** Internal Server Error **502** Bad Gateway **504** Gateway Timeout get/appMarket/v2/paymentMethods/defaults https\://marketplace.appdirect.com/api/appMarket/v2/paymentMethods/defaults https\://virtserver.swaggerhub.com/appMarket/v2/paymentMethods/defaults ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appMarket/v2/paymentMethods/defaults?ownerId=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE' ``` ### Response samples * 200 * 500 * 502 * 504 Content type application/json Copy Expand all Collapse all `[ { "paymentMethodId": "e35c2f85-ef92-4a8f-89f0-45b62fb95fa7" } ]` ## [](#tag/Payment-Methods/operation/setDefaultPaymentMethod)Set default payment methods Sets a default payment method for the specified user ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access to set default payment method(s). ##### Request Body schema: application/jsonrequired | | | | ----------------------- | ------------------------------------------------------------------------------------------------ | | ownerIdrequired | string\[ 0 .. 255 ] charactersID of the user who owns the default payment method | | companyIdrequired | string\[ 0 .. 255 ] charactersID of the company of which the user is a member | | paymentMethodIdrequired | string\[ 0 .. 255 ] charactersID of the default payment method | ### Responses **200** OK **400** Bad Request **401** Unauthorized **500** Internal Server Error **502** Bad Gateway **504** Gateway Timeout post/appMarket/v2/paymentMethods/defaults https\://marketplace.appdirect.com/api/appMarket/v2/paymentMethods/defaults https\://virtserver.swaggerhub.com/appMarket/v2/paymentMethods/defaults ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "ownerId": "40e8af95-4caf-415a-96d9-7b023207b535", "companyId": "9c130291-cf29-4272-8005-a280b1e81388", "paymentMethodId": "e35c2f85-ef92-4a8f-89f0-45b62fb95fa7" }` ### Response samples * 200 * 400 * 500 * 502 * 504 Content type application/json Copy Expand all Collapse all `[ { "paymentMethodId": "e35c2f85-ef92-4a8f-89f0-45b62fb95fa7" } ]` ## [](#tag/Payment-Methods/operation/getPaymentMethodTypes)Returns all supported Payment Method Types Returns all supported Payment Method Types. These are the only types of payment method that can be created. ### Responses **200** OK **401** Unauthorized **500** Internal Server Error **502** Bad Gateway **504** Gateway Timeout get/appMarket/v2/paymentMethodTypes https\://marketplace.appdirect.com/api/appMarket/v2/paymentMethodTypes https\://virtserver.swaggerhub.com/appMarket/v2/paymentMethodTypes ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/appMarket/v2/paymentMethodTypes ``` ### Response samples * 200 * 500 * 502 * 504 Content type application/json Copy Expand all Collapse all `[ { "paymentMethodType": "CARD", "addressNeeded": true, "propertyDefinitions": [ { "name": "cardHolderName", "type": "string", "minLength": 0, "maxLength": 255 }, { "name": "number", "type": "string", "minLength": 0, "maxLength": 255 }, { "name": "securityCode", "type": "string", "minLength": 0, "maxLength": 4, "secret": true }, { "name": "expirationMonth", "type": "number", "minLength": 1, "maxLength": 2 }, { "name": "expirationYear", "type": "number", "minLength": 2, "maxLength": 4 }, { "name": "brand", "type": "string", "readOnly": true, "minLength": 0, "maxLength": 255, "possibleValues": [ "VISA", "MASTERCARD", "AMEX", "DINERS_CLUB", "DISCOVER", "JCB", "UNKNOWN", "GATEWAY" ] } ] }, { "paymentMethodType": "BANKACCOUNT", "addressNeeded": true, "propertyDefinitions": [ { "name": "routingNumber", "type": "string", "minLength": 9, "maxLength": 9, "required": true }, { "name": "accountNumber", "type": "string", "minLength": 4, "maxLength": 17, "required": true }, { "name": "accountType", "type": "string", "required": true, "possibleValues": [ "CHECKING", "SAVINGS", "CORPORATE_CHECKING", "CORPORATE_SAVINGS" ] }, { "name": "isCorporateAccount", "type": "boolean", "required": true }, { "name": "companyName", "type": "string", "minLength": 0, "maxLength": 255, "required": false }, { "name": "firstName", "type": "string", "maxLength": 255, "required": true }, { "name": "lastName", "type": "string", "maxLength": 255, "required": true } ] } ]` # [](#tag/AppResellerPaymentMethod)Payment Methods (Reseller) ## [](#tag/AppResellerPaymentMethod/operation/resource_AppResellerV1PaymentMethodApi_POST)Create payment method Creates a payment method on behalf of the specified user ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support Representative. ##### Request Body schema: application/json Information about the user and the new payment method | | | | ------------------------- | ---------------------------------------------------------------------- | | ownerIdrequired | stringID of the user for whom to create the payment method | | companyIdrequired | stringID of the user's company | | paymentMethodTyperequired | stringPayment method types supported by AppReseller | | properties | objectList of payment method properties. Varies by payment method type | | billingAddressrequired | object (BillingAddress)Billing address | ### Responses **200** Success **401** Unauthorized post/appReseller/v1/paymentMethods https\://marketplace.appdirect.com/api/appReseller/v1/paymentMethods https\://virtserver.swaggerhub.com/appReseller/v1/paymentMethods ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "ownerId": "833d4c99-1939-0000-0000-6fb7ae30000", "companyId": "6b4bd452-895d-0000-0000-e6046b230000", "paymentMethodType": "CARD", "properties": { "cardHolderName": "John Jordan", "number": "0000-0000-0000-0000", "securityCode": "000", "expirationMonth": "10", "expirationYear": "2100", "brand": "VISA" }, "billingAddress": { "street1": "Alden", "city": "Beverly Hills", "country": "US", "zip": "94203", "state": "CA" } }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "5d399e4a-cae3-0000-0000-85be1db90000", "accountDisplay": "1111", "paymentMethodType": "CARD", "properties": { "expirationYear": "2100", "cardHolderName": "John Jordan", "expirationMonth": "10", "brand": "VISA" }, "billingAddress": { "street1": "Alden", "city": "Beverly Hills", "country": "US", "zip": "94203", "state": "CA" }, "owner": { "id": "833d4c99-1939-0000-0000-6fb7ae30000", "firstName": "John", "lastName": "Jordan" }, "default": true }` ## [](#tag/AppResellerPaymentMethod/operation/resource_AppResellerV1PaymentMethodsApi_GET)List payment methods Retrieves a list of the specified user's payment methods ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support Representative. ##### query Parameters | | | | ----------------- | ----------------------------------------------------------- | | ownerIdrequired | stringUser ID | | companyIdrequired | stringCompany ID | | number | integerPage number starting at 1. The default value is 1. | | size | integerNumber of results per page. The default value is 50. | | paymentMethodType | stringPayment method type | ### Responses **200** Success **401** Unauthorized get/appReseller/v1/paymentMethods https\://marketplace.appdirect.com/api/appReseller/v1/paymentMethods https\://virtserver.swaggerhub.com/appReseller/v1/paymentMethods ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/paymentMethods?ownerId=SOME_STRING_VALUE&companyId=SOME_STRING_VALUE&number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&paymentMethodType=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "5d399e4a-cae3-0000-0000-85be1db90000", "accountDisplay": "1111", "paymentMethodType": "CARD", "properties": { "expirationYear": "2100", "cardHolderName": "John Jordan", "expirationMonth": "10", "brand": "VISA" }, "billingAddress": { "street1": "Alden", "city": "Beverly Hills", "country": "US", "zip": "94203", "state": "CA" }, "owner": { "id": "833d4c99-1939-0000-0000-6fb7ae30000", "firstName": "John", "lastName": "Jordan" }, "default": true } ], "page": { "size": 1, "totalElements": 1, "totalPages": 1, "number": 0 } }` ## [](#tag/AppResellerPaymentMethod/operation/resource_AppResellerV1PaymentMethodApi_GET)Remove payment methods Deletes a user's payment methods ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support Representative. ##### path Parameters | | | | ----------------------- | ----------------------- | | paymentMethodIdrequired | stringPayment method ID | ### Responses **204** No Content delete/appReseller/v1/paymentMethods/{paymentMethodId} https\://marketplace.appdirect.com/api/appReseller/v1/paymentMethods/{paymentMethodId} https\://virtserver.swaggerhub.com/appReseller/v1/paymentMethods/{paymentMethodId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/appReseller/v1/paymentMethods/%7BpaymentMethodId%7D ``` # [](#tag/PaymentPlan)Payment Plans ## [](#tag/PaymentPlan/operation/resource_Payment_Plan_readPaymentPlans_GET)List payment plans List payment plans for a given product edition ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | editionIdrequired | numberEdition id | ### Responses **200** Payment plans read. **404** Application or edition not found. get/marketplace/v1/products/{applicationId}/editions/{editionId}/paymentPlans https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/editions/{editionId}/paymentPlans https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/editions/{editionId}/paymentPlans ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/editions/%7BeditionId%7D/paymentPlans ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PaymentPlan/operation/resource_Payment_Plan_readPaymentPlanId_GET)Read payment plan by product edition Read payment plan by product edition ##### path Parameters | | | | --------------------- | --------------------- | | applicationIdrequired | numberApplication id | | editionIdrequired | numberEdition id | | paymentPlanIdrequired | numberPayment plan id | ### Responses **200** Payment plan information returned. **404** Application, edition or payment plan not found. get/marketplace/v1/products/{applicationId}/editions/{editionId}/paymentPlans/{paymentPlanId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/editions/{editionId}/paymentPlans/{paymentPlanId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/editions/{editionId}/paymentPlans/{paymentPlanId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/editions/%7BeditionId%7D/paymentPlans/%7BpaymentPlanId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PaymentPlan/operation/resource_Payment_Plan_readPaymentPlan_GET)Read payment plan Read payment plan information ##### path Parameters | | | | --------------------- | --------------------- | | paymentPlanIdrequired | numberPayment plan id | ### Responses **200** Payment plan information returned. **404** Payment plan not found. get/marketplace/v1/paymentPlans/{paymentPlanId} https\://marketplace.appdirect.com/api/marketplace/v1/paymentPlans/{paymentPlanId} https\://virtserver.swaggerhub.com/marketplace/v1/paymentPlans/{paymentPlanId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/paymentPlans/%7BpaymentPlanId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample # [](#tag/Payment)Payments v1 ## [](#tag/Payment/operation/resource_Other_readCompanyPayments_GET)List all payments for a company List all of the payments for the given company ##### path Parameters | | | | ----------------- | ------------------ | | companyIdrequired | stringCompany UUID | ##### query Parameters | | | | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | count | integerDefault:250Number of results to fetch. Used for paging. | | fromDate | numberFrom date | | method | stringEnum: "ADP\_INVOICE" "ARIBAPAY" "BT\_BILL" "CLICKANDBUY" "CLOUDFOUNDRY" "CREDIT\_CARD" "CUMULA\_BILL" "DTAG" "EXTERNAL\_INVOICE" "KREDITKARTE" "LASTSCHRIFT\_MRNEXNET" "MANO\_TEO\_BILL" "MANUAL" "MARKETPLACE\_CREDITS" "NETS\_ARVATO\_INVOICE" "NEXTEL" "PAYPAL" "ROGERS\_CC\_DTMF" "ROGERS\_CC\_POS" "SNAP" "TBILL" "THISTLE" "TOICLEARING"Payment method | | result | stringEnum: "FAILED" "GATEWAY\_NOT\_AVAILABLE" "MANUAL" "SUCCESSFUL"Payment result | | sortField | stringDefault:"PAYMENT\_ID"Enum: "AMOUNT" "DATE" "PAYMENT\_ID"Sort field | | sortOrder | stringDefault:"DESC"Enum: "ASC" "DESC"Sort order | | start | integerDefault:0First result index. Used for paging. | | toDate | numberTo date | ### Responses **200** OK **404** Not Found get/billing/v1/companies/{companyId}/payments https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/payments https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/payments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/companies/%7BcompanyId%7D/payments?count=SOME_INTEGER_VALUE&fromDate=SOME_NUMBER_VALUE&method=SOME_STRING_VALUE&result=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Payment/operation/resource_Other_readUserPayments_GET)List all payments for a user List all of the payments for the given user ##### path Parameters | | | | ----------------- | ------------------ | | companyIdrequired | stringCompany UUID | | userIdrequired | stringUser UUID | ##### query Parameters | | | | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | count | integerDefault:250Number of results to fetch. Used for paging. | | fromDate | numberFrom date | | method | stringEnum: "ADP\_INVOICE" "ARIBAPAY" "BT\_BILL" "CLICKANDBUY" "CLOUDFOUNDRY" "CREDIT\_CARD" "CUMULA\_BILL" "DTAG" "EXTERNAL\_INVOICE" "KREDITKARTE" "LASTSCHRIFT\_MRNEXNET" "MANO\_TEO\_BILL" "MANUAL" "MARKETPLACE\_CREDITS" "NETS\_ARVATO\_INVOICE" "NEXTEL" "PAYPAL" "ROGERS\_CC\_DTMF" "ROGERS\_CC\_POS" "SNAP" "TBILL" "THISTLE" "TOICLEARING"Payment method | | result | stringEnum: "FAILED" "GATEWAY\_NOT\_AVAILABLE" "MANUAL" "SUCCESSFUL"Payment result | | sortField | stringDefault:"PAYMENT\_ID"Enum: "AMOUNT" "DATE" "PAYMENT\_ID"Sort field | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order | | start | integerDefault:0First result index. Used for paging. | | toDate | numberTo date | ### Responses **200** OK **404** Not Found get/billing/v1/companies/{companyId}/users/{userId}/payments https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/payments https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/payments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/companies/%7BcompanyId%7D/users/%7BuserId%7D/payments?count=SOME_INTEGER_VALUE&fromDate=SOME_NUMBER_VALUE&method=SOME_STRING_VALUE&result=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Payment/operation/resource_Other_readPayments_GET)List all payments List all payments matching the input filters ##### query Parameters | | | | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | count | stringDefault:"250"Number of results to fetch. Used for paging. | | fromDate | numberFrom date | | method | stringEnum: "ADP\_INVOICE" "ARIBAPAY" "BT\_BILL" "CLICKANDBUY" "CLOUDFOUNDRY" "CREDIT\_CARD" "CUMULA\_BILL" "DTAG" "EXTERNAL\_INVOICE" "KREDITKARTE" "LASTSCHRIFT\_MRNEXNET" "MANO\_TEO\_BILL" "MANUAL" "MARKETPLACE\_CREDITS" "NETS\_ARVATO\_INVOICE" "NEXTEL" "PAYPAL" "ROGERS\_CC\_DTMF" "ROGERS\_CC\_POS" "SNAP" "TBILL" "THISTLE" "TOICLEARING"Payment method | | result | stringEnum: "FAILED" "GATEWAY\_NOT\_AVAILABLE" "MANUAL" "SUCCESSFUL"Payment result | | sortField | stringDefault:"PAYMENT\_ID"Enum: "AMOUNT" "DATE" "PAYMENT\_ID"Sort field | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order | | start | stringDefault:"0"First result index. Used for paging. | | toDate | numberTo date | ### Responses **200** OK **204** No content get/billing/v1/payments https\://marketplace.appdirect.com/api/billing/v1/payments https\://virtserver.swaggerhub.com/billing/v1/payments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/payments?count=SOME_STRING_VALUE&fromDate=SOME_NUMBER_VALUE&method=SOME_STRING_VALUE&result=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_STRING_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 * 204 Content type application/xmlapplication/xml No sample ## [](#tag/Payment/operation/resource_Other_readPayment_GET)Retrieve a payment Retrieve a payment given its payment number ##### path Parameters | | | | --------------------- | --------------------- | | paymentNumberrequired | integerPayment number | ### Responses **200** OK **404** Not Found get/billing/v1/payments/{paymentNumber} https\://marketplace.appdirect.com/api/billing/v1/payments/{paymentNumber} https\://virtserver.swaggerhub.com/billing/v1/payments/{paymentNumber} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/billing/v1/payments/%7BpaymentNumber%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Payment/operation/resource_Other_readPaymentInvoices_GET)List all payment invoices List all invoices attached to a given payment ##### path Parameters | | | | --------------------- | --------------------- | | paymentNumberrequired | integerPayment number | ##### query Parameters | | | | ----------- | ------------------------------------------------------------------------------------------------------- | | count | stringDefault:"250"Number of results to fetch. Used for paging. | | excludeFree | booleanExclude free invoices | | fromDate | numberFrom date | | sortField | stringDefault:"INVOICE\_ID"Enum: "DATE" "INVOICE\_ID" "TOTAL"Sort field | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order | | start | stringDefault:"0"First result index. Used for paging. | | status | stringEnum: "CARRIED" "PAID" "UNPAID" "VOIDED"Status of the related invoice(s) | | toDate | numberTo date | ### Responses **200** OK **204** No content **404** Not Found get/billing/v1/payments/{paymentNumber}/invoices https\://marketplace.appdirect.com/api/billing/v1/payments/{paymentNumber}/invoices https\://virtserver.swaggerhub.com/billing/v1/payments/{paymentNumber}/invoices ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/payments/%7BpaymentNumber%7D/invoices?count=SOME_STRING_VALUE&excludeFree=SOME_BOOLEAN_VALUE&fromDate=SOME_NUMBER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_STRING_VALUE&status=SOME_STRING_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 * 204 Content type application/xmlapplication/xml No sample # [](#tag/Payments-v2)Payments v2 ## [](#tag/Payments-v2/operation/getTransferPlatformConfigurations)Retrieve all transfer platform configurations Retrieves all transfer platform configurations for the marketplace of the current user ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access to retrieve transfer platform configurations. ### Responses **200** OK **401** Unauthorized **500** Indicates an unknown internal error that prevents the server from processing the request get/api/appMarket/v2/transferPlatformConfigurations https\://marketplace.appdirect.com/api/api/appMarket/v2/transferPlatformConfigurations https\://virtserver.swaggerhub.com/api/appMarket/v2/transferPlatformConfigurations ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/api/appMarket/v2/transferPlatformConfigurations ``` ### Response samples * 200 * 500 Content type application/json Copy Expand all Collapse all `[ { "id": "9dfabd43-a34b-46e1-bc40-7ddd92cc228a", "platformType": "stripe", "parameters": { "base_url": "https://api.stripe.com/testupdate", "username": "secret" } }, { "id": "6ef5eb40-4520-49b6-97f6-d09dfa84e52a", "platformType": "paypal", "parameters": { "base_url": "https://api.paypal.com/testupdate", "username": "secret" } } ]` ## [](#tag/Payments-v2/operation/createTransferPlatformConfiguration)Create transfer platform configurations Create a transfer platform configuration in the marketplace of the current user ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access to create transfer platform configurations. ##### Request Body schema: application/jsonrequired The transfer platform configuration request | | | | -------------------- | ------------------------------------------------------------------------ | | platformTyperequired | string\[ 1 .. 255 ] charactersThe transfer platform type | | parametersrequired | objectnon-emptyThe transfer platform parameters. | ### Responses **201** The transfer platform configuration request has been treated successfully **400** Indicates a bad request, which can be due to violation(s) of HTTP or API rules **401** Unauthorized **409** Cannot create duplicate configuration. A transfer platform configuration already exists for this tenant and type. **500** Indicates an unknown internal error that prevents the server from processing the request post/api/appMarket/v2/transferPlatformConfigurations https\://marketplace.appdirect.com/api/api/appMarket/v2/transferPlatformConfigurations https\://virtserver.swaggerhub.com/api/appMarket/v2/transferPlatformConfigurations ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "platformType": "stripe", "parameters": { "base_url": "https://api.stripe.com/testupdate", "username": "secret" } }` ### Response samples * 201 * 400 * 500 Content type application/json Copy Expand all Collapse all `{ "id": "9dfabd43-a34b-46e1-bc40-7ddd92cc228a", "platformType": "stripe", "parameters": { "base_url": "https://api.stripe.com/testupdate", "username": "secret" } }` ## [](#tag/Payments-v2/operation/getTransferPlatformConfiguration)Retrieve transfer platform configurations Retrieves the transfer platform configuration by ID ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access to retrieve one transfer platform configuration. ##### path Parameters | | | | --------------------------------------- | -------------------------------------------- | | transferPlatformConfigurationIdrequired | stringThe transfer platform configuration ID | ### Responses **200** OK **401** Unauthorized **404** Resource Not Found **500** Indicates an unknown internal error that prevents the server from processing the request get/api/appMarket/v2/transferPlatformConfigurations/{transferPlatformConfigurationId} https\://marketplace.appdirect.com/api/api/appMarket/v2/transferPlatformConfigurations/{transferPlatformConfigurationId} https\://virtserver.swaggerhub.com/api/appMarket/v2/transferPlatformConfigurations/{transferPlatformConfigurationId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/api/appMarket/v2/transferPlatformConfigurations/%7BtransferPlatformConfigurationId%7D ``` ### Response samples * 200 * 404 * 500 Content type application/json Copy Expand all Collapse all `{ "platformType": "stripe", "parameters": { "base_url": "https://api.stripe.com/testupdate", "username": "secret" }, "id": "9dfabd43-a34b-46e1-bc40-7ddd92cc228a" }` ## [](#tag/Payments-v2/operation/updateTransferPlatformConfiguration)Update transfer platform configurations Updates the specified transfer platform configuration ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access to update one transfer platform configuration. ##### path Parameters | | | | --------------------------------------- | -------------------------------------------- | | transferPlatformConfigurationIdrequired | stringThe transfer platform configuration ID | ##### Request Body schema: application/jsonrequired The transfer platform configuration request | | | | -------------------- | ------------------------------------------------------------------------ | | platformTyperequired | string\[ 1 .. 255 ] charactersThe transfer platform type | | parametersrequired | objectnon-emptyThe transfer platform parameters. | ### Responses **200** The transfer platform configuration request has been treated successfully **400** Indicates a bad request, which can be due to violation(s) of HTTP or API rules **401** Unauthorized **404** Resource Not Found **500** Indicates an unknown internal error that prevents the server from processing the request put/api/appMarket/v2/transferPlatformConfigurations/{transferPlatformConfigurationId} https\://marketplace.appdirect.com/api/api/appMarket/v2/transferPlatformConfigurations/{transferPlatformConfigurationId} https\://virtserver.swaggerhub.com/api/appMarket/v2/transferPlatformConfigurations/{transferPlatformConfigurationId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "platformType": "stripe", "parameters": { "base_url": "https://api.stripe.com/testupdate", "username": "secret" } }` ### Response samples * 200 * 400 * 404 * 500 Content type application/json Copy Expand all Collapse all `{ "id": "9dfabd43-a34b-46e1-bc40-7ddd92cc228a", "platformType": "stripe", "parameters": { "base_url": "https://api.stripe.com/testupdate", "username": "secret" } }` ## [](#tag/Payments-v2/operation/deleteTransferPlatformConfiguration)Delete transfer platform configurations Deletes the specified transfer platform configuration. It cannot be used anymore ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access to delete one transfer platform configuration. ##### path Parameters | | | | --------------------------------------- | -------------------------------------------- | | transferPlatformConfigurationIdrequired | stringThe transfer platform configuration ID | ### Responses **204** No Content **401** Unauthorized **500** Indicates an unknown internal error that prevents the server from processing the request delete/api/appMarket/v2/transferPlatformConfigurations/{transferPlatformConfigurationId} https\://marketplace.appdirect.com/api/api/appMarket/v2/transferPlatformConfigurations/{transferPlatformConfigurationId} https\://virtserver.swaggerhub.com/api/appMarket/v2/transferPlatformConfigurations/{transferPlatformConfigurationId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/api/appMarket/v2/transferPlatformConfigurations/%7BtransferPlatformConfigurationId%7D ``` ### Response samples * 500 Content type application/json Copy `{ "status": 500, "code": "UNKNOWN_ERROR", "message": "Internal server error." }` ## [](#tag/Payments-v2/operation/createTransferMethod)Create transfer methods Creates a new Transfer Method for the requesting (authenticated) user ##### Request Body schema: application/jsonrequired The transfer method to create | | | | -------------------- | ---------------------------------------------------------------------------------------------------------------- | | propertiesrequired | objectnon-emptyThe transfer method properties | | platformTyperequired | string\[ 1 .. 255 ] charactersThe transfer platform type | | partyIdrequired | string\[ 1 .. 255 ] charactersThe ID of the transfer method's party | | partyTyperequired | string\[ 1 .. 255 ] charactersThe type of the transfer method's party (USER, CHANNEL, and so on) | ### Responses **201** The transfer method request has been created successfully **400** Indicates a bad request, which can be due to violation(s) of HTTP or API rules **401** Unauthorized **409** Cannot create duplicate transfer method. A transfer method already exists for this party and platformType **500** Indicates an unknown internal error that prevents the server from processing the request post/api/appMarket/v2/transferMethods https\://marketplace.appdirect.com/api/api/appMarket/v2/transferMethods https\://virtserver.swaggerhub.com/api/appMarket/v2/transferMethods ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "platformType": "stripe", "partyId": "1", "partyType": "USER", "properties": { "account_id": "123456" } }` ### Response samples * 201 * 400 * 500 Content type application/json Copy Expand all Collapse all `{ "id": "ab65d3e8-4ee0-11e8-9c2d-222222222222", "platformType": "stripe", "partyId": "1", "partyType": "USER", "balance": { "amount": "10.0000000000", "currency": "USD" }, "displayName": "****3456", "properties": { "account_id": "123456" } }` ## [](#tag/Payments-v2/operation/getTransferMethods)Retrieve transfer methods Retrieves the transfer methods associated with the requesting (authenticated) user ##### query Parameters | | | | -------------- | -------------------------------------------------------------------------------------------------------------- | | includeBalance | booleanDefault:falseDetermines whether the response should include the transfer method balance | ### Responses **200** OK **401** Unauthorized **500** Indicates an unknown internal error that prevents the server from processing the request get/api/appMarket/v2/transferMethods https\://marketplace.appdirect.com/api/api/appMarket/v2/transferMethods https\://virtserver.swaggerhub.com/api/appMarket/v2/transferMethods ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/api/appMarket/v2/transferMethods?includeBalance=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 * 500 Content type application/json Copy Expand all Collapse all `[ { "id": "ab65d3e8-4ee0-11e8-9c2d-222222222222", "platformType": "stripe", "partyId": "1", "partyType": "USER", "balance": { "amount": "10.00", "currency": "USD" }, "displayName": "****3456", "properties": { "account_id": "123456" } }, { "id": "a20b2ad9-2248-4393-ad35-8c27dd01c11e", "platformType": "Paypal", "partyId": "1", "partyType": "USER", "balance": { "amount": "10.00", "currency": "USD" }, "displayName": "****WXYZ", "properties": { "account_id": "ABCDWXYZ" } } ]` ## [](#tag/Payments-v2/operation/getTransferMethod)Retrieves Transfer Method by ID Retrieves the Transfer Method for the given ID ##### path Parameters | | | | ------------------------ | ---------------------------- | | transferMethodIdrequired | stringThe Transfer Method ID | ### Responses **200** OK **401** Unauthorized **404** Resource Not Found **500** Indicates an unknown internal error that prevents the server from processing the request get/api/appMarket/v2/transferMethods/{transferMethodId} https\://marketplace.appdirect.com/api/api/appMarket/v2/transferMethods/{transferMethodId} https\://virtserver.swaggerhub.com/api/appMarket/v2/transferMethods/{transferMethodId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/api/appMarket/v2/transferMethods/%7BtransferMethodId%7D ``` ### Response samples * 200 * 404 * 500 Content type application/json Copy Expand all Collapse all `{ "id": "ab65d3e8-4ee0-11e8-9c2d-222222222222", "platformType": "stripe", "partyId": "1", "partyType": "USER", "balance": { "amount": "10.00", "currency": "USD" }, "displayName": "****3456", "properties": { "account_id": "123456" } }` ## [](#tag/Payments-v2/operation/deleteTransferMethod)Delete transfer methods Deletes the transfer method with the specified ID ##### path Parameters | | | | ------------------------ | ---------------------------- | | transferMethodIdrequired | stringThe Transfer Method ID | ### Responses **204** No Content **401** Unauthorized **500** Indicates an unknown internal error that prevents the server from processing the request delete/api/appMarket/v2/transferMethods/{transferMethodId} https\://marketplace.appdirect.com/api/api/appMarket/v2/transferMethods/{transferMethodId} https\://virtserver.swaggerhub.com/api/appMarket/v2/transferMethods/{transferMethodId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/api/appMarket/v2/transferMethods/%7BtransferMethodId%7D ``` ### Response samples * 500 Content type application/json Copy `{ "status": 500, "code": "UNKNOWN_ERROR", "message": "Internal server error." }` # [](#tag/Answer)Product Answers ## [](#tag/Answer/operation/resource_Answer_readProductQuestionAnswers_GET)List all answers List answers of a given question on an product ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | questionIdrequired | numberQuestion id | ### Responses **200** Question answers read. **404** Application or question not found. get/marketplace/v1/products/{applicationId}/questions/{questionId}/answers https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/questions/{questionId}/answers https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/questions/{questionId}/answers ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/questions/%7BquestionId%7D/answers ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Answer/operation/resource_Answer_createProductQuestionAnswer_POST)Create an answer This call creates an answer to a product question submitted on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | questionIdrequired | numberQuestion id | ##### Request Body schema:application/xmlapplication/xml Question answer data | | | | ------------ | -------------------------------------------------------------------------------------------- | | author | object (Author)Author of a question, an answer, a review or a review comment | | comment | stringComment | | id | number or nullID | | lastModified | number or nullLast modified date | | official | booleanIs the official answer | ### Responses **201** Created question answer post/marketplace/v1/products/{applicationId}/questions/{questionId}/answers https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/questions/{questionId}/answers https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/questions/{questionId}/answers ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 201 Content type application/xmlapplication/xml No sample ## [](#tag/Answer/operation/resource_Answer_readProductQuestionAnswer_GET)Retrieve an answer This call returns all answer details for a specific product. ##### path Parameters | | | | --------------------- | -------------------- | | answerIdrequired | numberAnswer id | | applicationIdrequired | numberApplication id | | questionIdrequired | numberQuestion id | ### Responses **200** Question answer read. **404** Application, question or answer not found. get/marketplace/v1/products/{applicationId}/questions/{questionId}/answers/{answerId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/questions/{questionId}/answers/{answerId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/questions/{questionId}/answers/{answerId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/questions/%7BquestionId%7D/answers/%7BanswerId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Answer/operation/resource_Answer_updateProductQuestionAnswer_PUT)Update an answer This call updates an existing answer on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | answerIdrequired | numberAnswer id | | applicationIdrequired | numberApplication id | | questionIdrequired | numberQuestion id | ##### Request Body schema:application/xmlapplication/xml Question answer data | | | | ------------ | -------------------------------------------------------------------------------------------- | | author | object (Author)Author of a question, an answer, a review or a review comment | | comment | stringComment | | id | number or nullID | | lastModified | number or nullLast modified date | | official | booleanIs the official answer | ### Responses **200** Question answers updated. **404** Application, question or answer not found. put/marketplace/v1/products/{applicationId}/questions/{questionId}/answers/{answerId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/questions/{questionId}/answers/{answerId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/questions/{questionId}/answers/{answerId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Answer/operation/resource_Answer_deleteProductQuestionAnswer_DELETE)Delete an answer This call deletes an answer from your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | answerIdrequired | numberAnswer id | | applicationIdrequired | numberApplication id | | questionIdrequired | numberQuestion id | ### Responses **204** Question answer deleted. **404** Application, question or answer not found. delete/marketplace/v1/products/{applicationId}/questions/{questionId}/answers/{answerId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/questions/{questionId}/answers/{answerId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/questions/{questionId}/answers/{answerId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/questions/%7BquestionId%7D/answers/%7BanswerId%7D ``` # [](#tag/Comment)Product Comments ## [](#tag/Comment/operation/resource_Comment_createProductReviewComment_POST)Create a comment This call creates a new review comment on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | reviewIdrequired | numberReview id | ##### Request Body schema:application/xmlapplication/xml Review comment data | | | | ------------ | -------------------------------------------------------------------------------------------- | | author | object (Author)Author of a question, an answer, a review or a review comment | | comment | stringComment | | id | number or nullID | | lastModified | number or nullLast modified date | | official | booleanIs an official comment | ### Responses **201** Review comment created. **404** Application, review or comment not found. post/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 201 Content type application/xmlapplication/xml No sample ## [](#tag/Comment/operation/resource_Comment_readProductReviewComments_GET)List all comments This call lists all review comments on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | reviewIdrequired | numberReview id | ### Responses **200** Review comments read. **404** Application or review not found. get/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/reviews/%7BreviewId%7D/comments ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Comment/operation/resource_Comment_readProductReviewComment_GET)Retrieve a comment This call returns all the comment details from a specific product. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | commentIdrequired | numberComment id | | reviewIdrequired | numberReview id | ### Responses **200** Review comment read. **404** Application, review or comment not found. get/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments/{commentId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments/{commentId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments/{commentId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/reviews/%7BreviewId%7D/comments/%7BcommentId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Comment/operation/resource_Comment_updateProductReviewComment_PUT)Update a comment This call updates a product comment on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | commentIdrequired | numberComment id | | reviewIdrequired | numberReview id | ##### Request Body schema:application/xmlapplication/xml Review comment data | | | | ------------ | -------------------------------------------------------------------------------------------- | | author | object (Author)Author of a question, an answer, a review or a review comment | | comment | stringComment | | id | number or nullID | | lastModified | number or nullLast modified date | | official | booleanIs an official comment | ### Responses **200** Review comment updated. **404** Application, review or comment not found. put/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments/{commentId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments/{commentId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments/{commentId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Comment/operation/resource_Comment_deleteProductReviewComment_DELETE)Delete a comment This call deletes a review comment from your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | commentIdrequired | numberComment id | | reviewIdrequired | numberReview id | ### Responses **200** Review comments deleted. **404** Application, review or comment not found. delete/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments/{commentId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments/{commentId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/reviews/{reviewId}/comments/{commentId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/reviews/%7BreviewId%7D/comments/%7BcommentId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample # [](#tag/ProductContext)Product Context ## [](#tag/ProductContext/operation/resource_Other_readUserProductContext_GET)Retrieve a product context for the current user Retrieve a product context for the current user ##### path Parameters | | | | --------------------- | --------------------------- | | applicationIdrequired | numberid of the application | ### Responses **200** OK **404** Application Not Found get/billing/v1/userProductContext/{applicationId} https\://marketplace.appdirect.com/api/billing/v1/userProductContext/{applicationId} https\://virtserver.swaggerhub.com/billing/v1/userProductContext/{applicationId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/billing/v1/userProductContext/%7BapplicationId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/ProductContext/operation/resource_Other_readUserCompanyProductContext_GET)Retrieve a product context for a supplied user and a company they belong to Retrieve a product context for a supplied user and a company they belong to ##### path Parameters | | | | --------------------- | ---------------------------------------- | | applicationIdrequired | numberid of the application | | companyIdrequired | stringuuid of the desired users' company | | userIdrequired | stringuuid of the desired user | ### Responses **200** OK **404** User, Company or Application Not Found get/billing/v1/userProductContext/{applicationId}/companies/{companyId}/users/{userId} https\://marketplace.appdirect.com/api/billing/v1/userProductContext/{applicationId}/companies/{companyId}/users/{userId} https\://virtserver.swaggerhub.com/billing/v1/userProductContext/{applicationId}/companies/{companyId}/users/{userId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/billing/v1/userProductContext/%7BapplicationId%7D/companies/%7BcompanyId%7D/users/%7BuserId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample # [](#tag/Product-Management-API)Product Management API ## [](#tag/Product-Management-API/operation/deleteImage)Delete image from product Deletes a specific image resource from a product. The image is identified by the product reference ID, upload type, locale, and path to delete. This operation permanently removes the image from the product and cannot be undone. ##### Request Body schema: application/jsonrequired Image deletion request containing product reference ID, upload type, locale, and path | | | | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | productRefIdrequired | stringProduct reference ID from which the image should be deleted | | uploadTyperequired | stringEnum: "PROFILE\_LOGO" "MYAPPS\_LOGO" "LISTING\_LOGO" "LISTING\_AND\_MYAPPS\_LOGO" "OVERVIEW" "SCREENSHOT" "FEATURE"Type of upload that specifies where the image is used | | localerequired | stringLocale for the image (ISO 639-1 language code with optional country code) | | pathToDeleterequired | stringPath to the specific image file that should be deleted | ### Responses **200** Image deleted successfully **400** Bad Request - Invalid parameters **401** Unauthorized - Authentication required **403** Forbidden - Insufficient permissions **500** Internal Server Error - Unexpected error when deleting image post/products/v1/resources/image/delete https\://marketplace.appdirect.com/api/products/v1/resources/image/delete https\://virtserver.swaggerhub.com/products/v1/resources/image/delete ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "productRefId": "c0e98d88-bc85-4578-b953-fdede4235b5c", "uploadType": "LISTING_LOGO", "locale": "en_US", "pathToDelete": "/images/logo.png" }` ## [](#tag/Product-Management-API/operation/uploadAndLinkImage)Upload and link image to product Uploads an image file and links it to a specific product resource. Supports various image types for different use cases like logos, screenshots, and overview images. The uploaded image is automatically processed and stored in the appropriate format for the specified upload type. ##### Request Body schema: multipart/form-datarequired | | | | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | productRefIdrequired | stringProduct reference ID to link the image to | | uploadTyperequired | stringEnum: "PROFILE\_LOGO" "MYAPPS\_LOGO" "LISTING\_LOGO" "LISTING\_AND\_MYAPPS\_LOGO" "OVERVIEW" "SCREENSHOT" "FEATURE"Type of upload specifying where the image will be used | | localerequired | stringLocale for the image (ISO 639-1 language code with optional country code) | | filerequired | string<binary>Image file to upload (supported formats: JPG, PNG, GIF) | | identifier | stringOptional identifier for the uploaded image resource | ### Responses **201** Image uploaded and linked successfully **400** Bad Request - Invalid parameters **401** Unauthorized - Authentication required **403** Forbidden - Insufficient permissions **500** Internal Server Error - Unexpected error uploading and linking image post/products/v1/resources/image/uploadAndLink https\://marketplace.appdirect.com/api/products/v1/resources/image/uploadAndLink https\://virtserver.swaggerhub.com/products/v1/resources/image/uploadAndLink ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/products/v1/resources/image/uploadAndLink \ --header 'content-type: multipart/form-data' ``` ## [](#tag/Product-Management-API/operation/uploadAndLinkPdfFile)Upload and link PDF file to product Uploads a PDF file and links it to a specific product as documentation or resource material. PDF files can be configured for visibility (public or reseller-only) and can have custom names and identifiers. Commonly used for user manuals, installation guides, terms of service, and other product documentation. ##### Request Body schema: multipart/form-datarequired | | | | ---------------------- | ---------------------------------------------------------------------------------- | | productRefIdrequired | stringProduct reference ID to link the PDF file to | | localerequired | stringLocale for the PDF file (ISO 639-1 language code with optional country code) | | filerequired | string<binary>PDF file to upload | | namerequired | stringDisplay name for the uploaded PDF file | | onlyVisibleToResellers | stringWhether the PDF should only be visible to resellers (true/false) | | externalResourceRefId | stringExternal reference ID for the uploaded PDF resource | ### Responses **201** PDF file uploaded and linked successfully **400** Bad Request - Invalid parameters **401** Unauthorized - Authentication required **403** Forbidden - Insufficient permissions **500** Internal Server Error - Unexpected error uploading and linking external resource pdf file post/products/v1/resources/file/uploadAndLink https\://marketplace.appdirect.com/api/products/v1/resources/file/uploadAndLink https\://virtserver.swaggerhub.com/products/v1/resources/file/uploadAndLink ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/products/v1/resources/file/uploadAndLink \ --header 'content-type: multipart/form-data' ``` ## [](#tag/Product-Management-API/operation/deleteFile)Delete file from product Deletes a specific file resource from a product. Currently supports deletion of PDF files only. The file is identified by the product reference ID and file identifier. This operation permanently removes the file from the product and cannot be undone. ##### Request Body schema: application/jsonrequired File deletion request containing product reference ID and file identifier | | | | -------------------- | ---------------------------------------------------------------- | | productRefIdrequired | stringProduct reference ID from which the file should be deleted | | identifierrequired | stringUnique identifier of the file to be deleted | ### Responses **204** File deleted successfully (No Content) **400** Bad Request - Invalid parameters **401** Unauthorized - Authentication required **403** Forbidden - Insufficient permissions **500** Internal Server Error - Unexpected error deleting file delete/products/v1/resources/file/delete https\://marketplace.appdirect.com/api/products/v1/resources/file/delete https\://virtserver.swaggerhub.com/products/v1/resources/file/delete ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "productRefId": "c0e98d88-bc85-4578-b953-fdede4235b5c", "identifier": "94832c55-bbec-4539-b082-f0a2b1cd8060" }` # [](#tag/Question)Product Questions ## [](#tag/Question/operation/resource_Question_readProductQuestion_GET)Retrieve a question This call returns all question details for a specific product. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | questionIdrequired | numberQuestion id | ### Responses **200** Question read. **404** Application or question not found. get/marketplace/v1/products/{applicationId}/questions/{questionId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/questions/{questionId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/questions/{questionId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/questions/%7BquestionId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Question/operation/resource_Question_updateProductQuestion_PUT)Update a question This call allows you to update a product question on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | questionIdrequired | numberQuestion id | ##### Request Body schema:application/xmlapplication/xml Question data | | | | ------------ | -------------------------------------------------------------------------------------------- | | answerCount | number or nullNumber of answers | | author | object (Author)Author of a question, an answer, a review or a review comment | | comment | stringComment | | id | number or nullID | | lastModified | number or nullLast modified date | | title | stringTitle | ### Responses **200** Question updated. **404** Application or question not found. put/marketplace/v1/products/{applicationId}/questions/{questionId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/questions/{questionId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/questions/{questionId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Question/operation/resource_Question_deleteProductQuestion_DELETE)Delete a question This call deletes a product question from your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | questionIdrequired | numberQuestion id | ### Responses **204** Question deleted. **404** Application or question not found. delete/marketplace/v1/products/{applicationId}/questions/{questionId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/questions/{questionId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/questions/{questionId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/questions/%7BquestionId%7D ``` ### Response samples * 204 Content type application/xmlapplication/xml No sample ## [](#tag/Question/operation/resource_Question_readProductQuestions_GET)List all questions This call lists all questions listed on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | ### Responses **200** Questions read. **404** Application not found. get/marketplace/v1/products/{applicationId}/questions https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/questions https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/questions ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/questions ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample # [](#tag/Review)Product Reviews ## [](#tag/Review/operation/resource_Review_createProductReview_POST)Create a review This call creates a new product review on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | ##### Request Body schema:application/xmlapplication/xml Review data | | | | ------------ | -------------------------------------------------------------------------------------------- | | author | object (Author)Author of a question, an answer, a review or a review comment | | comment | stringComment | | commentCount | number or nullNumber of comment | | id | number or nullID | | lastModified | number or nullLast modified date | | rating | number or nullRating | | source | string or nullSource | | title | stringTitle | ### Responses **201** Review created. **400** Error creating the review. **404** Application not found. post/marketplace/v1/products/{applicationId}/reviews https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/reviews https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/reviews ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 201 Content type application/xmlapplication/xml No sample ## [](#tag/Review/operation/resource_Review_readProductReviews_GET)List all reviews This call lists all reviews and associated information listed on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | ### Responses **200** Reviews read. **404** Application not found. get/marketplace/v1/products/{applicationId}/reviews https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/reviews https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/reviews ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/reviews ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Review/operation/resource_Review_readProductReview_GET)Retrieve a review This call returns all details for a specific review. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | reviewIdrequired | numberReview id | ### Responses **200** Review read. **404** Application or review not found. get/marketplace/v1/products/{applicationId}/reviews/{reviewId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/reviews/{reviewId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/reviews/{reviewId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/reviews/%7BreviewId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Review/operation/resource_Review_updateProductReview_PUT)Update a review This call updates an existing product review on your marketplace. Update a review This call updates an existing product review on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | reviewIdrequired | numberReview id | ##### Request Body schema:application/xmlapplication/xml Review data | | | | ------------ | -------------------------------------------------------------------------------------------- | | author | object (Author)Author of a question, an answer, a review or a review comment | | comment | stringComment | | commentCount | number or nullNumber of comment | | id | number or nullID | | lastModified | number or nullLast modified date | | rating | number or nullRating | | source | string or nullSource | | title | stringTitle | ### Responses **200** Review updated. **404** Application or review not found. put/marketplace/v1/products/{applicationId}/reviews/{reviewId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/reviews/{reviewId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/reviews/{reviewId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Review/operation/resource_Review_deleteProductReview_DELETE)Delete a review This call deletes a product review from your marketplace. Delete a review This call deletes a product review from your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | | reviewIdrequired | numberReview id | ### Responses **204** Review deleted. **404** Application or review not found. delete/marketplace/v1/products/{applicationId}/reviews/{reviewId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/reviews/{reviewId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/reviews/{reviewId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/reviews/%7BreviewId%7D ``` ### Response samples * 204 Content type application/xmlapplication/xml No sample # [](#tag/Product)Products ## [](#tag/Product/operation/resource_Product_readProducts_GET)Retrieve buyable products Retrieve all products in the production catalog, including products that are not marked as visible on either the marketplace or network. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the marketplace. * `ROLE_RESELLER` - Allows access as a Reseller for the marketplace. ##### query Parameters | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | page | stringDefault:"0"The page number. Defaults to 0. | | size | stringDefault:"20"The maximum number of products to return. The default is 20. | | sortField | stringDefault:"NAME"Enum: "RATING" "POPULARITY" "NEWEST\_FIRST" "NAME"The field by which to sort results. The default is NAME. RATING: Sort by the rating in descending order. POPULARITY: Sort by product popularity, from most to least popular. Popularity is calculated from the number of purchases. NEWEST\_FIRST: Sort by product creation date/time. NAME: Sort by the product name in alphabetic order. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order, either ASC (ascending) or DESC (descending). The default is ASC. | | searchText | stringSearch text. | | categoryId | Array of numbersProduct category IDs. If specified, only products belonging to these categories are returned. | ### Responses **200** Success get/channel/v1/applications https\://marketplace.appdirect.com/api/channel/v1/applications https\://virtserver.swaggerhub.com/channel/v1/applications ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/applications?page=SOME_STRING_VALUE&size=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&searchText=SOME_STRING_VALUE&categoryId=SOME_ARRAY_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "links": [ { "rel": "next", "href": "http://dockerdev.appdirect.com:8080/api/channel/v1/applications?page=1&size=3&sortField=NAME&sortOrder=ASC" } ], "content": [ { "href": "http://dockerdev.appdirect.com:8080/api/marketplace/v1/products/4644", "id": 4644, "uuid": "cf6ab187-628b-4571-8089-d97319d68801", "url": "http://dockerdev.appdirect.com:8080/apps/4644/sb-platform-product-apphelp-business-cloud-helpdesk", "name": "[SB] Platform Product AppHelp Business Cloud HelpDesk", "productType": "WEB_APP", "iconUrl": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4644/thumbs_64/img5679336365844850048.png", "profileLogoUrl": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4644/thumbs_112/img7862680650740192899.png", "iconSrcset": { "default": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4644/thumbs_64/img5679336365844850048.png" }, "profileLogoSrcset": { "default": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4644/thumbs_112/img7862680650740192899.png" }, "description": "Whether you need advice on managing a SaaS or cloud application, deploying and configuring a backup system, or help setting up BYOD for the office, our Business Cloud HelpDesk experts are available 24x7x365 to assist with any cloud or IT support need your business has.", "overview": "As your business adopts more software and devices to operate and run, it's critical that you have access to quick, effective technical support to assist with the use and troubleshooting of your devices and cloud applications. AppHelp IT HelpDesk gives you an easy and affordable way to address SaaS and IT needs, without having to own your own IT staff. Need help installing software? Configuring backups? Recovering lost files? AppHelp IT HelpDesk has you covered", "startingPrice": "$60.00", "channelStartingPrice": { "prices": { "MXN": { "price": 0, "duration": "ONE_TIME" }, "CAD": { "price": 60, "duration": "ONE_TIME" }, "USD": { "price": 60, "duration": "ONE_TIME" }, "EUR": { "price": 60, "duration": "ONE_TIME" }, "IDR": { "price": 0, "duration": "ONE_TIME" }, "GBP": { "price": 60, "duration": "ONE_TIME" } }, "free": false, "freeTrial": true }, "billingFrequency": "ONE_TIME", "publishedOn": 1519248071000, "developerName": "RP QA", "vendorName": "Appdirect", "rating": null, "numRatings": null, "showRating": true, "overviewImageUrl": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4644/overview/img7694979340532479102.png", "overviewImageSrcset": { "default": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4644/overview/img7694979340532479102.png" }, "blurb": "Support for cloud apps and devices", "buyable": true, "importable": false, "free": false, "freeTrialOrEditionPresent": true, "referable": false, "hasLyncToPhone": false, "downloadFileSize": null, "hidePricings": false, "collectLeads": false, "addon": false, "featured": false, "featuredSliderPosition": null, "popular": false, "popularity": null, "staffPick": false, "staffPickSliderPosition": null, "discountDetails": null, "lastModified": 1519248072000, "sortRank": 3, "tags": [ { "type": "CATEGORY", "id": 6, "name": "Web Development", "badge": null, "showBadge": false, "showOnNavigation": true, "children": [ ], "description": null } ], "bundleUrls": [ ], "supportedLanguages": [ "en" ], "productRibbon": { }, "merchandisingBadges": [ ], "supportedCountries": [ ], "links": [ { "rel": "self", "href": "http://dockerdev.appdirect.com:8080/api/marketplace/v1/products/4644?country=¤cy=" } ] }, { "href": "http://dockerdev.appdirect.com:8080/api/marketplace/v1/products/4645", "id": 4645, "uuid": "9b997bfc-c68c-4ee3-b9f2-66d634ee993f", "url": "http://dockerdev.appdirect.com:8080/apps/4645/uqa-platform-product-apphelp-business-cloud-helpdesk", "name": "[UQA] Platform Product AppHelp Business Cloud HelpDesk", "productType": "WEB_APP", "iconUrl": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4645/thumbs_64/img6332905770460652831.png", "profileLogoUrl": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4645/thumbs_112/img6663136721171420581.png", "iconSrcset": { "default": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4645/thumbs_64/img6332905770460652831.png" }, "profileLogoSrcset": { "default": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4645/thumbs_112/img6663136721171420581.png" }, "description": "Whether you need advice on managing a SaaS or cloud application, deploying and configuring a backup system, or help setting up BYOD for the office, our Business Cloud HelpDesk experts are available 24x7x365 to assist with any cloud or IT support need your business has.", "overview": "As your business adopts more software and devices to operate and run, it's critical that you have access to quick, effective technical support to assist with the use and troubleshooting of your devices and cloud applications. AppHelp IT HelpDesk gives you an easy and affordable way to address SaaS and IT needs, without having to own your own IT staff. Need help installing software? Configuring backups? Recovering lost files? AppHelp IT HelpDesk has you covered", "startingPrice": "$60.00", "channelStartingPrice": { "prices": { "MXN": { "price": 60, "duration": "ONE_TIME" }, "CAD": { "price": 60, "duration": "ONE_TIME" }, "USD": { "price": 60, "duration": "ONE_TIME" }, "EUR": { "price": 60, "duration": "ONE_TIME" }, "IDR": { "price": 0, "duration": "ONE_TIME" }, "GBP": { "price": 60, "duration": "ONE_TIME" } }, "free": false, "freeTrial": true }, "billingFrequency": "ONE_TIME", "publishedOn": 1519248113000, "developerName": "AppHelp", "vendorName": "Appdirect", "rating": null, "numRatings": null, "showRating": true, "overviewImageUrl": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4645/overview/img6165482937306752085.png", "overviewImageSrcset": { "default": "https://ad-dev-dump1.s3.amazonaws.com/app_resources/4645/overview/img6165482937306752085.png" }, "blurb": "Support for cloud apps and devices", "buyable": true, "importable": false, "free": false, "freeTrialOrEditionPresent": true, "referable": false, "hasLyncToPhone": false, "downloadFileSize": null, "hidePricings": false, "collectLeads": false, "addon": false, "featured": false, "featuredSliderPosition": null, "popular": false, "popularity": null, "staffPick": false, "staffPickSliderPosition": null, "discountDetails": null, "lastModified": 1519248114000, "sortRank": 3, "tags": [ { "type": "CATEGORY", "id": 6, "name": "Web Development", "badge": null, "showBadge": false, "showOnNavigation": true, "children": [ ], "description": null } ], "bundleUrls": [ ], "supportedLanguages": [ "en" ], "productRibbon": { }, "merchandisingBadges": [ ], "supportedCountries": [ ], "links": [ { "rel": "self", "href": "http://dockerdev.appdirect.com:8080/api/marketplace/v1/products/4645?country=¤cy=" } ] }, { "href": "http://dockerdev.appdirect.com:8080/api/marketplace/v1/products/3732", "id": 3732, "uuid": "531b7811-2372-47a3-8d04-40e66205d2db", "url": "http://dockerdev.appdirect.com:8080/apps/3732/1-month-contract-recurring-addon-v2", "name": "1 Month Contract Recurring Addon V2", "productType": "WEB_APP", "iconUrl": null, "profileLogoUrl": null, "iconSrcset": { }, "profileLogoSrcset": { }, "description": "1 Month Contract Recurring Addon V2", "overview": null, "startingPrice": "", "channelStartingPrice": { "prices": { }, "free": false, "freeTrial": false }, "billingFrequency": "MONTHLY", "publishedOn": 1500463144000, "developerName": "developer+channeladmin", "vendorName": "developer+channeladmin", "rating": null, "numRatings": null, "showRating": true, "overviewImageUrl": null, "overviewImageSrcset": { }, "blurb": null, "buyable": true, "importable": false, "free": false, "freeTrialOrEditionPresent": false, "referable": false, "hasLyncToPhone": false, "downloadFileSize": null, "hidePricings": false, "collectLeads": false, "addon": true, "featured": false, "featuredSliderPosition": null, "popular": false, "popularity": 0, "staffPick": false, "staffPickSliderPosition": null, "discountDetails": null, "lastModified": 1500540244000, "sortRank": 3, "tags": [ ], "bundleUrls": [ ], "supportedLanguages": [ "en" ], "productRibbon": { }, "merchandisingBadges": [ ], "supportedCountries": [ ], "links": [ { "rel": "self", "href": "http://dockerdev.appdirect.com:8080/api/marketplace/v1/products/3732?country=¤cy=" } ] } ], "page": { "size": 3, "totalElements": 932, "totalPages": 311, "number": 0 } }` ## [](#tag/Product/operation/resource_Product_readProduct_GET)Retrieve a product This request returns all details about a specific product on your marketplace. The product in the response contains invisible editions if you are using OAuth to access the endpoint and the current user has either a Marketplace Manager role or a Sales Support role.
Maximum of 5 requests per second per caller.
To receive language-specific content in your response, ensure that your marketplace supports the specified language. Also ensure that you have a version of your product in the specified language. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication ID | ### Responses **200** product information **429** Too many requests get/marketplace/v1/products/{applicationId} https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId} https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Product/operation/resource_Product_readVendorProducts_GET)List all products by vendor Lists all products offered by the specified vendor. On the product profile page, the results appear in the Related Products list, in ascending order by product ID. To retrieve the vendor ID, use the [List all companies](#list-all-companies) endpoint (vendor companies have the "vendor" property set to "true"). ##### path Parameters | | | | ------------------ | ------------------------------ | | vendorUuidrequired | stringID of the vendor company | ### Responses **200** Success **404** Vendor not found get/marketplace/v1/vendors/{vendorUuid}/products https\://marketplace.appdirect.com/api/marketplace/v1/vendors/{vendorUuid}/products https\://virtserver.swaggerhub.com/marketplace/v1/vendors/{vendorUuid}/products ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/vendors/%7BvendorUuid%7D/products ``` ### Response samples * 200 * 404 Content type application/xmlapplication/xml No sample ## [](#tag/Product/operation/resource_Product_readStatus_GET)Retrieve a product status This call returns the status of a product on your marketplace. ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | ### Responses **200** products status get/marketplace/v1/products/{applicationId}/status https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/status https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/status ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/status ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Product/operation/resource_Product_readProductRecommendations_GET)List all product recommendations This call lists all products that other customers have bought in addition to the one specified. Returns recommendations for additional purchases (currently simply returning what others who have bought the product have also bought). This may be augmented later to include additional recommendation strategies but always in the context of a single product ##### path Parameters | | | | --------------------- | -------------------- | | applicationIdrequired | numberApplication id | ### Responses **200** List of recommended applications get/marketplace/v1/products/{applicationId}/recommendations https\://marketplace.appdirect.com/api/marketplace/v1/products/{applicationId}/recommendations https\://virtserver.swaggerhub.com/marketplace/v1/products/{applicationId}/recommendations ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/marketplace/v1/products/%7BapplicationId%7D/recommendations ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Product/operation/resource_Product_readAppListing_GET)List all products This call lists products based on specific parameters such as attribute, category, date, or type. ##### query Parameters | | | | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | a | Array of numbersOnly return products for these attribute ids | | approvalAfter | numberSearch products published after this date in milliseconds | | approvalBefore | numberSearch products published before this date in milliseconds | | c | Array of numbersOnly return products for these categories | | count | stringDefault:"500"Limit number of products returned | | filter | Array of stringsItemsEnum: "DISCOUNT" "FEATURED" "FREE" "FREE\_TRIAL" "PAID" "POPULAR" "STAFFPICK"Only return products for these characteristics | | s | Array of numbersOnly return products for these sub category ids | | order | stringEnum: "ALPHABETICAL" "NEWEST\_FIRST" "NEWEST\_PUBLISHED" "POPULARITY" "RATING"Ordering type | | pl | Array of numbers | | platform | Array of strings | | q | stringSearch term used to search on different fields of an product | | s | Array of numbersOnly return products for these category ids | | start | integerStart to return product after this offset | | type | Array of stringsItemsEnum: "APPDIRECT\_SERVICE" "BUNDLE" "CLOUDFOUNDRY\_DEPLOYABLE" "CLOUD\_SERVICES" "DESIGN\_ELEMENT" "DOMAIN\_REGISTRATION" "DOMAIN\_RESELLER" "DOWNLOAD" "DOWNLOADABLE\_BUNDLE" "DOWNLOAD\_WITH\_FULL\_PROFILE" "EMBEDDED\_VIDEO" "EXTERNAL" "MODULE" "OPEN\_SOURCE" "RACKSPACE\_IMAGE" "STANDING\_CLOUD" "STATIC" "SUPPORT" "TEMPLATE" "WEB\_APP" "WEB\_APP\_MANUAL\_SETUP" "WEB\_APP\_STACKED"Only return product for these product types | | vendor | Array of stringsOnly return products for the specified vendor IDs | | locale | stringSpecify the locale context | ### Responses **200** List of products get/marketplace/v1/listing https\://marketplace.appdirect.com/api/marketplace/v1/listing https\://virtserver.swaggerhub.com/marketplace/v1/listing ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/marketplace/v1/listing?a=SOME_ARRAY_VALUE&approvalAfter=SOME_NUMBER_VALUE&approvalBefore=SOME_NUMBER_VALUE&c=SOME_ARRAY_VALUE&count=SOME_STRING_VALUE&filter=SOME_ARRAY_VALUE&s=SOME_ARRAY_VALUE&s=SOME_ARRAY_VALUE&order=SOME_STRING_VALUE&pl=SOME_ARRAY_VALUE&platform=SOME_ARRAY_VALUE&q=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE&type=SOME_ARRAY_VALUE&vendor=SOME_ARRAY_VALUE&locale=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Product/operation/resource_Product_readStagingCatalog_GET)Read staging catalog This call lists all products in the Staging Catalog of your marketplace. ##### query Parameters | | | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | appStatus | stringEnum: "DEVELOPMENT" "PENDING" "PRODUCTION"The status of the application, optional. | | page | stringDefault:"0"The page number. Optional, defaults to 0. | | productType | stringEnum: "APPDIRECT\_SERVICE" "BUNDLE" "CLOUDFOUNDRY\_DEPLOYABLE" "CLOUD\_SERVICES" "DESIGN\_ELEMENT" "DOMAIN\_REGISTRATION" "DOMAIN\_RESELLER" "DOWNLOAD" "DOWNLOADABLE\_BUNDLE" "DOWNLOAD\_WITH\_FULL\_PROFILE" "EMBEDDED\_VIDEO" "EXTERNAL" "MODULE" "OPEN\_SOURCE" "RACKSPACE\_IMAGE" "STANDING\_CLOUD" "STATIC" "SUPPORT" "TEMPLATE" "WEB\_APP" "WEB\_APP\_MANUAL\_SETUP" "WEB\_APP\_STACKED"The product type, optional. | | searchText | stringThe search text, optional. | | vendorUuid | string(Optional) ID of the vendor company | | size | stringDefault:"20"The number of application returned. Optional, defaults to 20. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"The order. Optional, default to ascending. | | sortProperty | stringDefault:"createdOn"The sort field. Optional, defaults to the creation date of the application. | ### Responses **200** A paginated list of Staging products. get/channel/v1/stagingCatalog https\://marketplace.appdirect.com/api/channel/v1/stagingCatalog https\://virtserver.swaggerhub.com/channel/v1/stagingCatalog ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/stagingCatalog?appStatus=SOME_STRING_VALUE&page=SOME_STRING_VALUE&productType=SOME_STRING_VALUE&searchText=SOME_STRING_VALUE&vendorUuid=SOME_STRING_VALUE&size=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&sortProperty=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "links": [ ], "content": [ { "href": "http://appdirect/api/marketplace/v1/products/4", "uuid": "659172ed-de2b-4668-bef1-2305543981c2", "publishedApp": null, "workingApp": null, "name": "test", "type": "TEMPLATE", "provider": { "uuid": "d83b2364-6cfb-4f53-afab-195732ed1064", "name": "Appdirect", "url": "appdirect.com" }, "listing": { "myAppLogoIconUrl": null, "imageUrl": null, "profileImageUrl": null, "myAppLogoIconSrcset": { }, "imageSrcset": { }, "profileImageSrcset": { }, "blurb": null, "overview": null, "rating": null, "reviewCount": 0, "mobileBundleId": null, "mobileAppStoreId": null }, "overview": { "splashTitle": null, "splashDescription": null, "imageUrl": null, "imageSrcset": { }, "demoUrl": null, "documentationUrl": null, "downloadDocumentationUrl": null, "systemRequirements": null, "downloadFileSize": null, "benefits": [ ], "versions": { } }, "support": { "email": null, "phone": null, "knowledgebaseUrl": null, "description": null }, "privacyUrl": null, "termsUrl": null, "referUrl": null, "hostedLocation": null, "lastModified": 1487267935599, "pricing": { "pricingSummary": null, "footnotes": [ ], "bullets": [ ], "editions": [ { "id": 4, "uuid": "d4e94846-2483-429a-8312-5e0ffd2bb3ac", "rank": 1, "name": "65PdwyUfbf", "primary": false, "trial": { "length": 0, "unit": "DAY" }, "expiredTrialGracePeriod": null, "bundleOnly": false, "targetAudience": null, "code": "739C6527-7C18-45cf-B567-E886800C3532", "defaultFreeTrial": false, "invisible": false, "leadGen": false, "lastModified": 1487267935792, "revenueType": "RECURRING", "restricted": false, "freeTrialDuration": 0, "freeTrialType": "DAY", "customerContractRestricted": false, "plans": [ { "href": "http://appdirect/api/marketplace/v1/products/4/editions/4/paymentPlans/6", "id": 6, "uuid": "bc8bd303-14e1-4b3f-9dc4-bc5fd408a3e3", "frequency": "MONTHLY", "contract": null, "allowCustomUsage": false, "keepBillDateOnUsageChange": false, "separatePrepaid": false, "isPrimaryPrice": false, "costs": [ { "id": 6, "unit": "USER", "unitDependency": null, "minUnits": 0, "maxUnits": null, "meteredUsage": false, "increment": 1, "pricePerIncrement": false, "blockContractDecrease": false, "blockContractIncrease": false, "blockOriginalContractDecrease": false, "amount": { "USD": 10 }, "pricingStrategy": "UNIT" } ], "discount": null, "primaryPrice": false } ], "bullets": [ ], "items": [ ], "customizations": [ ] } ] }, "publishedOn": 1487267935599, "rating": null, "numRatings": null, "buyable": false, "free": false, "freeTrialOrEditionPresent": false, "referable": false, "hidePricings": false, "collectLeads": false, "collectLeadsWithPurchaseEnabled": false, "newSubscriptionEnabled": true, "changeSubscriptionAllowed": true, "displayQuestions": false, "displayReviews": false, "oneClickPurchasable": false, "autoUpgradeToPaid": false, "downloadFileSize": null, "startingPrice": { "unit": null, "billingFrequency": null, "amount": { }, "discount": null }, "highestPercentageDiscount": null, "highestFixedDiscount": null, "bundledPlanIds": null, "customIntegration": null, "usageType": "MULTI_USER", "linkedImportableApplicationUuid": null, "liveChatEnabled": false, "liveChatAvailable": false, "showThirdPartyLegalDisclosure": false, "showSelfServiceRestriction": false, "integrationConfiguration": { "productSettings": null, "domainManagementEnabled": false }, "addon": false, "resources": [ ], "screenshots": [ ], "addonOfferings": [ ], "featuredCustomers": [ ], "featuredMedia": [ ], "features": [ ], "tags": [ ], "supportedLanguages": [ "en" ], "applicationStatus": "NEW", "vendorUUID": "d83b2364-6cfb-4f53-afab-195732ed1064", "links": [ { "rel": "self", "href": "http://appdirect/api/marketplace/v1/products/4" } ], "id": 4 }, { "href": "http://appdirect/api/marketplace/v1/products/5", "uuid": "ca3ff213-2436-4c51-bc35-006083ab2411", "publishedApp": { "id": "6", "href": "http://appdirect/api/marketplace/v1/products/6" }, "workingApp": null, "name": "MockApp-6924690453261933046", "type": "WEB_APP", "provider": { "uuid": "6a91b983-7faa-4629-96ad-59036439034a", "name": "Jp4CqQsc5sXUxq0j", "url": null }, "listing": { "myAppLogoIconUrl": null, "imageUrl": null, "profileImageUrl": null, "myAppLogoIconSrcset": { }, "imageSrcset": { }, "profileImageSrcset": { }, "blurb": null, "overview": null, "rating": null, "reviewCount": 0, "mobileBundleId": null, "mobileAppStoreId": null }, "overview": { "splashTitle": null, "splashDescription": null, "imageUrl": null, "imageSrcset": { }, "demoUrl": null, "documentationUrl": null, "downloadDocumentationUrl": null, "systemRequirements": null, "downloadFileSize": null, "benefits": [ ], "versions": { } }, "support": { "email": null, "phone": null, "knowledgebaseUrl": null, "description": null }, "privacyUrl": null, "termsUrl": null, "referUrl": null, "hostedLocation": null, "lastModified": 1487267936024, "pricing": { "pricingSummary": null, "footnotes": [ ], "bullets": [ ], "editions": [ { "id": 5, "uuid": "1b0417a8-7f5b-43ab-8761-3c2c58d985ad", "rank": 1, "name": "dEnkTi8Hjp", "primary": false, "trial": { "length": 1, "unit": "MONTH" }, "expiredTrialGracePeriod": null, "bundleOnly": false, "targetAudience": null, "code": "CiMjK", "defaultFreeTrial": false, "invisible": false, "leadGen": false, "lastModified": 1487267936025, "revenueType": "RECURRING", "restricted": false, "freeTrialDuration": 1, "freeTrialType": "MONTH", "customerContractRestricted": false, "plans": [ { "href": "http://appdirect/api/marketplace/v1/products/5/editions/5/paymentPlans/7", "id": 7, "uuid": "aae2ed68-ed82-45f9-98c9-cca791d6c9d3", "frequency": "MONTHLY", "contract": { "minimumServiceLength": 3, "cancellationPeriodLimit": null, "endOfContractGracePeriod": null, "blockSwitchToShorterContract": false, "blockContractDowngrades": false, "blockContractUpgrades": false, "alignWithParentCycleStartDate": false, "gracePeriod": null, "terminationFee": null, "autoExtensionPricingId": 7 }, "allowCustomUsage": false, "keepBillDateOnUsageChange": false, "separatePrepaid": false, "isPrimaryPrice": false, "costs": [ { "id": 7, "unit": "USER", "unitDependency": null, "minUnits": 0, "maxUnits": null, "meteredUsage": false, "increment": 1, "pricePerIncrement": false, "blockContractDecrease": false, "blockContractIncrease": false, "blockOriginalContractDecrease": false, "amount": { "USD": 10 }, "pricingStrategy": "UNIT" } ], "discount": null, "primaryPrice": false }, { "href": "http://appdirect/api/marketplace/v1/products/5/editions/5/paymentPlans/8", "id": 8, "uuid": "a24e51eb-7560-48fd-9e22-7fb85b32d081", "frequency": "MONTHLY", "contract": { "minimumServiceLength": 6, "cancellationPeriodLimit": null, "endOfContractGracePeriod": null, "blockSwitchToShorterContract": false, "blockContractDowngrades": false, "blockContractUpgrades": false, "alignWithParentCycleStartDate": false, "gracePeriod": null, "terminationFee": null, "autoExtensionPricingId": 8 }, "allowCustomUsage": false, "keepBillDateOnUsageChange": false, "separatePrepaid": false, "isPrimaryPrice": false, "costs": [ { "id": 8, "unit": "USER", "unitDependency": null, "minUnits": 0, "maxUnits": null, "meteredUsage": false, "increment": 1, "pricePerIncrement": false, "blockContractDecrease": false, "blockContractIncrease": false, "blockOriginalContractDecrease": false, "amount": { "USD": 10 }, "pricingStrategy": "UNIT" } ], "discount": null, "primaryPrice": false } ], "bullets": [ ], "items": [ ], "customizations": [ ] } ] }, "publishedOn": 1487267935827, "rating": null, "numRatings": null, "buyable": true, "free": false, "freeTrialOrEditionPresent": true, "referable": false, "hidePricings": false, "collectLeads": false, "collectLeadsWithPurchaseEnabled": false, "newSubscriptionEnabled": true, "changeSubscriptionAllowed": true, "displayQuestions": false, "displayReviews": false, "oneClickPurchasable": true, "autoUpgradeToPaid": false, "downloadFileSize": null, "startingPrice": { "unit": "USER", "billingFrequency": "MONTHLY", "amount": { "USD": 0 }, "discount": null }, "highestPercentageDiscount": null, "highestFixedDiscount": null, "bundledPlanIds": null, "customIntegration": null, "usageType": "MULTI_USER", "linkedImportableApplicationUuid": null, "liveChatEnabled": false, "liveChatAvailable": false, "showThirdPartyLegalDisclosure": false, "showSelfServiceRestriction": false, "integrationConfiguration": { "productSettings": null, "domainManagementEnabled": false }, "addon": false, "resources": [ ], "screenshots": [ ], "addonOfferings": [ ], "featuredCustomers": [ ], "featuredMedia": [ ], "features": [ ], "tags": [ ], "supportedLanguages": [ "en" ], "applicationStatus": "LAUNCHED", "vendorUUID": "6a91b983-7faa-4629-96ad-59036439034a", "links": [ { "rel": "self", "href": "http://appdirect/api/marketplace/v1/products/5" } ], "id": 5 } ], "page": { "size": 20, "totalElements": 2, "totalPages": 1, "number": 0 } }` # [](#tag/PurchaseOrder)Purchase Orders ## [](#tag/PurchaseOrder/operation/resource_Other_readCompanyPurchaseOrders_GET)List all purchase orders for a company List all of the purchase orders for the given company ##### path Parameters | | | | ----------------- | ---------------- | | companyIdrequired | stringCompany ID | ##### query Parameters | | | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | startDateFrom | numberFilters results to only include subscriptions that were started on or after the specified date | | startDateTo | numberFilters results to only include subscriptions that were started on or before the specified date | | status | stringEnum: "INITIALIZED" "PENDING\_USER\_APPROVAL" "PENDING\_REMOTE\_CREATION" "PENDING\_MANUAL\_RECOVERY" "PENDING\_ASYNCHRONOUS\_CREATION" "FREE\_TRIAL" "ACTIVE" "FINISHED" "ONE\_TIME" "CANCELLED" "SUSPENDED" "FREE\_TRIAL\_EXPIRED" "FREE\_TRIAL\_CANCELLED" "DELETED" "FAILED" "UPCOMING" "PENDING\_MIGRATION\_ACTIVATION" "PENDING\_DELAYED\_PROVISIONING"Filters subscriptions by order status | | currency | stringEnum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Filters subscriptions by currency | | type | stringEnum: "NEW" "MIGRATION" "ADOPTION" "FREE\_TRIAL\_ACTIVATION" "TERMINATION\_FEE" "END\_OF\_CONTRACT\_MIGRATION" "REFUND" "CREDIT" "ONE\_TIME\_FEE" "ADDITIONAL\_FEE" "END\_OF\_DISCOUNT\_MIGRATION" "METERED\_USAGE"Filters subscriptions by order type.
NEW: The first order of a subscription. The order contains flat fees (one time or recurring) for this subscription. It is active until the subscription is updated or canceled.
MIGRATION: The order created after a subscription change. The order includes flat fees for both one-time and recurring editions.
ADOPTION: The order created by an administrator who has taken ownership of an application from another user within the same company.
FREE\_TRIAL\_ACTIVATION: Created when a free trial is manually upgraded to a paid subscription. Any subscription that is updated from free trial to paid automatically keeps the original NEW purchase order type.
TERMINATION\_FEE: A subscription is canceled that had a termination fee. This purchase order represents the fees incurred as a result of the cancellation.
END\_OF\_CONTRACT\_MIGRATION: Created when a subscription update takes place as a result of a contract extension. If the contract autorenewal is set to either continue without a contract or renew the contract with the same pricing plan, then no migration occurs and the original purchase order is updated to include the new end date for the contract.
REFUND: Created when a refund is performed. The refund purchase order is created for only on-platform refunds. Off-platform refunds do not generate this type of purchase order.
CREDIT: Created during subscription update events. Any subscription update calculates a paid period and a credit period. The credit is then provided to the user to prorate the subscription.
ONE\_TIME\_FEE: Created if an edition includes one-time setup fees.
ADDITIONAL\_FEE: Used for off-order charges. A developer change creates an off-order charge and charges their customer a custom amount outside of the normal subscription cycle.
END\_OF\_DISCOUNT\_MIGRATION: Created after a discount of limited duration expires. This purchase order is created to represent the updated costs without the discount.
METERED\_USAGE: A purchase order created to accumulate usage fees during a billing period. The order is only valid for the billing period but it is updated with usage lines over the course of the billing period. A metered purchase order is invoiced in arrears at the end of the billing cycle. | | frequency | stringEnum: "ONE\_TIME" "MONTHLY" "QUARTERLY" "SIX\_MONTHS" "YEARLY" "TWO\_YEARS" "THREE\_YEARS" "DAILY"Filters subscriptions by pricing frequency | | orderReferenceCode | stringFilters subscriptions by order reference code | | applicationIds | numberFilters subscriptions by internal application ID | | fromCreationDate | numberFilters results to only include subscriptions that were created on or after the specified date | | toCreationDate | numberFilters results to only include subscriptions that were created on or before the specified date | | count | integerDefault:250Number of results to fetch. Used for paging. | | sortField | stringDefault:"DATE"Enum: "DATE" "ORDER\_ID" "TOTAL"Sort field. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order. | | start | integerDefault:0First result index. Used for paging. | ### Responses **200** OK **404** Not Found get/billing/v1/companies/{companyId}/orders https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/orders https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/orders ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/companies/%7BcompanyId%7D/orders?startDateFrom=SOME_NUMBER_VALUE&startDateTo=SOME_NUMBER_VALUE&status=SOME_STRING_VALUE¤cy=SOME_STRING_VALUE&type=SOME_STRING_VALUE&frequency=SOME_STRING_VALUE&orderReferenceCode=SOME_STRING_VALUE&applicationIds=SOME_NUMBER_VALUE&fromCreationDate=SOME_NUMBER_VALUE&toCreationDate=SOME_NUMBER_VALUE&count=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PurchaseOrder/operation/resource_Other_readUserPurchaseOrders_GET)List all purchase orders for a user List all of the purchase orders for the given user ##### path Parameters | | | | ----------------- | ----------------------- | | companyIdrequired | stringUser's company ID | | userIdrequired | stringUser ID | ##### query Parameters | | | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | startDateFrom | numberFilters results to only include subscriptions that were started on or after the specified date | | startDateTo | numberFilters results to only include subscriptions that were started on or before the specified date | | status | stringEnum: "INITIALIZED" "PENDING\_USER\_APPROVAL" "PENDING\_REMOTE\_CREATION" "PENDING\_MANUAL\_RECOVERY" "PENDING\_ASYNCHRONOUS\_CREATION" "FREE\_TRIAL" "ACTIVE" "FINISHED" "ONE\_TIME" "CANCELLED" "SUSPENDED" "FREE\_TRIAL\_EXPIRED" "FREE\_TRIAL\_CANCELLED" "DELETED" "FAILED" "UPCOMING" "PENDING\_MIGRATION\_ACTIVATION" "PENDING\_DELAYED\_PROVISIONING"Filters subscriptions by order status | | currency | stringEnum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Filters subscriptions by currency | | type | stringEnum: "NEW" "MIGRATION" "ADOPTION" "FREE\_TRIAL\_ACTIVATION" "TERMINATION\_FEE" "END\_OF\_CONTRACT\_MIGRATION" "REFUND" "CREDIT" "ONE\_TIME\_FEE" "ADDITIONAL\_FEE" "END\_OF\_DISCOUNT\_MIGRATION" "METERED\_USAGE"Filters subscriptions by order type.
NEW: The first order of a subscription. The order contains flat fees (one time or recurring) for this subscription. It is active until the subscription is updated or canceled.
MIGRATION: The order created after a subscription change. The order includes flat fees for both one-time and recurring editions.
ADOPTION: The order created by an administrator who has taken ownership of an application from another user within the same company.
FREE\_TRIAL\_ACTIVATION: Created when a free trial is manually upgraded to a paid subscription. Any subscription that is updated from free trial to paid automatically keeps its NEW status purchase order.
TERMINATION\_FEE: A subscription is canceled that had a termination fee. This purchase order represents the fees incurred as a result of the cancellation.
END\_OF\_CONTRACT\_MIGRATION: Created when a subscription update takes place as a result of a contract extension. If the contract autorenewal is set to either continue without a contract or renew the contract with the same pricing plan, then no migration occurs and the original purchase order is updated to include the new end date for the contract.
REFUND: Created when a refund is performed. The refund purchase order is created for only on-platform refunds. Off-platform refunds do not generate this type of purchase order.
CREDIT: Created during subscription update events. Any subscription update calculates a paid period and a credit period. The credit is then provided to the user to prorate the subscription.
ONE\_TIME\_FEE: Created if an edition includes one-time setup fees.
ADDITIONAL\_FEE: Used for off-order charges. A developer change creates an off-order charge and charges their customer a custom amount outside of the normal subscription cycle.
END\_OF\_DISCOUNT\_MIGRATION: Created after a discount of limited duration expires. This purchase order is created to represent the updated costs without the discount.
METERED\_USAGE: A purchase order created to accumulate usage fees during a billing period. The order is only valid for the billing period but it is updated with usage lines over the course of the billing period. A metered purchase order is invoiced in arrears at the end of the billing cycle. | | frequency | stringEnum: "ONE\_TIME" "MONTHLY" "QUARTERLY" "SIX\_MONTHS" "YEARLY" "TWO\_YEARS" "THREE\_YEARS" "DAILY"Filters subscriptions by pricing frequency | | orderReferenceCode | stringFilters subscriptions by order reference code | | applicationIds | numberFilters subscriptions by internal application ID | | fromCreationDate | numberFilters results to only include subscriptions that were created on or after the specified date | | toCreationDate | numberFilters results to only include subscriptions that were created on or before the specified date | | count | integerDefault:250Number of results to fetch. Used for paging. | | sortField | stringDefault:"DATE"Enum: "DATE" "ORDER\_ID" "TOTAL"Sort field. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order. | | start | integerDefault:0First result index. Used for paging. | ### Responses **200** Response. get/billing/v1/companies/{companyId}/users/{userId}/orders https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/orders https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/orders ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/companies/%7BcompanyId%7D/users/%7BuserId%7D/orders?startDateFrom=SOME_NUMBER_VALUE&startDateTo=SOME_NUMBER_VALUE&status=SOME_STRING_VALUE¤cy=SOME_STRING_VALUE&type=SOME_STRING_VALUE&frequency=SOME_STRING_VALUE&orderReferenceCode=SOME_STRING_VALUE&applicationIds=SOME_NUMBER_VALUE&fromCreationDate=SOME_NUMBER_VALUE&toCreationDate=SOME_NUMBER_VALUE&count=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PurchaseOrder/operation/resource_Other_readOrderPayments_GET)List all purchase order payments List all purchase order payments ##### path Parameters | | | | --------------- | -------------------------------------------------------------- | | orderIdrequired | numberThe specific order id for which information is requested | ##### query Parameters | | | | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | count | stringDefault:"250"Number of results to fetch. Used for paging. | | fromDate | numberFilter by the start date of the invoice | | method | stringEnum: "ADP\_INVOICE" "ARIBAPAY" "BT\_BILL" "CLICKANDBUY" "CLOUDFOUNDRY" "CREDIT\_CARD" "CUMULA\_BILL" "DTAG" "EXTERNAL\_INVOICE" "KREDITKARTE" "LASTSCHRIFT\_MRNEXNET" "MANO\_TEO\_BILL" "MANUAL" "MARKETPLACE\_CREDITS" "NETS\_ARVATO\_INVOICE" "NEXTEL" "PAYPAL" "ROGERS\_CC\_DTMF" "ROGERS\_CC\_POS" "SNAP" "TBILL" "THISTLE" "TOICLEARING"Filter by method of the payment | | result | stringEnum: "FAILED" "GATEWAY\_NOT\_AVAILABLE" "MANUAL" "SUCCESSFUL"Filter by results of the payment | | sortField | stringDefault:"PAYMENT\_ID"Enum: "AMOUNT" "DATE" "PAYMENT\_ID"The filed to be used for sorting com.appdirect.backend.api.billing.types.OrderSortWS. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order org.springframework.data.domain.Sort.Direction. | | start | stringDefault:"0"First result index. Used for paging. | | toDate | numberFilter by the end date of the invoice | ### Responses **200** OK **404** Not Found get/billing/v1/orders/{orderId}/payments https\://marketplace.appdirect.com/api/billing/v1/orders/{orderId}/payments https\://virtserver.swaggerhub.com/billing/v1/orders/{orderId}/payments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/orders/%7BorderId%7D/payments?count=SOME_STRING_VALUE&fromDate=SOME_NUMBER_VALUE&method=SOME_STRING_VALUE&result=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_STRING_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PurchaseOrder/operation/resource_Other_readPurchaseOrders_GET)List all purchase orders List all purchase orders ##### Required Scopes and Authorization Rules * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### query Parameters | | | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | startDateFrom | numberFilters results to only include subscriptions that were started on or after the specified date | | startDateTo | numberFilters results to only include subscriptions that were started on or before the specified date | | status | stringEnum: "INITIALIZED" "PENDING\_USER\_APPROVAL" "PENDING\_REMOTE\_CREATION" "PENDING\_MANUAL\_RECOVERY" "PENDING\_ASYNCHRONOUS\_CREATION" "FREE\_TRIAL" "ACTIVE" "FINISHED" "ONE\_TIME" "CANCELLED" "SUSPENDED" "FREE\_TRIAL\_EXPIRED" "FREE\_TRIAL\_CANCELLED" "DELETED" "FAILED" "UPCOMING" "PENDING\_MIGRATION\_ACTIVATION" "PENDING\_DELAYED\_PROVISIONING"Filters orders with an order status | | currency | stringEnum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Filters orders by currency | | type | stringEnum: "NEW" "MIGRATION" "ADOPTION" "FREE\_TRIAL\_ACTIVATION" "TERMINATION\_FEE" "END\_OF\_CONTRACT\_MIGRATION" "REFUND" "CREDIT" "ONE\_TIME\_FEE" "ADDITIONAL\_FEE" "END\_OF\_DISCOUNT\_MIGRATION" "METERED\_USAGE"Filters orders by type.
NEW: The first order of a subscription. The order contains flat fees (one time or recurring) for this subscription. It is active until the subscription is updated or canceled.
MIGRATION: The order created after a subscription change. The order includes flat fees for both one-time and recurring editions.
ADOPTION: The order created by an administrator who has taken ownership of an application from another user within the same company.
FREE\_TRIAL\_ACTIVATION: Created when a free trial is manually upgraded to a paid subscription. Any subscription that is updated from free trial to paid automatically keeps its NEW status purchase order.
TERMINATION\_FEE: A subscription is canceled that had a termination fee. This purchase order represents the fees incurred as a result of the cancellation.
END\_OF\_CONTRACT\_MIGRATION: Created when a subscription update takes place as a result of a contract extension. If the contract autorenewal is set to either continue without a contract or renew the contract with the same pricing plan, then no migration occurs and the original purchase order is updated to include the new end date for the contract.
REFUND: Created when a refund is performed. The refund purchase order is created for only on-platform refunds. Off-platform refunds do not generate this type of purchase order.
CREDIT: Created during subscription update events. Any subscription update calculates a paid period and a credit period. The credit is then provided to the user to prorate the subscription.
ONE\_TIME\_FEE: Created if an edition includes one-time setup fees.
ADDITIONAL\_FEE: Used for off-order charges. A developer change creates an off-order charge and charges their customer a custom amount outside of the normal subscription cycle.
END\_OF\_DISCOUNT\_MIGRATION: Created after a discount of limited duration expires. This purchase order is created to represent the updated costs without the discount.
METERED\_USAGE: A purchase order created to accumulate usage fees during a billing period. The order is only valid for the billing period but it is updated with usage lines over the course of the billing period. A metered purchase order is invoiced in arrears at the end of the billing cycle. | | frequency | stringEnum: "ONE\_TIME" "MONTHLY" "QUARTERLY" "SIX\_MONTHS" "YEARLY" "TWO\_YEARS" "THREE\_YEARS" "DAILY"Filters orders by payment frequency | | orderReferenceCode | stringFilters orders by order reference code | | applicationIds | numberFilters orders by internal application ID | | fromCreationDate | numberFilters results to only include subscriptions that were created on or after the specified date | | toCreationDate | numberFilters results to only include subscriptions that were created on or before the specified date | | page | integerDefault:0First result index. Used for paging. | | referenceCode | stringDefault:""Code provided by resellers and Sales Reps while purchasing a subscription | | size | integerDefault:50Number of results to fetch. Used for paging. | | sortField | stringDefault:"DATE"Enum: "DATE" "ORDER\_ID" "TOTAL"The filed to be used for sorting com.appdirect.backend.api.billing.types.OrderSortWS. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order org.springframework.data.domain.Sort.Direction. | ### Responses **200** OK **404** Not Found get/billing/v1/orders https\://marketplace.appdirect.com/api/billing/v1/orders https\://virtserver.swaggerhub.com/billing/v1/orders ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/orders?startDateFrom=SOME_NUMBER_VALUE&startDateTo=SOME_NUMBER_VALUE&status=SOME_STRING_VALUE¤cy=SOME_STRING_VALUE&type=SOME_STRING_VALUE&frequency=SOME_STRING_VALUE&orderReferenceCode=SOME_STRING_VALUE&applicationIds=SOME_NUMBER_VALUE&fromCreationDate=SOME_NUMBER_VALUE&toCreationDate=SOME_NUMBER_VALUE&page=SOME_INTEGER_VALUE&referenceCode=SOME_STRING_VALUE&size=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PurchaseOrder/operation/resource_Other_readPurchaseOrder_GET)Retrieve a purchase order Retrieve a purchase order.

Rate limit: Bucket size is 20 requests, with a leak rate of 4 requests per second.

Rate limit uses [leaky bucket algorithm](https://en.wikipedia.org/wiki/Leaky_bucket). Usage of a leaky bucket algorithm allows client applications to make an unlimited number of requests over a large time horizon but prevents excessively large bursts over a short one. ##### path Parameters | | | | --------------- | -------------------------------------------------------------- | | orderIdrequired | numberThe specific order id for which information is requested | ##### query Parameters | | | | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | expand | Array of stringsProvide the list of comma separated resource name (possible values = "user,company,salesSupportUser") which is needed to be expanded in the response | ### Responses **200** OK **404** Not Found get/billing/v1/orders/{orderId} https\://marketplace.appdirect.com/api/billing/v1/orders/{orderId} https\://virtserver.swaggerhub.com/billing/v1/orders/{orderId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/orders/%7BorderId%7D?expand=SOME_ARRAY_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PurchaseOrder/operation/resource_Other_updateOrderConfiguration_PUT)Update purchase order configuration details Update purchase order configuration details ##### path Parameters | | | | --------------- | ------------------------------------------------- | | orderIdrequired | numberId of the specific purchase order to update | ##### Request Body schema: application/json List of parameters which needs to be update Array | | | | ----- | -------------- | | name | string or null | | value | string or null | ### Responses **200** OK put/billing/v1/orders/{orderId}/parameters https\://marketplace.appdirect.com/api/billing/v1/orders/{orderId}/parameters https\://virtserver.swaggerhub.com/billing/v1/orders/{orderId}/parameters ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `[ { "name": "...", "value": "..." } ]` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/PurchaseOrder/operation/resource_Other_readOrderInvoices_GET)List all purchase order invoices List all purchase order invoices ##### path Parameters | | | | --------------- | -------------------------------------------------------------- | | orderIdrequired | numberThe specific order id for which information is requested | ##### query Parameters | | | | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | count | stringDefault:"250"Number of results to fetch. Used for paging. | | excludeFree | booleanExclude invoices whose amount is zero | | fromDate | numberFilter by the start date of the invoice | | sortField | stringDefault:"INVOICE\_ID"Enum: "DATE" "INVOICE\_ID" "TOTAL"The filed to be used for sorting com.appdirect.backend.api.billing.types.OrderSortWS. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order org.springframework.data.domain.Sort.Direction. | | start | stringDefault:"0"First result index. Used for paging. | | status | stringEnum: "CARRIED" "PAID" "UNPAID" "VOIDED"Filter by the status of the invoice | | toDate | numberFilter by the end date of the invoice | ### Responses **200** OK **404** Not Found get/billing/v1/orders/{orderId}/invoices https\://marketplace.appdirect.com/api/billing/v1/orders/{orderId}/invoices https\://virtserver.swaggerhub.com/billing/v1/orders/{orderId}/invoices ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/orders/%7BorderId%7D/invoices?count=SOME_STRING_VALUE&excludeFree=SOME_BOOLEAN_VALUE&fromDate=SOME_NUMBER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_STRING_VALUE&status=SOME_STRING_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample # [](#tag/AppResellerOrder)Purchase Orders (Reseller) ## [](#tag/AppResellerOrder/operation/resource_AppResellerBillingV1OrderUIApi_GET)List orders Retrieves a list of all user orders of a linked company. You can filter the list using optional query parameters. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the company ##### query Parameters | | | | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringValue: "RESELLER, RESELLER\_MANAGER"Supported billing contexts | | number | integerPage number | | size | integerNumber of results per page | | sort | stringSort field and order. For ascending sort order, use the '+\[FieldName]' format. For descending order, use the '-\[FieldName]' format. | | userId | stringFor RESELLER, the customer's user ID; for RESELLER\_MANAGER, the Reseller's user ID | | resellerCompanyIdrequired | stringReseller's company ID. Required only for the RESELLER\_MANAGER context. | | customerCompanyIdrequired | stringUser's company ID. Required only for the RESELLER context. | | createdOn | stringDate filter, defined by upper or lower inclusive or exclusive limits, in Unix timestamp format. Acceptable values are: gte(\[timestamp]) - 'greater than or equal to'; gt(\[timestamp]) - 'greater than'; lte(\[timestamp]) - 'less than or equal to'; or lt(\[timestamp]) - 'less than.' | | status | stringOrder status (valid status are INITIALIZED, PENDING\_USER\_APPROVAL, PENDING\_REMOTE\_CREATION, PENDING\_MANUAL\_RECOVERY, PENDING\_ASYNCHRONOUS\_CREATION, FREE\_TRIAL, ACTIVE, FINISHED, ONE\_TIME, CANCELLED, SUSPENDED, FREE\_TRIAL\_EXPIRED, FREE\_TRIAL\_CANCELLED, DELETED, FAILED, UPCOMING, PENDING\_MIGRATION\_ACTIVATION, PENDING\_DELAYED\_PROVISIONING) | | paidStatus | stringValue: "PAID, FREE"Status of the subscription related to the payment of this order | | pending | booleanIndicates whether order has pending events | | searchText | stringSearch text | ### Responses **200** Success **401** Unauthorized get/appReseller/v1/orders https\://marketplace.appdirect.com/api/appReseller/v1/orders https\://virtserver.swaggerhub.com/appReseller/v1/orders ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/orders?context=SOME_STRING_VALUE&number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sort=SOME_STRING_VALUE&userId=SOME_STRING_VALUE&resellerCompanyId=SOME_STRING_VALUE&customerCompanyId=SOME_STRING_VALUE&createdOn=SOME_STRING_VALUE&status=SOME_STRING_VALUE&paidStatus=SOME_STRING_VALUE&pending=SOME_BOOLEAN_VALUE&searchText=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "1234", "createdOn": 1529083173000, "status": "ACTIVE", "frequency": "One Time", "totalFee": "USD350.00", "applicationName": "AUTO_DISCOUNTS_APP", "editionName": "Edition", "orderCardId": "4567", "company": { "id": "698555fc-bc65-4163-9fee-16308edec41b", "name": "Company A" } }, { "id": "4567", "createdOn": 1529083173000, "status": "PENDING MANUAL RECOVERY", "frequency": "One Time", "totalFee": "USD350.00", "applicationName": "AUTO_DISCOUNTS_APP", "editionName": "Edition", "orderCardId": "4567", "company": { "id": "386626c0-53e2-4515-8450-4a720bb5d029", "name": "Company B" } } ], "page": { "size": 10, "totalElements": 2, "totalPages": 1, "number": 1 } }` # [](#tag/AppResellerQuoteVersion)Quote Versions ## [](#tag/AppResellerQuoteVersion/operation/createQuote)Create quote version Creates a quote version from a quote source Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity ##### Request Body schema: application/jsonrequired Details about the quote version being created | | | | ----------------- | ------------------------------------------- | | name | stringThe name of the quote version | | createdByrequired | object (User) | | sourcerequired | object (QuoteVersionSource) | ### Responses **200** Success **401** Unauthorized **404** Not found post/assistedSales/v1/quotes https\://marketplace.appdirect.com/api/assistedSales/v1/quotes https\://virtserver.swaggerhub.com/assistedSales/v1/quotes ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "source": { "id": "1798fb8f-9f55-43f6-9f5e-4980467df9af", "type": "OPPORTUNITY" }, "name": "Quote version name", "createdBy": { "id": "d17fee11-c6ce-4f9f-8fb6-9bc55d583699", "company": { "id": "d9a6d470-c69a-4403-9355-5953ddcb9efb" } } }` ### Response samples * 200 * 401 * 404 Content type application/json Copy Expand all Collapse all `{ "id": "e8801dc6-8c0f-4c0b-82bc-99c4ebfb5e8a", "name": "API quote version", "createdOn": 1674590164842, "createdBy": { "id": "d17fee11-c6ce-4f9f-8fb6-9bc55d583699", "email": "customer@appdirect.com", "firstName": "Customer FirstName", "lastName": "Customer LastName", "company": { "id": "d9a6d470-c69a-4403-9355-5953ddcb9efb" } }, "status": "OPEN", "ownerUser": { "id": "a6cc4e69-74e0-47f4-b36d-215693f47165", "email": "owner@appdirect.com", "firstName": "Owner FirstName", "lastName": "Owner LastName", "company": { "id": "05ba75d3-3637-4a7a-807d-f2cb66466348" } }, "customerUser": { "id": "d17fee11-c6ce-4f9f-8fb6-9bc55d583699", "email": "customer@appdirect.com", "firstName": "Customer FirstName", "lastName": "Customer LastName", "company": { "id": "d9a6d470-c69a-4403-9355-5953ddcb9efb" } }, "availableActions": [ "PRINT_PDF", "EDIT_NAME", "REQUEST_CUSTOMER_APPROVAL" ] }` ## [](#tag/AppResellerQuoteVersion/operation/readQuotes)A list of quote versions List quote versions based on a source type and ID Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity ##### query Parameters | | | | ---------- | --------------------------------------------------------------------------------------------- | | sourceId | stringThe source ID | | sourceType | stringEnum: "OPPORTUNITY" "PLACE\_HOLDER"The source type of the quote version | | status | stringThe status of the quote version | | after | stringThe page number | | first | integerThe number of results per page to return | ### Responses **200** Success **401** Unauthorized **404** Not found get/assistedSales/v1/quotes https\://marketplace.appdirect.com/api/assistedSales/v1/quotes https\://virtserver.swaggerhub.com/assistedSales/v1/quotes ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/assistedSales/v1/quotes?sourceId=SOME_STRING_VALUE&sourceType=SOME_STRING_VALUE&status=SOME_STRING_VALUE&after=SOME_STRING_VALUE&first=SOME_INTEGER_VALUE' ``` ### Response samples * 200 * 401 * 404 Content type application/json Copy Expand all Collapse all `{ "quotes": [ { "id": "e8801dc6-8c0f-4c0b-82bc-99c4ebfb5e8a", "displayId": "Q6201242", "name": "API quote version", "createdOn": 1674590164842, "createdBy": { "id": "d17fee11-c6ce-4f9f-8fb6-9bc55d583699", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "d9a6d470-c69a-4403-9355-5953ddcb9efb" } }, "status": "OPEN", "ownerUser": { "id": "a6cc4e69-74e0-47f4-b36d-215693f47165", "email": "john.doe@acme.com", "firstName": "John", "lastName": "Doe", "company": { "id": "05ba75d3-3637-4a7a-807d-f2cb66466348" } }, "customerUser": { "id": "d17fee11-c6ce-4f9f-8fb6-9bc55d583699", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "d9a6d470-c69a-4403-9355-5953ddcb9efb" } }, "availableActions": [ "PRINT_PDF", "EDIT_NAME", "REQUEST_CUSTOMER_APPROVAL" ] }, { "id": "757d0f09-385c-41df-9781-d6df98584953", "displayId": "Q5701241", "name": "API quote version", "createdOn": 1674574349898, "createdBy": { "id": "d17fee11-c6ce-4f9f-8fb6-9bc55d583699", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "d9a6d470-c69a-4403-9355-5953ddcb9efb" } }, "status": "PENDING", "ownerUser": { "id": "a6cc4e69-74e0-47f4-b36d-215693f47165", "email": "john.doe@acme.com", "firstName": "John", "lastName": "Doe", "company": { "id": "05ba75d3-3637-4a7a-807d-f2cb66466348" } }, "customerUser": { "id": "d17fee11-c6ce-4f9f-8fb6-9bc55d583699", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "d9a6d470-c69a-4403-9355-5953ddcb9efb" } }, "availableActions": [ "PRINT_PDF", "EDIT_NAME", "SHARE_LINK", "REVOKE" ] } ], "pageInfo": { "startCursor": "MA==", "endCursor": "MA==", "hasNextPage": false, "hasPreviousPage": false }, "totalCount": 2 }` ## [](#tag/AppResellerQuoteVersion/operation/executeAction)Execute action on a quote version Execute the action passed by the parameter on the quote version Required: Accept-Language header with Locale format. For example: en-US" ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity ##### path Parameters | | | | --------------- | ------------------------------- | | quoteIdrequired | stringThe ID of a quote version | ##### Request Body schema: application/jsonrequired Details about the action to be executed on the quote version | | | | -------------- | --------------------------------------------------- | | actionrequired | stringAction name to be executed to a quote version | ### Responses **200** Success **401** Unauthorized **404** Not found post/assistedSales/v1/quotes/{quoteId}/executeAction https\://marketplace.appdirect.com/api/assistedSales/v1/quotes/{quoteId}/executeAction https\://virtserver.swaggerhub.com/assistedSales/v1/quotes/{quoteId}/executeAction ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "action": "REQUEST_CUSTOMER_APPROVAL" }` ### Response samples * 200 * 401 * 404 Content type application/json Copy Expand all Collapse all `{ "id": "757d0f09-385c-41df-9781-d6df98584953", "name": "API quote version", "createdBy": { "id": "d17fee11-c6ce-4f9f-8fb6-9bc55d583699", "company": { "id": "d9a6d470-c69a-4403-9355-5953ddcb9efb" } }, "status": "PENDING", "availableActions": [ "PRINT_PDF", "EDIT_NAME", "SHARE_LINK", "REVOKE" ] }` ## [](#tag/AppResellerQuoteVersion/operation/getQuoteById)Get a quote version Get a quote version from a quote ID Required: Accept-Language header with Locale format. For example: en-US ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller to the opportunity * `ROLE_SALES_SUPPORT` - Allows access as Sales Support to the opportunity * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager to the opportunity * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager to the opportunity ##### path Parameters | | | | --------------- | ------------------------------- | | quoteIdrequired | stringThe ID of a quote version | ### Responses **200** Success **401** Unauthorized **404** Not found get/assistedSales/v1/quotes/{quoteId} https\://marketplace.appdirect.com/api/assistedSales/v1/quotes/{quoteId} https\://virtserver.swaggerhub.com/assistedSales/v1/quotes/{quoteId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/assistedSales/v1/quotes/%7BquoteId%7D ``` ### Response samples * 200 * 401 * 404 Content type application/json Copy Expand all Collapse all `{ "id": "757d0f09-385c-41df-9781-d6df98584953", "displayId": "Q5701241", "name": "API quote version", "createdOn": 1674574349898, "createdBy": { "id": "d17fee11-c6ce-4f9f-8fb6-9bc55d583699", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "d9a6d470-c69a-4403-9355-5953ddcb9efb" } }, "status": "OPEN", "ownerUser": { "id": "a6cc4e69-74e0-47f4-b36d-215693f47165", "email": "john.doe@acme.com", "firstName": "John", "lastName": "Doe", "company": { "id": "05ba75d3-3637-4a7a-807d-f2cb66466348" } }, "customerUser": { "id": "d17fee11-c6ce-4f9f-8fb6-9bc55d583699", "email": "jane.smith@company.com", "firstName": "Jane", "lastName": "Smith", "company": { "id": "d9a6d470-c69a-4403-9355-5953ddcb9efb" } }, "currency": "USD", "pricingTotals": { "amountDueBeforeTax": "55.0000000000", "amountDueAfterTax": "55.0000000000", "taxSummary": [ ], "recurringTotals": [ { "billingCycle": { "period": "MONTHLY", "dayOfMonth": 24 }, "totalSalePrice": "55.0000000000" } ] }, "items": [ { "id": "166e0ce6-4309-4a16-ac9b-61bea7ce1cbc", "product": { "id": "fa776d2e-cda5-4256-9a27-125a0fe3f448", "name": "Supported Product for Opportunity MVP", "editionId": "b06358bc-cb63-45e6-87c7-19db9b0cf696" }, "pricingPlan": { "id": "19c06143-b21c-43c4-b236-eeca61512753", "name": "Gold plan" }, "pricing": [ { "costType": "RECURRING_FLAT", "description": "Gold plan", "quantity": "1.0000000000", "totalSalePrice": "55.0000000000", "salePrice": "55.0000000000" }, { "costType": "INCLUDED", "description": "Per User Fee Included", "quantity": "1.0000000000", "totalSalePrice": "0.0000000000", "salePrice": "0.0000000000" } ] } ], "quoteSource": { "id": "1798fb8f-9f55-43f6-9f5e-4980467df9af", "type": "OPPORTUNITY" }, "availableActions": [ "PRINT_PDF", "EDIT_NAME", "REQUEST_CUSTOMER_APPROVAL" ] }` # [](#tag/Reconciliation)Reconciliation ## [](#tag/Reconciliation/operation/getLedgerLineDetails)Retrieve ledger lines Retrieve ledger lines generated for a specific role. Example, retrieve all ledger lines that a reseller manager has against all resellers ##### query Parameters | | | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringValue: "RESELLER\_MANAGER"Currently only supported value is 'RESELLER\_MANAGER' | | page | integerPage number to be returned in the result. Default value is 1 | | size | integerSize of the page to be returned. Default value is 50, maximum allowed is 250 | | sortOrder | stringEnum: "ASC" "DESC"Sorting is done against 'reconciliationDate'. Defaults to sorting in ascending order | | fromDate | numberFilters ledger lines from given date. Filtering is performed against the reconciliation date of the ledger line. The parameter represents milliseconds since epoch date, but only the date part is taken into account. The time component is ignored | | toDate | numberFilters ledger lines until given date. Filtering is performed against the reconciliation date of the ledger line. The parameter represents milliseconds since epoch date, but only the date part is taken into account. The time component is ignored | | reconciliationType | stringEnum: "ITEM" "TAX" "DISCOUNT" "TERMINATION\_FEE" "ADJUSTMENT" "RESELLER\_MARKUP" "CHANNEL\_MARKUP" "APPDIRECT\_FEE"Filters by ledger line reconciliation type | | operationType | stringEnum: "CREDIT" "DEBIT"Filters by ledger line operation type | ### Responses **200** OK **400** Bad Request, typically bad query parameters **401** Invalid authentication **403** Invalid authorization get/v3/reconciliation/ledgerLines https\://marketplace.appdirect.com/api/v3/reconciliation/ledgerLines https\://virtserver.swaggerhub.com/v3/reconciliation/ledgerLines ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/v3/reconciliation/ledgerLines?context=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sortOrder=SOME_STRING_VALUE&fromDate=SOME_NUMBER_VALUE&toDate=SOME_NUMBER_VALUE&reconciliationType=SOME_STRING_VALUE&operationType=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "links": [ ], "content": [ { "id": 6, "currency": "JPY", "amount": 10, "customer": { "id": 4712, "username": "enduser003@appdirect.com", "email": "enduser003@appdirect.com", "uuid": "62c8b934-aca8-4ed2-bcd5-8f798fd19355" }, "issuerParty": { "id": "RESELLERSMARKETPLACE", "uuid": "5d08ea40-c948-40e2-9335-1f3c513a6524", "type": "CHANNEL", "name": "RESELLER MARKETPLACE" }, "recipientParty": { "id": "4052", "uuid": "d282c59d-129a-4281-b390-a7d61876d9ce", "type": "RESELLER", "name": "Reseller Company 02" }, "type": "DEBIT", "transferStatus": "OPEN", "reconciliationType": "ITEM", "reconciliationDate": 1506083747000, "createdOn": 1506083752000, "lastModified": 1506083752000, "payments": [ { "id": 5881, "type": "MANUAL" } ], "invoiceId": 8568, "orderId": 3598, "productId": 3402, "productName": "TEST", "editionId": 7552, "editionName": "Recurring Edition", "editionPricingItemId": 14467, "lineItemDescription": "TEST - Recurring Edition - Monthly Fee Period from 09/22/17 to 10/22/17", "lineItemType": "ITEM" }, { "id": 5, "currency": "JPY", "amount": 10, "customer": { "id": 4712, "username": "enduser003@appdirect.com", "email": "enduser003@appdirect.com", "uuid": "62c8b934-aca8-4ed2-bcd5-8f798fd19355" }, "issuerParty": { "id": "4052", "uuid": "d282c59d-129a-4281-b390-a7d61876d9ce", "type": "RESELLER", "name": "Reseller Company 02" }, "recipientParty": { "id": "RESELLERSMARKETPLACE", "uuid": "5d08ea40-c948-40e2-9335-1f3c513a6524", "type": "CHANNEL", "name": "RESELLER MARKETPLACE" }, "type": "CREDIT", "transferStatus": "OPEN", "reconciliationType": "ITEM", "reconciliationDate": 1506083747000, "createdOn": 1506083752000, "lastModified": 1506083752000, "payments": [ { "id": 5881, "type": "MANUAL" } ], "invoiceId": 8568, "invoiceLineId": 8569, "orderId": 3598, "productId": 3402, "productName": "TEST", "editionId": 7552, "editionName": "Recurring Edition", "editionPricingItemId": 14467, "lineItemDescription": "TEST - Recurring Edition - Monthly Fee Period from 09/22/17 to 10/22/17", "lineItemType": "ITEM" } ], "page": { "size": 50, "totalElements": 2, "totalPages": 1, "number": 1 } }` # [](#tag/AppResellerReconciliation)Reconciliation (Reseller) ## [](#tag/AppResellerReconciliation/operation/readTransfers)List transfers Retrieves all transfers ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows Resellers to access their transfers ##### query Parameters | | | | ------ | ----------------------------------------------------------- | | number | integerDefault:1Page number | | size | integerDefault:10Number of results per page | ### Responses **200** A pageable list of transfers **403** Forbidden **404** Not found **503** Service unavailable get/reseller/v1/reconciliation/transfers https\://marketplace.appdirect.com/api/reseller/v1/reconciliation/transfers https\://virtserver.swaggerhub.com/reseller/v1/reconciliation/transfers ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/reseller/v1/reconciliation/transfers?number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE' ``` ### Response samples * 200 * 403 * 404 * 503 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "2319ee21-185c-485e-bcb0-18328b49b58f", "transferRequestId": 3, "status": "COMPLETE", "accountReceivable": 0, "accountPayable": 52, "netReceivable": 0, "netPayable": 52, "currency": "USD", "transferDate": 1572451157602 }, { "id": "43a9d114-7157-4e91-a2ed-7c683aba068e", "transferRequestId": 2, "status": "COMPLETE", "accountReceivable": 0, "accountPayable": 15, "netReceivable": 0, "netPayable": 15, "currency": "USD", "transferDate": 1572378298608 }, { "id": "875ce19f-1dfb-4ff8-aad0-f4c2fe866d44", "transferRequestId": 1, "status": "COMPLETE", "accountReceivable": 13.5, "accountPayable": 59, "netReceivable": 0, "netPayable": 45.5, "currency": "USD", "transferDate": 1572359937730 } ], "page": { "size": 3, "number": 1, "totalElements": 3, "totalPages": 1 } }` ## [](#tag/AppResellerReconciliation/operation/readTransfer)Retrieve transfer details Retrieves the summary of a transfer, which includes the date of the transfer, the transfer status, currency, net payable and net receivable ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows Resellers to access their transfer details ##### path Parameters | | | | ------------------ | ----------------- | | transferIdrequired | stringTransfer ID | ### Responses **200** The overview of the transfer **403** Forbidden **404** Not found **503** Service unavailable get/reseller/v1/reconciliation/transfers/{transferId} https\://marketplace.appdirect.com/api/reseller/v1/reconciliation/transfers/{transferId} https\://virtserver.swaggerhub.com/reseller/v1/reconciliation/transfers/{transferId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/reseller/v1/reconciliation/transfers/%7BtransferId%7D ``` ### Response samples * 200 * 403 * 404 * 503 Content type application/json Copy `{ "id": "2319ee21-185c-485e-bcb0-18328b49b58f", "transferRequestId": 3, "status": "COMPLETE", "accountReceivable": 0, "accountPayable": 52, "netReceivable": 0, "netPayable": 52, "currency": "USD", "transferDate": 1572451157602 }` ## [](#tag/AppResellerReconciliation/operation/readTransferDetails)List transfer ledger lines Retrieves the ledger lines of a transfer ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows Resellers to access their transfer ledger lines ##### path Parameters | | | | ------------------ | ----------------- | | transferIdrequired | stringTransfer ID | ##### query Parameters | | | | ------ | ---------------------------------------------------------- | | number | integerDefault:1Page number | | size | integerDefault:5Number of results per page | ### Responses **200** The ledger lines of the transfer **403** Forbidden **404** Not found **503** Service unavailable get/reseller/v1/reconciliation/transfers/{transferId}/details https\://marketplace.appdirect.com/api/reseller/v1/reconciliation/transfers/{transferId}/details https\://virtserver.swaggerhub.com/reseller/v1/reconciliation/transfers/{transferId}/details ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/reseller/v1/reconciliation/transfers/%7BtransferId%7D/details?number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE' ``` ### Response samples * 200 * 403 * 404 * 503 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": 72, "currency": "USD", "credit": 52, "debit": 0, "customer": "Appdirect", "product": "FEATURED_WEBAPP" } ], "page": { "size": 1, "number": 1, "totalElements": 1, "totalPages": 1 } }` # [](#tag/Reporting)Reports v1 ## [](#tag/Reporting/operation/resource_Other_readReports_v1_GET)List all reports Lists all reports that are automatically generated on your marketplace. ##### query Parameters | | | | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | count | integerThe number of reports to return from the results | | fromDate | numberThe report generation start date and time, in epoch time | | start | integerThe lower bound index for the requested results | | toDate | numberThe report generation end date and time, in epoch time | | type | stringEnum: "ACTIVE\_UNCONVERTED\_USERS" "APPLICATION\_USAGE" "CANCELLED\_ENTITLEMENTS" "COMPANIES\_CSV" "CONTRACT\_TERM" "CUSTOMERS\_CSV" "CUSTOMER\_ACQUISITION\_BONUS" "CUSTOMER\_RETENTION\_BONUS" "FAILED\_ORDERS" "FAILURE\_INTEGRATION\_EVENT" "FREE\_TRIALS" "GENERAL\_PERFORMANCE\_REPORT" "INVOICES" "INVOICES\_CSV" "MICROSOFT\_RECONCILIATION" "MIGRATION\_PRODUCT\_DATA" "MOSI\_ACQUISITION\_BONUS" "MOSI\_RETENTION\_BONUS" "NOT\_USED\_APP" "ORDER\_EDITIONS\_CSV" "ORDER\_PRODUCTS\_CSV" "PAYMENTS\_DETAIL\_CSV" "PAYMENTS\_OVERVIEW\_CSV" "RECONCILIATION" "RE\_CALCULATE\_SUBSCRIPTION\_PRICES" "SUSPENDED\_PURCHASED" "TAXES" "TRANSACTIONS" "VOICE\_CONN\_CSV"Report type | ### Responses **200** Success get/reporting/v1/reports https\://marketplace.appdirect.com/api/reporting/v1/reports https\://virtserver.swaggerhub.com/reporting/v1/reports ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/reporting/v1/reports?count=SOME_INTEGER_VALUE&fromDate=SOME_NUMBER_VALUE&start=SOME_INTEGER_VALUE&toDate=SOME_NUMBER_VALUE&type=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Reporting/operation/resource_Other_readReport_GET)Retrieve a report This call returns all details from a specific report. ##### path Parameters | | | | ---------- | --------------- | | idrequired | numberReport ID | ### Responses **307** Report redirect url returned. **404** Report not found. get/reporting/v1/report/{id} https\://marketplace.appdirect.com/api/reporting/v1/report/{id} https\://virtserver.swaggerhub.com/reporting/v1/report/{id} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/reporting/v1/report/%7Bid%7D ``` ## [](#tag/Reporting/operation/resource_Other_deleteReport_DELETE)Delete report This call deletes a report from your marketplace ##### path Parameters | | | | ---------- | --------------- | | idrequired | numberReport ID | ### Responses **204** Report deleted. **404** Report not found. **500** Internal error during deletion delete/reporting/v1/report/{id} https\://marketplace.appdirect.com/api/reporting/v1/report/{id} https\://virtserver.swaggerhub.com/reporting/v1/report/{id} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/reporting/v1/report/%7Bid%7D ``` # [](#tag/Reporting-V2)Reports V2 ## [](#tag/Reporting-V2/operation/resource_Report_readReports_v2_GET)List all reports Lists all reports generated from your marketplace. ##### query Parameters | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ownerType | stringEnum: "ROLE\_CHANNEL\_ADMIN" "ROLE\_DEVELOPER" "ROLE\_RESELLER\_MANAGER" "ROLE\_PARTNER"The owner type that is allowed access to the reports | | reportName | stringFilter reports by name | | date | stringTime bound for filtering reports based on the from\_date and to\_date fields. Use gte(\[Unix timestamp]) for a lower bound (inclusive) or lte(\[Unix timestamp]) for an upper bound (inclusive). The timestamp must be in milliseconds. | | number | integerDefault:1The page number of the requested result. The first page has index 1 | | size | integerDefault:50The page size of the requested result | | searchText | stringShow only reports whose names contain this text | ### Responses **200** A list of all all reports matching the search criteria **400** Input is invalid or malformed **403** The user identified by the incoming credentials cannot be resolved, or does not have the authorization to view reports of the requested owner type get/reporting/v2/reports https\://marketplace.appdirect.com/api/reporting/v2/reports https\://virtserver.swaggerhub.com/reporting/v2/reports ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/reporting/v2/reports?ownerType=SOME_STRING_VALUE&reportName=SOME_STRING_VALUE&date=SOME_STRING_VALUE&number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&searchText=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "uuid": "adb97bd6-6fc5-4540-939d-8b5b02bcd0a7", "reportName": "channel-payment-details", "jobName": "channel-payment-details-APPDIRECT", "name": "A sample report run", "ownerType": "ROLE_CHANNEL_ADMIN", "ownerCompanyId": null, "ownerPartner": "APPDIRECT", "status": "IN_PROGRESS", "runDate": 1519249651000, "fromDate": 1517443200000, "toDate": null, "params": { "paymentMethod": "NULL", "lineType": "NULL", "excludeFullyDiscounted": "NULL", "partner": "APPDIRECT", "type": "NULL" }, "createdBy": "John Smith", "formatType": "CSV" }, { "uuid": "dead040d-6ebf-41db-a554-cf6f7c8e1e25", "reportName": "customer-cancelled-entitlements", "jobName": "customer-cancelled-entitlements-APPDIRECT", "name": "A second sample report run", "ownerType": "ROLE_CHANNEL_ADMIN", "ownerCompanyId": null, "ownerPartner": "APPDIRECT", "status": "IN_PROGRESS", "runDate": 1519249646000, "fromDate": 1517443200000, "toDate": null, "params": { "partner": "APPDIRECT", "defaultMarketplaceCurrency": "USD" }, "createdBy": "John Smith", "formatType": "CSV" } ], "page": { "size": 50, "totalElements": 2, "totalPages": 1, "number": 1 } }` ## [](#tag/Reporting-V2/operation/resource_Report_downloadReports_v2GET)Download a report file Download an individual report ##### path Parameters | | | | ------------------ | ----------------- | | reportUuidrequired | stringReport UUID | ### Responses **307** Redirect to the S3-signed URL for downloading the report file **403** The user identified by the incoming credentials cannot be resolved, or is not authorized to download the requested report **404** No report exists for the UUID specified in the request get/reporting/v2/reports/{reportUuid} https\://marketplace.appdirect.com/api/reporting/v2/reports/{reportUuid} https\://virtserver.swaggerhub.com/reporting/v2/reports/{reportUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/reporting/v2/reports/%7BreportUuid%7D ``` # [](#tag/AppResellerCatalog)Reseller Catalog ## [](#tag/AppResellerCatalog/operation/sellableProducts_AppResellerCatalogV1Api_get_GET)List sellable products Retrieve all products that a Reseller can sell. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. ##### query Parameters | | | | ------------ | --------------------------------- | | page | integerPage number | | size | integerNumber of results per page | | searchText | stringSearch text | | targetUserId | stringCurrent user ID | ### Responses **200** Success **401** Unauthorized get/appReseller/v1/catalog/sellableProducts https\://marketplace.appdirect.com/api/appReseller/v1/catalog/sellableProducts https\://virtserver.swaggerhub.com/appReseller/v1/catalog/sellableProducts ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/catalog/sellableProducts?page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&searchText=SOME_STRING_VALUE&targetUserId=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "links": [ ], "content": [ { "id": "cf6ab187-000a-4571-8089-000019d68801", "name": "Product name 1", "blurb": "Product 1 short description", "provider": "Appdirect", "imageUrl": "https://appdirect.com/resource1", "visible": true }, { "id": "9b997bfc-000a-4ee3-b9f2-66d634ee993f", "name": "Product name 2", "blurb": "Product 2 short description", "provider": "Appdirect", "imageUrl": "https://appdirect.com/resource2", "visible": true } ], "page": { "size": 50, "totalElements": 2, "totalPages": 1, "number": 0 } }` ## [](#tag/AppResellerCatalog/operation/sellableProductEditions_AppResellerCatalogV1Api_get_GET)Edition details Get product editions, costs and markups. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. ##### path Parameters | | | | ----------------- | ---------------- | | productIdrequired | stringProduct ID | ##### query Parameters | | | | ------------ | ------------- | | targetUserId | stringUser ID | ### Responses **200** Success **401** Unauthorized get/appReseller/v1/catalog/sellableProducts/{productId}/editions https\://marketplace.appdirect.com/api/appReseller/v1/catalog/sellableProducts/{productId}/editions https\://virtserver.swaggerhub.com/appReseller/v1/catalog/sellableProducts/{productId}/editions ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/catalog/sellableProducts/%7BproductId%7D/editions?targetUserId=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `[ { "id": "12fe4576-0000-4d7b-bdf4-0000cd112b27", "name": "IT HelpDesk Session", "revenueType": "ONE_TIME", "paymentPlans": [ { "id": "28e14ece-00a0-0055-8000-0000c4c8e329", "frequency": "ONE_TIME", "minimumServiceLength": null, "cancellationPeriodLimit": null, "endOfContractGracePeriod": null, "costs": [ { "id": 54479, "unit": "SESSION", "unitDependency": null, "pricingStrategy": "UNIT", "minUnits": 0, "maxUnits": 111, "itemPrices": { "CAD": 60, "GBP": 60, "USD": 60, "IDR": 0 }, "markupPrices": [ { "markupType": "CHANNEL_RESELLER_COMPANY", "markupPrices": { "USD": 898989 } } ] } ] } ] } ]` # [](#tag/Search)Search ## [](#tag/Search/operation/users_index_search)Search content Search a unified index of content derived from a user's connected accounts. Requires a user-based token. ##### query Parameters | | | | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | qrequired | stringSearch query. The term(s) you are searching for. Format: URL-encoded string. For example: To search for Testing String, use Testing%20string | | number | numberDefault:1Which page of results to return. For example, to return the page with the 60th result, when there are 50 results per page (size), submit 2 to return the 2nd page of results. Max value: N/A | | size | numberDefault:50Page size: maximum number of search results per page. Max value: 250 | | sort | stringA URL-encoded value that defines how to sort the results. The supported values are +lastModified or -lastModified to sort by ascending/descending respectively. | ### Responses **200** Success get/appwise/v2/search https\://marketplace.appdirect.com/api/appwise/v2/search https\://virtserver.swaggerhub.com/appwise/v2/search ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appwise/v2/search?q=SOME_STRING_VALUE&number=SOME_NUMBER_VALUE&size=SOME_NUMBER_VALUE&sort=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "source": "5a70e453-49b4-49a5-bef4-879ddddc7e09", "title": "The White Tiger", "description": "Saw this last month. Movie exceeded my expectations, highly recommended. :)", "url": "https://www.somemoviewebsite.com/ca/movie/the-white-tiger", "author": "Bob Smith", "id": "79009-the-white-tiger-movie", "instance": "123", "resourceId": "the-white-tiger-movie", "contentType": "recommendation", "metadataType": "Movie", "metadataReleaseYear": "2021", "metadataRecommendedBy": "Jardani Reeves", "lastModified": "2021-05-28T20:20:06Z", "highlight": { "description": [ "Saw this last month. Movie exceeded my expectations, highly recommended. :)" ] } }, { "source": "5a70e453-49b4-49a5-bef4-879ddddc7e09", "title": "The Lord of the Rings: The Fellowship of the Ring", "description": "Best movie in the LOTR trilogy!!", "url": "https://www.somemoviewebsite.com/ca/movie/the-lord-of-the-rings-the-fellowship-of-the-ring", "author": "Bob Smith", "id": "79009-the-lord-of-the-rings-the-fellowship-of-the-ring-movie", "instance": "123", "resourceId": "the-lord-of-the-rings-the-fellowship-of-the-ring-movie", "contentType": "recommendation", "metadataType": "Movie", "metadataReleaseYear": "2001", "metadataRecommendedBy": "Mac Parker", "lastModified": "2021-05-28T20:11:44Z", "highlight": { "description": [ "Best movie in the LOTR trilogy!!" ] } }, { "source": "5a70e453-49b4-49a5-bef4-879ddddc7e09", "title": "Shrek", "description": "Fun movie", "url": "https://www.somemoviewebsite.com/ca/movie/shrek", "author": "Bob Smith", "id": "79009-shrek-movie", "instance": "123", "resourceId": "shrek-movie", "contentType": "recommendation", "metadataType": "Movie", "metadataReleaseYear": "2001", "metadataRecommendedBy": "Mac Parker", "lastModified": "2021-05-28T17:33:41Z", "highlight": { "description": [ "Fun movie" ] } } ], "page": { "size": 3, "totalElements": 8, "totalPages": 3, "number": 2 } }` # [](#tag/SegmentFolders)Segment Folders ## [](#tag/SegmentFolders/operation/createCompanyGroup)Create segment folders Creates a segment folder ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### Request Body schema: application/jsonrequired | | | | ------------ | ---------------------------------------------------------- | | namerequired | string<= 255 charactersSegment folder name | ### Responses **200** Success **400** Bad request **409** The segment folder name already exists for the partner post/channel/v1/companyGroups https\://marketplace.appdirect.com/api/channel/v1/companyGroups https\://virtserver.swaggerhub.com/channel/v1/companyGroups ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "name": "Fortune 500 Companies" }` ### Response samples * 200 * 400 * 409 Content type application/json Copy `{ "id": "7e3b3bb8-1b75-408b-8cbf-561ccd910479", "name": "Fortune 500 Companies", "enable": true, "partner": "APPDIRECT" }` ## [](#tag/SegmentFolders/operation/getCompanyGroups)Read segment folders Returns a paginated list of segment folders for the marketplace ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### query Parameters | | | | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | number | integerDefault:0Page number | | size | integer<= 250Default:50Number of results per page | | sort | stringDefault:"+name"Sort field and order. For ascending sort order, use the '+\[FieldName]' format. For descending order, use the '-\[FieldName]' format. | | name | stringSearch text | ### Responses **200** Success **400** Bad request get/channel/v1/companyGroups https\://marketplace.appdirect.com/api/channel/v1/companyGroups https\://virtserver.swaggerhub.com/channel/v1/companyGroups ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/companyGroups?number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sort=SOME_STRING_VALUE&name=SOME_STRING_VALUE' ``` ### Response samples * 200 * 400 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "7e3b3bb8-1b75-408b-8cbf-561ccd910479", "name": "Fortune 500 Companies", "partner": "APPDIRECT", "segments": [ { "id": "04f8d043-10f1-4b89-8c0e-0780e5a62299", "name": "iOS users", "partner": "APPDIRECT", "code": "IOS", "type": "MANUAL" } ] }, { "id": "7e3b3bb8-1b75-408b-8cbf-561ccd910479", "name": "Fortune 100 Companies", "partner": "APPDIRECT", "segments": [ { "id": "04f8d043-10f1-4b89-8c0e-0780e5a62299", "name": "Android users", "partner": "APPDIRECT", "code": "DROID", "type": "MANUAL" } ] } ], "page": { "number": 1, "size": 2, "totalElements": 10, "totalPages": 2 } }` ## [](#tag/SegmentFolders/operation/updateCompanyGroup)Update segment folders Updates a segment folder ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### path Parameters | | | | ---------------------- | ----------------------- | | companyGroupIdrequired | stringSegment folder ID | ##### Request Body schema: application/jsonrequired | | | | ------------ | ---------------------------------------------------------- | | namerequired | string<= 255 charactersSegment folder name | ### Responses **204** The segment folder was successfully updated **400** Bad request **409** The segment folder name already exists for the partner put/channel/v1/companyGroups/{companyGroupId} https\://marketplace.appdirect.com/api/channel/v1/companyGroups/{companyGroupId} https\://virtserver.swaggerhub.com/channel/v1/companyGroups/{companyGroupId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "name": "Fortune 500 Companies" }` ### Response samples * 400 * 409 Content type application/json Copy `{ "code": "EXTERNAL_ERROR", "message": "Execution of an external dependency failed with message: User with email random@appdirect.com was not found in the linked account." }` ## [](#tag/SegmentFolders/operation/deleteCompanyGroup)Delete segment folder Deletes a segment folder, all associated segments, and all product associations ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### path Parameters | | | | ---------------------- | ----------------------- | | companyGroupIdrequired | stringSegment folder ID | ### Responses **204** The segment folder was successfully deleted **400** Bad request delete/channel/v1/companyGroups/{companyGroupId} https\://marketplace.appdirect.com/api/channel/v1/companyGroups/{companyGroupId} https\://virtserver.swaggerhub.com/channel/v1/companyGroups/{companyGroupId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/channel/v1/companyGroups/%7BcompanyGroupId%7D ``` ## [](#tag/SegmentFolders/operation/removeSegment)Delete segments from segment folders Deletes a segment from a segment folder ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### path Parameters | | | | ------------------------ | ----------------------- | | companyGroupIdrequired | stringSegment folder ID | | companySegmentIdrequired | stringSegment ID | ### Responses **204** The segment was successfully deleted. **400** Bad request delete/channel/v1/companyGroups/{companyGroupId}/segments/{companySegmentId} https\://marketplace.appdirect.com/api/channel/v1/companyGroups/{companyGroupId}/segments/{companySegmentId} https\://virtserver.swaggerhub.com/channel/v1/companyGroups/{companyGroupId}/segments/{companySegmentId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/channel/v1/companyGroups/%7BcompanyGroupId%7D/segments/%7BcompanySegmentId%7D ``` ## [](#tag/SegmentFolders/operation/getCompanyGroupSegments)Read segments Returns a paginated list of segments ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### query Parameters | | | | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | companyGroupIdrequired | stringSegment folder ID | | number | integerDefault:0Page number | | size | integer<= 250Default:50Number of results per page | | sort | string^\[+-]name$Default:"+name"Sort field and order. For ascending sort order, use the '+\[FieldName]' format. For descending order, use the '-\[FieldName]' format. | | searchText | stringSearch text | ### Responses **200** OK **400** Bad request get/channel/v1/segments https\://marketplace.appdirect.com/api/channel/v1/segments https\://virtserver.swaggerhub.com/channel/v1/segments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/segments?companyGroupId=SOME_STRING_VALUE&number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sort=SOME_STRING_VALUE&searchText=SOME_STRING_VALUE' ``` ### Response samples * 200 * 400 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "9f4e5c52-5258-4193-a132-303f06e9eef1", "name": "Canada", "partner": "APPDIRECT", "code": "CAN", "type": "MANUAL" }, { "id": "b1f5af35-ca68-431f-83b7-ef56189924ed", "name": "France", "partner": "APPDIRECT", "code": "FRA", "type": "MANUAL" }, { "id": "5ca15227-da6b-413e-a09c-f8d06ab3dcd7", "name": "United States", "partner": "APPDIRECT", "code": "USA", "type": "MANUAL" } ], "page": { "size": 50, "totalElements": 3, "totalPages": 1, "number": 0 } }` ## [](#tag/SegmentFolders/operation/createSegment)Create manual segment Creates a manual segment. Manual segments allow Marketplace Managers to select companies manually, as opposed to dynamic segments, which contain user selected automatically based on filter values. ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### query Parameters | | | | ---------------------- | ----------------------- | | companyGroupIdrequired | stringSegment folder ID | ##### Request Body schema: application/jsonrequired | | | | ------------ | ---------------------------------------------------------- | | namerequired | string\[ 1 .. 255 ] charactersSegment name | | code | string\[ 1 .. 255 ] charactersSegment code | ### Responses **200** OK **400** Bad request **409** The segment already exists post/channel/v1/segments https\://marketplace.appdirect.com/api/channel/v1/segments https\://virtserver.swaggerhub.com/channel/v1/segments ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "name": "Canada", "code": "XXYU" }` ### Response samples * 200 * 400 * 409 Content type application/json Copy `{ "id": "9f4e5c52-5258-4193-a132-303f06e9eef1", "name": "Canada", "partner": "APPDIRECT", "code": "CAN", "type": "MANUAL" }` ## [](#tag/SegmentFolders/operation/updateSegment)Update manual segments Updates a manual segment ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### path Parameters | | | | ------------------------ | ---------------- | | companySegmentIdrequired | stringSegment ID | ##### Request Body schema: application/jsonrequired | | | | ------------ | ---------------------------------------------------------- | | namerequired | string\[ 1 .. 255 ] charactersSegment name | | code | string\[ 1 .. 255 ] charactersSegment code | ### Responses **204** The segment was successfully updated. **400** Bad request **409** The segment already exists put/channel/v1/segments/{companySegmentId} https\://marketplace.appdirect.com/api/channel/v1/segments/{companySegmentId} https\://virtserver.swaggerhub.com/channel/v1/segments/{companySegmentId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "name": "Canada", "code": "XXYU" }` ### Response samples * 400 * 409 Content type application/json Copy `{ "code": "EXTERNAL_ERROR", "message": "Execution of an external dependency failed with message: User with email random@appdirect.com was not found in the linked account." }` ## [](#tag/SegmentFolders/operation/deleteAndAddCompanies)Create or remove segment-company associations Creates or removes associations between segments and companies ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### path Parameters | | | | ------------------------ | ---------------- | | companySegmentIdrequired | stringSegment ID | ##### Request Body schema: application/jsonrequired | | | | -------------------------- | ----------------------------------------------------------------------------------------------------- | | deleteAllrequired | booleanSet to true to delete all associations | | companyIdsToAddrequired | Array of stringsThe list of company IDs to associate with the segment, up to a maximum of 1000 IDs | | companyIdsToRemoverequired | Array of stringsThe list of company IDs to disassociate from the segment, up to a maximum of 1000 IDs | ### Responses **204** The segment to company associations were successfully updated. **400** Bad request **409** The association already exists between the segment and company. post/channel/v1/segments/{companySegmentId}/associationsBatchUpdate https\://marketplace.appdirect.com/api/channel/v1/segments/{companySegmentId}/associationsBatchUpdate https\://virtserver.swaggerhub.com/channel/v1/segments/{companySegmentId}/associationsBatchUpdate ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "deleteAll": "false", "companyIdsToAdd": [ "7e3b3bb8-1b75-408b-8cbf-561ccd910479" ], "companyIdsToRemove": [ "7e3b3bb8-1b75-408b-8cbf-561ccd910478" ] }` ### Response samples * 400 * 409 Content type application/json Copy `{ "code": "EXTERNAL_ERROR", "message": "Execution of an external dependency failed with message: User with email random@appdirect.com was not found in the linked account." }` ## [](#tag/SegmentFolders/operation/getAvailableAndAssociatedCompanies)Read segment companies Returns a paginated list of all marketplace companies and indicates whether they are associated with the segment ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### path Parameters | | | | ------------------------ | ---------------- | | companySegmentIdrequired | stringSegment ID | ##### query Parameters | | | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | number | integerDefault:0Page number | | size | integer<= 250Default:50Number of results per page | | sort | string^\[+-]name$Default:"+name"Sort field and order. For ascending sort order, use the '+\[FieldName]' format. For descending order, use the '-\[FieldName]' format. | | searchText | stringSearch text | | selected | booleanDefault:falseIf true, returns only associated companies | ### Responses **200** Success **400** Bad request get/channel/v1/segments/{companySegmentId}/availableAndAssociatedCompanies https\://marketplace.appdirect.com/api/channel/v1/segments/{companySegmentId}/availableAndAssociatedCompanies https\://virtserver.swaggerhub.com/channel/v1/segments/{companySegmentId}/availableAndAssociatedCompanies ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/segments/%7BcompanySegmentId%7D/availableAndAssociatedCompanies?number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sort=SOME_STRING_VALUE&searchText=SOME_STRING_VALUE&selected=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 * 400 Content type application/json Copy Expand all Collapse all `{ "content": [ { "name": "Canada Company", "id": "04f8d043-10f1-4b89-8c0e-0780e5a62299", "selected": false }, { "name": "US Company", "id": "04f8d043-10f1-4b89-8c0e-0780e5a62298", "selected": true } ], "page": { "number": 1, "size": 2, "totalElements": 10, "totalPages": 2 } }` ## [](#tag/SegmentFolders/operation/updateDynamicSegment)Update dynamic segments Updates a dynamic segment ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### path Parameters | | | | ------------------------ | ---------------- | | dynamicSegmentIdrequired | stringSegment ID | ##### Request Body schema: application/jsonrequired | | | | --------------- | -------------------------------------------------------------------------- | | namerequired | string\[ 1 .. 255 ] charactersSegment name | | code | string\[ 1 .. 255 ] charactersSegment code | | filtersrequired | Array of objects (Filters) \[ items]Dynamic filter | ### Responses **204** The segment was successfully updated. **400** Bad request **409** The segment already exists put/channel/v1/segments/dynamicSegments/{dynamicSegmentId} https\://marketplace.appdirect.com/api/channel/v1/segments/dynamicSegments/{dynamicSegmentId} https\://virtserver.swaggerhub.com/channel/v1/segments/dynamicSegments/{dynamicSegmentId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "name": "Canada", "code": "XXYU", "filters": [ [ { "conditions": [ { "parameter": "company.state", "operator": "matches", "values": [ "Quebec" ] }, { "parameter": "company.city", "operator": "matches", "values": [ "Montreal" ] } ] }, { "conditions": [ { "parameter": "company.state", "operator": "matches", "values": [ "Quebec" ] }, { "parameter": "company.city", "operator": "matches", "values": [ "Montreal" ] } ] } ] ] }` ### Response samples * 400 * 409 Content type application/json Copy `{ "code": "EXTERNAL_ERROR", "message": "Execution of an external dependency failed with message: User with email random@appdirect.com was not found in the linked account." }` ## [](#tag/SegmentFolders/operation/readFilterParameter)Read filter parameters Returns a list of parameters for the dynamic filter ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### query Parameters | | | | ------ | -------------------------------------------- | | locale | stringDefault:"en\_US"Locale | ##### header Parameters | | | | ----------------- | -------------------- | | AD-Tenantrequired | string(\s\*\S+\s\*)+ | ### Responses **200** OK **500** Server error get/channel/v1/segments/dynamicSegments/filterParameters https\://marketplace.appdirect.com/api/channel/v1/segments/dynamicSegments/filterParameters https\://virtserver.swaggerhub.com/channel/v1/segments/dynamicSegments/filterParameters ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/segments/dynamicSegments/filterParameters?locale=SOME_STRING_VALUE' \ --header 'AD-Tenant: SOME_STRING_VALUE' ``` ### Response samples * 200 * 500 Content type application/json Copy Expand all Collapse all `[ { "key": "company", "label": "company", "fields": [ { "key": "company.state", "label": "state", "dataType": "text" } ] } ]` ## [](#tag/SegmentFolders/operation/testDynamicSegment)Test dynamic segments Determines whether the specified user matches the specified dynamic segment ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### path Parameters | | | | ----------------- | ------------------------ | | userEmailrequired | stringUser email address | ##### Request Body schema: application/jsonrequired | | | | --------------- | -------------------------------------------------------------------------- | | namerequired | string\[ 1 .. 255 ] charactersSegment name | | code | string\[ 1 .. 255 ] charactersSegment code | | filtersrequired | Array of objects (Filters) \[ items]Dynamic filter | ### Responses **200** OK **400** Bad request post/channel/v1/segments/dynamicSegments/matchUser/{userEmail} https\://marketplace.appdirect.com/api/channel/v1/segments/dynamicSegments/matchUser/{userEmail} https\://virtserver.swaggerhub.com/channel/v1/segments/dynamicSegments/matchUser/{userEmail} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "name": "Canada", "code": "XXYU", "filters": [ [ { "conditions": [ { "parameter": "company.state", "operator": "matches", "values": [ "Quebec" ] }, { "parameter": "company.city", "operator": "matches", "values": [ "Montreal" ] } ] }, { "conditions": [ { "parameter": "company.state", "operator": "matches", "values": [ "Quebec" ] }, { "parameter": "company.city", "operator": "matches", "values": [ "Montreal" ] } ] } ] ] }` ### Response samples * 200 * 400 Content type application/json Copy `{ "matches": "true" }` ## [](#tag/SegmentFolders/operation/readDynamicSegment)Read dynamic segments Reads a dynamic segment ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### query Parameters | | | | ------------------------ | ------------------------ | | dynamicSegmentIdrequired | stringDynamic segment ID | ### Responses **200** OK **400** Bad request get/channel/v1/segments/dynamicSegments https\://marketplace.appdirect.com/api/channel/v1/segments/dynamicSegments https\://virtserver.swaggerhub.com/channel/v1/segments/dynamicSegments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/segments/dynamicSegments?dynamicSegmentId=SOME_STRING_VALUE' ``` ### Response samples * 200 * 400 Content type application/json Copy Expand all Collapse all `{ "id": "9f4e5c52-5258-4193-a132-303f06e9eef1", "name": "Canada", "partner": "APPDIRECT", "code": "CAN", "type": "DYNAMIC", "filters": [ [ { "conditions": [ { "parameter": "company.state", "operator": "matches", "values": [ "Quebec" ] }, { "parameter": "company.city", "operator": "matches", "values": [ "Montreal" ] } ] }, { "conditions": [ { "parameter": "company.state", "operator": "matches", "values": [ "Quebec" ] }, { "parameter": "company.city", "operator": "matches", "values": [ "Montreal" ] } ] } ] ] }` ## [](#tag/SegmentFolders/operation/createDynamicSegment)Create dynamic segments Creates a dynamic segment. Dynamic segments contain user selected automatically based on filter values, as opposed to manual segments, in which Marketplace Managers select companies manually. ##### Required Scopes and Authorization Rules * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. ##### query Parameters | | | | ---------------------- | ----------------------- | | companyGroupIdrequired | stringSegment folder ID | ##### Request Body schema: application/jsonrequired | | | | --------------- | -------------------------------------------------------------------------- | | namerequired | string\[ 1 .. 255 ] charactersSegment name | | code | string\[ 1 .. 255 ] charactersSegment code | | filtersrequired | Array of objects (Filters) \[ items]Dynamic filter | ### Responses **200** OK **400** Bad request **409** The segment already exists post/channel/v1/segments/dynamicSegments https\://marketplace.appdirect.com/api/channel/v1/segments/dynamicSegments https\://virtserver.swaggerhub.com/channel/v1/segments/dynamicSegments ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "name": "Canada", "code": "XXYU", "filters": [ [ { "conditions": [ { "parameter": "company.state", "operator": "matches", "values": [ "Quebec" ] }, { "parameter": "company.city", "operator": "matches", "values": [ "Montreal" ] } ] }, { "conditions": [ { "parameter": "company.state", "operator": "matches", "values": [ "Quebec" ] }, { "parameter": "company.city", "operator": "matches", "values": [ "Montreal" ] } ] } ] ] }` ### Response samples * 200 * 400 * 409 Content type application/json Copy Expand all Collapse all `{ "id": "9f4e5c52-5258-4193-a132-303f06e9eef1", "name": "Canada", "partner": "APPDIRECT", "code": "CAN", "type": "DYNAMIC", "filters": [ [ { "conditions": [ { "parameter": "company.state", "operator": "matches", "values": [ "Quebec" ] }, { "parameter": "company.city", "operator": "matches", "values": [ "Montreal" ] } ] }, { "conditions": [ { "parameter": "company.state", "operator": "matches", "values": [ "Quebec" ] }, { "parameter": "company.city", "operator": "matches", "values": [ "Montreal" ] } ] } ] ] }` # [](#tag/Settings)Settings ## [](#tag/Settings/operation/resource_ChannelSettingsApi_get_GET)List channel settings Use the GET method to list channel settings for a specific channel. ##### path Parameters | | | | --------------- | ------------------ | | partnerrequired | stringchannel name | ### Responses **200** Success **default** Unexpected error. get/channel/v1/settings/{partner} https\://marketplace.appdirect.com/api/channel/v1/settings/{partner} https\://virtserver.swaggerhub.com/channel/v1/settings/{partner} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/channel/v1/settings/%7Bpartner%7D ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "privacyPolicyUrlMap": { }, "minimumReviewsForRating": 1, "resellerTermsUrlMap": { }, "importAppsConfigurable": false, "companyName": "", "encryptBankAccount": false, "metaDescription": null, "allCompaniesVendors": false, "identityProvider": false, "smtpBcc": "", "marketplaceUsername": "", "supportUrlMap": { }, "analyticsId": "", "supportEmailMap": { }, "hideCustomerInfoFromDevelopers": false, "canImpersonate": true, "emailCopySalesRepOnBillingEvents": false, "showSocialMediaLinks": false, "forceReauthentication": false, "allAdmins": false, "changeOwnershipRequestEmail": "", "developerTermsUrlMap": { }, "phoneNumberRequired": false, "approvesUserContent": false, "developerCanViewLeads": false, "marketplacePassword": "", "termsUrlMap": { }, "marketplaceNameMap": { "en_CA": "MarketplaceNameCA" }, "reviewRequirePurchase": false, "domainReactivationEmail": "", "hideQuestions": false, "passwordProtected": false, "metaNoIndex": false, "developerDocsUrl": "", "faviconFileKey": "", "supportPhone": "", "keychainApiRealmId": null, "smtpFromMap": { "en": "support@appdirect.com" }, "companySyncAutoCreateCompaniesEnabled": false, "logoFileKey": null, "versionManagementApiClientId": "", "hideChannelUserInfoFromCustomers": false, "trustedURLs": [ ], "reportsEmail": "", "encryptReports": false, "selfManagedCompanyStructure": false, "betaProductCustomAttribute": false, "securityPolicy": "DEFAULT", "companySyncEnabled": false, "authenticationGracePeriodInSeconds": 60, "resellerLeadsTermsUrlMap": { }, "hideSupportSection": false, "metaKeyWords": null, "keychainApiUrl": null, "companySyncInviteAdminOnCompanyCreationEnabled": false, "developerTermsUpdatedOn": null, "showProfiles": true, "supportContactUrlMap": { } }` ## [](#tag/Settings/operation/resource_ChannelSettingsApi_update_PATCH)Update channel settings Use the PATCH method to update one or more channel settings. ##### path Parameters | | | | --------------- | ------------------ | | partnerrequired | stringchannel name | ##### Request Body schema: application/json a list of settings to update Array | | | | --------------- | --------------------------- | | settingrequired | stringChannel setting name | | value | stringChannel setting value | ### Responses **204** Success **default** Unexpected error. patch/channel/v1/settings/{partner} https\://marketplace.appdirect.com/api/channel/v1/settings/{partner} https\://virtserver.swaggerhub.com/channel/v1/settings/{partner} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `[ { "setting": "companySyncEnabled", "value": "tru e" } ]` ### Response samples * 204 Content type application/json Copy Expand all Collapse all `[ { "setting": "reportsEmail", "value": "a@b.com" }, { "setting": "companySyncEnabled", "value": "true" }, { "setting": "marketplaceNameMap", "value": "someSettings" }, { "setting": "versionManagementApiClientId", "value": "sample id" }, { "setting": "hideSupportSection", "value": "false" } ]` # [](#tag/ShoppingCart)ShoppingCart Operations related to shopping carts ## [](#tag/ShoppingCart/operation/listShoppingCarts)List shopping carts Returns all ACTIVE and FINISHED shopping carts ##### query Parameters | | | | -------------- | -------------------------------------------------------------------------------- | | buyerUserId | stringBuyer user ID | | buyerCompanyId | stringBuyer user company ID | | ownerUserId | stringOwner user ID | | ownerCompanyId | stringOwner company ID | | productId | stringProduct ID | | status | Array of stringsShopping cart status | | partner | stringShopping cart partner (This field is not public to client) | | number | integerDefault:11-based page index | | size | integerDefault:10The number of results per page to return | | sortField | stringDefault:"createdOn"Sort field | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order. | ### Responses **200** OK **401** NOT AUTHORIZED get/v3/checkout/shoppingCarts https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts?buyerUserId=SOME_STRING_VALUE&buyerCompanyId=SOME_STRING_VALUE&ownerUserId=SOME_STRING_VALUE&ownerCompanyId=SOME_STRING_VALUE&productId=SOME_STRING_VALUE&status=SOME_ARRAY_VALUE&partner=SOME_STRING_VALUE&number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "5bda35f8dd54f108b898c777", "createdOn": "1541027320333", "ownerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "ownerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "buyerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "buyerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "items": [ { "id": "0129ddf5-4977-4f20-b42a-c41d47b00e2a", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "units": [ ] } ] }, { "id": "5bda370cdd54f10bccf03ba2", "createdOn": "1541027596771", "ownerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "ownerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "buyerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "buyerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "items": [ { "id": "12815d48-b7e6-41c7-804f-252bf64ad411", "pricingPlanId": "f1257109-8c81-402e-a61f-147fea66ab91", "units": [ ] } ] }, { "id": "5bda373fdd54f10bccf03ba3", "createdOn": "1541027647666", "ownerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "ownerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "buyerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "buyerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "items": [ { "id": "abada11b-977e-4466-834a-6b2b45e0266f", "pricingPlanId": "46f442b8-e3c0-4e9a-ba7d-d062058bac25", "units": [ ] } ] } ], "page": { "size": 3, "totalElements": 188, "totalPages": 10, "number": 10 } }` ## [](#tag/ShoppingCart/operation/createShoppingCart)Create shopping carts Creates a shopping cart ##### header Parameters | | | | ------------------------------- | --------------------------------------- | | AD-ShoppingCart-Partnerrequired | stringThe partner code of a marketplace | ##### Request Body schema: application/jsonrequired ShoppingCartWS | | | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | stringShopping cart ID | | createdOn | stringShopping cart creation date | | ownerUserId | stringDefault:""Cart owner user ID | | ownerCompanyId | stringDefault:""Cart owner company ID | | buyerType | string (BuyerType)Default:"CUSTOMER"Enum: "CUSTOMER" "PLATFORM\_OWNER" "PARTNER"Describes the buyer's relationship with the platform, either CUSTOMER (end user), PLATFORM\_OWNER (sales representative) or PARTNER (reseller) | | currency | string (Currency)Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Supported currencies for the system | | status | stringShopping cart status | | isBlocked | booleanDefault:falseShopping Cart is locked waiting for an external event | | paymentMethodId | stringDefault:""Payment method ID | | preAuthId | stringDefault:""Cart payment pre-authorization ID | | locale | stringDefault:""Locale of shopping cart (ISO 639 language, ISO 3166 country, variant). | | buyerUserId | stringDefault:""User ID of the buyer (customer, reseller, sales representative) who initiates the purchase | | buyerCompanyId | stringDefault:""Buyer company ID | | items | Array of objects (ShoppingCartItem) | | customAttributes | object (ShoppingCartCustomAttributes)Custom attributes for the purchase, buyer, and owner | | associations | Array of objects (Association)Item associations | | fees | Array of objects (Fee)Cart fees | | accreditedAgents | Array of objects (AccreditedAgent) | ### Responses **200** OK **401** NOT AUTHORIZED post/v3/checkout/shoppingCarts https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "id": "4f59d160-0e63-45c4-bb91-7ebe873da29f", "createdOn": "2020-10-12 07:20:50.52Z", "ownerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "ownerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "isBlocked": false, "paymentMethodId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "preAuthId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "locale": "en_US", "buyerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "buyerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "items": [ { "id": "45ae34b7-ffc1-4d74-be78-dce34008cd2e", "referenceId": "45", "subscriptionId": "83407ce8-373f-11e6-ac61-9e71128cae77", "pricingPlanId": "3dcc468d-fd4c-41ce-b700-f88c0c74561f", "serviceConfiguration": { "date": "2010-10-19T00:00:00.000Z", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "discountCode": "DISCOUNT", "discountId": "30", "customPrices": [ { "costId": "9742e09a-e1b4-4b9e-b1a7-66df3e41cebe", "price": 20 } ], "units": [ ], "customAttributes": { "vendorRequiredFields": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "subscription": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "customContractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "MONTHLY", "endOfContractGracePeriod": 0, "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodLimit": 0, "contractCancellationPeriodUnit": "NONE", "continueWithoutContract": false, "autoExtensionPricingId": "string", "terminationFeeGracePeriod": 0, "terminationFeeGracePeriodUnit": "INFINITY", "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "alignWithParentCycleStartDate": false, "unitTerms": { "property1": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true }, "property2": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "sourceId": "string", "terminationFee": { "feeType": "FIXED", "amount": 0, "description": "string" }, "contractFee": 0 } } ], "customAttributes": { "purchase": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "associations": [ { "parentItemId": "string", "childItemIds": [ "string" ], "type": "ADDON" } ], "fees": [ { "id": "ce402858-4fe8-4254-8b69-73c41142f4ba", "externalId": "a8bf31a8-fe75-4ab9-9559-dcd41eca9d12", "createdOn": "2020-10-12 07:20:50.52Z", "key": "SHIPPING_FEE_100", "currency": "USD", "amount": "9.81", "description": { "defaultDescription": "Some description here. Valid from {$fromDate} until {$toDate}", "localizedDescriptions": "{\"en_US\": \"Some description here. Valid from {$fromDate} until {$toDate}\", \"es_AR\": \"Alguna descripción acá. Válido desde {$fromDate} hasta {$toDate}\"}", "params": "{\"fromDate\": \"2019-10-12 07:20:50.52Z\", \"toDate\": \"2020-10-12 07:20:50.52Z\"}" }, "revenueShare": { "appdirect": "0.00", "channel": "1.00", "vendor": "0.00" }, "itemIds": "[\"b126e204-05f9-444a-af43-7629069eed03\", \"20de5578-a903-43da-95b8-65a3b584bc29\", \"a104ae19-d5cd-4de1-802b-5b2ec60e7fbf\"]", "metadata": "key1: \"value1\"" } ], "accreditedAgents": [ { "userId": "83407ce8-373f-11e6-ac61-9e71128cae77", "companyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118" } ] }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "ownerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "ownerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "buyerType": "CUSTOMER", "currency": "USD", "buyerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "buyerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "items": [ { "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "units": [ { "quantity": "5", "unit": "USERS" } ], "customPrices": [ { "costId": "63e20fed-f340-11e8-8fb5-125b89b63428", "priceType": "MARKETPLACE_RESELLER_PURCHASE_PRICE", "pricingStrategy": "FLAT", "definition": { "price": 9.99 } }, { "costId": "491f1e67-223a-4c2d-9508-772b545085ad", "priceType": "MARKETPLACE_RESELLER_PURCHASE_PRICE", "pricingStrategy": "TIERED", "definition": { "priceRanges": [ { "min": 1, "max": 5, "price": 9.99 }, { "min": 5, "max": 10, "price": 6.99 } ] } }, { "costId": "77e5badb-90f3-438d-9f3c-506a063fd6e7", "priceType": "MARKETPLACE_RESELLER_PURCHASE_PRICE", "pricingStrategy": "UNIT", "definition": { "priceRanges": [ { "min": 0, "max": null, "price": 1.99 } ] } } ] } ] }` ## [](#tag/ShoppingCart/operation/getShoppingCart)Retrieve shopping cart Retrieves the specified shopping cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ### Responses **200** OK **401** NOT AUTHORIZED get/v3/checkout/shoppingCarts/{shoppingCartId} https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId} https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "5bda3aeedd54f113e3694422", "createdOn": "1541028590204", "ownerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "ownerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "buyerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "buyerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "items": [ { "id": "38ffe338-aaf0-4422-b419-61372ba4ecec", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121" } ], "customAttributes": { "purchase": { "preferredTime": "10:00" } } }` ## [](#tag/ShoppingCart/operation/deleteShoppingCart)Delete shopping carts Deletes the specified shopping cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ### Responses **204** NO CONTENT **401** NOT AUTHORIZED delete/v3/checkout/shoppingCarts/{shoppingCartId} https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId} https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D ``` ## [](#tag/ShoppingCart/operation/updateShoppingCart)Update shopping carts Updates the specified shopping cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ##### Request Body schema: application/jsonrequired ShoppingCartWS | | | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | stringShopping cart ID | | createdOn | stringShopping cart creation date | | ownerUserId | stringDefault:""Cart owner user ID | | ownerCompanyId | stringDefault:""Cart owner company ID | | buyerType | string (BuyerType)Default:"CUSTOMER"Enum: "CUSTOMER" "PLATFORM\_OWNER" "PARTNER"Describes the buyer's relationship with the platform, either CUSTOMER (end user), PLATFORM\_OWNER (sales representative) or PARTNER (reseller) | | currency | string (Currency)Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Supported currencies for the system | | status | stringShopping cart status | | isBlocked | booleanDefault:falseShopping Cart is locked waiting for an external event | | paymentMethodId | stringDefault:""Payment method ID | | preAuthId | stringDefault:""Cart payment pre-authorization ID | | locale | stringDefault:""Locale of shopping cart (ISO 639 language, ISO 3166 country, variant). | | buyerUserId | stringDefault:""User ID of the buyer (customer, reseller, sales representative) who initiates the purchase | | buyerCompanyId | stringDefault:""Buyer company ID | | items | Array of objects (ShoppingCartItem) | | customAttributes | object (ShoppingCartCustomAttributes)Custom attributes for the purchase, buyer, and owner | | associations | Array of objects (Association)Item associations | | fees | Array of objects (Fee)Cart fees | | accreditedAgents | Array of objects (AccreditedAgent) | ### Responses **200** OK **401** NOT AUTHORIZED patch/v3/checkout/shoppingCarts/{shoppingCartId} https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId} https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "id": "4f59d160-0e63-45c4-bb91-7ebe873da29f", "createdOn": "2020-10-12 07:20:50.52Z", "ownerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "ownerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "isBlocked": false, "paymentMethodId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "preAuthId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "locale": "en_US", "buyerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "buyerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "items": [ { "id": "45ae34b7-ffc1-4d74-be78-dce34008cd2e", "referenceId": "45", "subscriptionId": "83407ce8-373f-11e6-ac61-9e71128cae77", "pricingPlanId": "3dcc468d-fd4c-41ce-b700-f88c0c74561f", "serviceConfiguration": { "date": "2010-10-19T00:00:00.000Z", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "discountCode": "DISCOUNT", "discountId": "30", "customPrices": [ { "costId": "9742e09a-e1b4-4b9e-b1a7-66df3e41cebe", "price": 20 } ], "units": [ ], "customAttributes": { "vendorRequiredFields": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "subscription": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "customContractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "MONTHLY", "endOfContractGracePeriod": 0, "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodLimit": 0, "contractCancellationPeriodUnit": "NONE", "continueWithoutContract": false, "autoExtensionPricingId": "string", "terminationFeeGracePeriod": 0, "terminationFeeGracePeriodUnit": "INFINITY", "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "alignWithParentCycleStartDate": false, "unitTerms": { "property1": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true }, "property2": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "sourceId": "string", "terminationFee": { "feeType": "FIXED", "amount": 0, "description": "string" }, "contractFee": 0 } } ], "customAttributes": { "purchase": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "associations": [ { "parentItemId": "string", "childItemIds": [ "string" ], "type": "ADDON" } ], "fees": [ { "id": "ce402858-4fe8-4254-8b69-73c41142f4ba", "externalId": "a8bf31a8-fe75-4ab9-9559-dcd41eca9d12", "createdOn": "2020-10-12 07:20:50.52Z", "key": "SHIPPING_FEE_100", "currency": "USD", "amount": "9.81", "description": { "defaultDescription": "Some description here. Valid from {$fromDate} until {$toDate}", "localizedDescriptions": "{\"en_US\": \"Some description here. Valid from {$fromDate} until {$toDate}\", \"es_AR\": \"Alguna descripción acá. Válido desde {$fromDate} hasta {$toDate}\"}", "params": "{\"fromDate\": \"2019-10-12 07:20:50.52Z\", \"toDate\": \"2020-10-12 07:20:50.52Z\"}" }, "revenueShare": { "appdirect": "0.00", "channel": "1.00", "vendor": "0.00" }, "itemIds": "[\"b126e204-05f9-444a-af43-7629069eed03\", \"20de5578-a903-43da-95b8-65a3b584bc29\", \"a104ae19-d5cd-4de1-802b-5b2ec60e7fbf\"]", "metadata": "key1: \"value1\"" } ], "accreditedAgents": [ { "userId": "83407ce8-373f-11e6-ac61-9e71128cae77", "companyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118" } ] }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "5be20b01411e037ed1e5dbd5", "createdOn": "1541540609246", "ownerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "ownerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "buyerUserId": "01ada338-52fb-42b8-8c47-c72c30b8a602", "buyerCompanyId": "08a28380-b2cf-4915-aaf8-2958b350b090", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "items": [ { "id": "c039a3bd-9dc2-42fc-916f-dea189e8ec30", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "units": [ { "quantity": "8", "unit": "USERS" } ] } ], "customAttributes": { "purchase": { "preferredTime": "10:00" } } }` ## [](#tag/ShoppingCart/operation/finalizeShoppingCart)Finalize shopping carts Returns requested shopping cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ##### header Parameters | | | | ----------- | ------ | | AD-Timezone | string | ### Responses **202** ACCEPTED **401** NOT AUTHORIZED post/v3/checkout/shoppingCarts/{shoppingCartId}/finalize https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/finalize https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/finalize ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/finalize \ --header 'AD-Timezone: SOME_STRING_VALUE' ``` ### Response samples * 202 Content type application/json Copy `{ "purchaseId": "42d444da-9da5-4fc6-b0e0-4879fe549307" }` ## [](#tag/ShoppingCart/operation/createAndFinalizeShoppingCart)Create and finalize shopping carts Creates and finalizes a shopping cart in a single request ##### header Parameters | | | | ------------------------------- | --------------------------------------- | | AD-ShoppingCart-Partnerrequired | stringThe partner code of a marketplace | | AD-Timezone | string | ##### Request Body schema: application/jsonrequired shoppingCartWS | | | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | stringShopping cart ID | | createdOn | stringShopping cart creation date | | ownerUserId | stringDefault:""Cart owner user ID | | ownerCompanyId | stringDefault:""Cart owner company ID | | buyerType | string (BuyerType)Default:"CUSTOMER"Enum: "CUSTOMER" "PLATFORM\_OWNER" "PARTNER"Describes the buyer's relationship with the platform, either CUSTOMER (end user), PLATFORM\_OWNER (sales representative) or PARTNER (reseller) | | currency | string (Currency)Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Supported currencies for the system | | status | stringShopping cart status | | isBlocked | booleanDefault:falseShopping Cart is locked waiting for an external event | | paymentMethodId | stringDefault:""Payment method ID | | preAuthId | stringDefault:""Cart payment pre-authorization ID | | locale | stringDefault:""Locale of shopping cart (ISO 639 language, ISO 3166 country, variant). | | buyerUserId | stringDefault:""User ID of the buyer (customer, reseller, sales representative) who initiates the purchase | | buyerCompanyId | stringDefault:""Buyer company ID | | items | Array of objects (ShoppingCartItem) | | customAttributes | object (ShoppingCartCustomAttributes)Custom attributes for the purchase, buyer, and owner | | associations | Array of objects (Association)Item associations | | fees | Array of objects (Fee)Cart fees | | accreditedAgents | Array of objects (AccreditedAgent) | ### Responses **202** ACCEPTED **401** NOT AUTHORIZED post/v3/checkout/shoppingCarts/finalize https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/finalize https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/finalize ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "id": "4f59d160-0e63-45c4-bb91-7ebe873da29f", "createdOn": "2020-10-12 07:20:50.52Z", "ownerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "ownerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "isBlocked": false, "paymentMethodId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "preAuthId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "locale": "en_US", "buyerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "buyerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "items": [ { "id": "45ae34b7-ffc1-4d74-be78-dce34008cd2e", "referenceId": "45", "subscriptionId": "83407ce8-373f-11e6-ac61-9e71128cae77", "pricingPlanId": "3dcc468d-fd4c-41ce-b700-f88c0c74561f", "serviceConfiguration": { "date": "2010-10-19T00:00:00.000Z", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "discountCode": "DISCOUNT", "discountId": "30", "customPrices": [ { "costId": "9742e09a-e1b4-4b9e-b1a7-66df3e41cebe", "price": 20 } ], "units": [ ], "customAttributes": { "vendorRequiredFields": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "subscription": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "customContractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "MONTHLY", "endOfContractGracePeriod": 0, "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodLimit": 0, "contractCancellationPeriodUnit": "NONE", "continueWithoutContract": false, "autoExtensionPricingId": "string", "terminationFeeGracePeriod": 0, "terminationFeeGracePeriodUnit": "INFINITY", "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "alignWithParentCycleStartDate": false, "unitTerms": { "property1": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true }, "property2": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "sourceId": "string", "terminationFee": { "feeType": "FIXED", "amount": 0, "description": "string" }, "contractFee": 0 } } ], "customAttributes": { "purchase": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "associations": [ { "parentItemId": "string", "childItemIds": [ "string" ], "type": "ADDON" } ], "fees": [ { "id": "ce402858-4fe8-4254-8b69-73c41142f4ba", "externalId": "a8bf31a8-fe75-4ab9-9559-dcd41eca9d12", "createdOn": "2020-10-12 07:20:50.52Z", "key": "SHIPPING_FEE_100", "currency": "USD", "amount": "9.81", "description": { "defaultDescription": "Some description here. Valid from {$fromDate} until {$toDate}", "localizedDescriptions": "{\"en_US\": \"Some description here. Valid from {$fromDate} until {$toDate}\", \"es_AR\": \"Alguna descripción acá. Válido desde {$fromDate} hasta {$toDate}\"}", "params": "{\"fromDate\": \"2019-10-12 07:20:50.52Z\", \"toDate\": \"2020-10-12 07:20:50.52Z\"}" }, "revenueShare": { "appdirect": "0.00", "channel": "1.00", "vendor": "0.00" }, "itemIds": "[\"b126e204-05f9-444a-af43-7629069eed03\", \"20de5578-a903-43da-95b8-65a3b584bc29\", \"a104ae19-d5cd-4de1-802b-5b2ec60e7fbf\"]", "metadata": "key1: \"value1\"" } ], "accreditedAgents": [ { "userId": "83407ce8-373f-11e6-ac61-9e71128cae77", "companyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118" } ] }` ### Response samples * 202 Content type application/json Copy `{ "purchaseId": "42d444da-9da5-4fc6-b0e0-4879fe549307" }` ## [](#tag/ShoppingCart/operation/getShoppingCartAssociations)Retrieve cart associations Returns the associations included in the shopping cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ### Responses **200** OK get/v3/checkout/shoppingCarts/{shoppingCartId}/associations https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/associations https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/associations ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/associations ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `[ { "parentItemId": "string", "childItemIds": [ "string" ], "type": "ADDON" } ]` ## [](#tag/ShoppingCart/operation/getPreAuth)Get cart pre-authorization Retrieves the payment pre-authorization for the specified cart. ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ### Responses **200** Payment pre-authorization response **400** Bad request **500** Unknown error get/v3/checkout/shoppingCarts/{shoppingCartId}/preauth https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/preauth https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/preauth ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/preauth ``` ### Response samples * 400 * 500 Content type \*/\*\*/\* No sample ## [](#tag/ShoppingCart/operation/listShoppingCartItems)Retrieve shopping cart items Returns all items included in the shopping cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ### Responses **200** OK **401** NOT AUTHORIZED get/v3/checkout/shoppingCarts/{shoppingCartId}/items https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/items https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/items ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/items ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `[ { "id": "553e4f1a-66bc-4e25-92ab-c573c8c3f96f", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "units": [ { "quantity": "5", "unit": "USERS" } ] }, { "id": "64c6b624-e5be-48c6-8e97-c8b2fe056c06", "pricingPlanId": "36142d03-0aea-49cc-beab-3f94cc08fc18", "units": [ { "quantity": "50", "unit": "GIGABYTE" } ] } ]` ## [](#tag/ShoppingCart/operation/createShoppingCartItem)Add items to cart Adds the specified item to the shopping cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ##### Request Body schema: application/jsonrequired A shopping cart item | | | | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | stringItem UUID | | referenceId | stringA 'local' ID for the item, which can be used in requests instead of the full UUID. Use the ref:{referenceId} format. | | subscriptionId | stringExisting subscription UUID. | | pricingPlanId | stringID of the pricing plan that the user is going to purchase | | serviceConfiguration | object (ServiceConfiguration)Service Configuration | | billingConfiguration | object (BillingConfiguration)Determines when the billing cycle starts. Set UPON\_SERVICE\_ACTIVATION to start the billing cycle according to the specified provisioning strategy (either immediately after the opportunity is finalized or on a custom provisioning date). Set NEXT\_BILLING\_CYCLE to start the billing cycle according to the marketplace billing configuration (for example, first of the month). Set CUSTOM to start the billing cycle on a specified date in the future. | | discountCode | stringDiscount applied to the product | | discountId | stringDiscount ID | | customPrices | Array of objects (CustomPrice)Definition of custom prices for the purchase | | units | Array of objects (Unit)Default:\[]List of units included in the product | | customAttributes | object (ItemCustomAttributes)Collection of custom attributes | | customContractConfiguration | object (CustomContractConfiguration)Configuration to use for custom contract | ### Responses **200** OK post/v3/checkout/shoppingCarts/{shoppingCartId}/items https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/items https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/items ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "id": "45ae34b7-ffc1-4d74-be78-dce34008cd2e", "referenceId": "45", "subscriptionId": "83407ce8-373f-11e6-ac61-9e71128cae77", "pricingPlanId": "3dcc468d-fd4c-41ce-b700-f88c0c74561f", "serviceConfiguration": { "date": "2010-10-19T00:00:00.000Z", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "discountCode": "DISCOUNT", "discountId": "30", "customPrices": [ { "costId": "9742e09a-e1b4-4b9e-b1a7-66df3e41cebe", "price": 20 } ], "units": [ ], "customAttributes": { "vendorRequiredFields": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "subscription": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "customContractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "MONTHLY", "endOfContractGracePeriod": 0, "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodLimit": 0, "contractCancellationPeriodUnit": "NONE", "continueWithoutContract": false, "autoExtensionPricingId": "string", "terminationFeeGracePeriod": 0, "terminationFeeGracePeriodUnit": "INFINITY", "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "alignWithParentCycleStartDate": false, "unitTerms": { "property1": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true }, "property2": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "sourceId": "string", "terminationFee": { "feeType": "FIXED", "amount": 0, "description": "string" }, "contractFee": 0 } }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "e34b836e-3963-4eb7-8ce2-ca5867549ba6", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "units": [ { "quantity": "5", "unit": "USERS" } ] }` ## [](#tag/ShoppingCart/operation/getShoppingCartItem)Retrieve cart item Returns the specified shopping cart item ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | | itemIdrequired | stringItem ID | ### Responses **200** OK **401** NOT AUTHORIZED get/v3/checkout/shoppingCarts/{shoppingCartId}/items/{itemId} https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/items/{itemId} https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/items/{itemId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/items/%7BitemId%7D ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "e34b836e-3963-4eb7-8ce2-ca5867549ba6", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "units": [ { "quantity": "5", "unit": "USERS" } ] }` ## [](#tag/ShoppingCart/operation/updateShoppingCartItem)Update shopping cart item Updates the specified shopping cart item ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | | itemIdrequired | stringItem ID | ##### Request Body schema: application/jsonrequired A shopping cart item | | | | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | stringItem UUID | | referenceId | stringA 'local' ID for the item, which can be used in requests instead of the full UUID. Use the ref:{referenceId} format. | | subscriptionId | stringExisting subscription UUID. | | pricingPlanId | stringID of the pricing plan that the user is going to purchase | | serviceConfiguration | object (ServiceConfiguration)Service Configuration | | billingConfiguration | object (BillingConfiguration)Determines when the billing cycle starts. Set UPON\_SERVICE\_ACTIVATION to start the billing cycle according to the specified provisioning strategy (either immediately after the opportunity is finalized or on a custom provisioning date). Set NEXT\_BILLING\_CYCLE to start the billing cycle according to the marketplace billing configuration (for example, first of the month). Set CUSTOM to start the billing cycle on a specified date in the future. | | discountCode | stringDiscount applied to the product | | discountId | stringDiscount ID | | customPrices | Array of objects (CustomPrice)Definition of custom prices for the purchase | | units | Array of objects (Unit)Default:\[]List of units included in the product | | customAttributes | object (ItemCustomAttributes)Collection of custom attributes | | customContractConfiguration | object (CustomContractConfiguration)Configuration to use for custom contract | ### Responses **200** OK **401** NOT AUTHORIZED put/v3/checkout/shoppingCarts/{shoppingCartId}/items/{itemId} https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/items/{itemId} https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/items/{itemId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "id": "45ae34b7-ffc1-4d74-be78-dce34008cd2e", "referenceId": "45", "subscriptionId": "83407ce8-373f-11e6-ac61-9e71128cae77", "pricingPlanId": "3dcc468d-fd4c-41ce-b700-f88c0c74561f", "serviceConfiguration": { "date": "2010-10-19T00:00:00.000Z", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "discountCode": "DISCOUNT", "discountId": "30", "customPrices": [ { "costId": "9742e09a-e1b4-4b9e-b1a7-66df3e41cebe", "price": 20 } ], "units": [ ], "customAttributes": { "vendorRequiredFields": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "subscription": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "customContractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "MONTHLY", "endOfContractGracePeriod": 0, "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodLimit": 0, "contractCancellationPeriodUnit": "NONE", "continueWithoutContract": false, "autoExtensionPricingId": "string", "terminationFeeGracePeriod": 0, "terminationFeeGracePeriodUnit": "INFINITY", "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "alignWithParentCycleStartDate": false, "unitTerms": { "property1": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true }, "property2": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "sourceId": "string", "terminationFee": { "feeType": "FIXED", "amount": 0, "description": "string" }, "contractFee": 0 } }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "e34b836e-3963-4eb7-8ce2-ca5867549ba6", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "units": [ { "quantity": "15", "unit": "USERS" } ] }` ## [](#tag/ShoppingCart/operation/deleteShoppingCartItem)Remove cart item Removes the specified item from the shopping cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | | itemIdrequired | stringApplication ID | ### Responses **204** NO CONTENT **401** NOT AUTHORIZED delete/v3/checkout/shoppingCarts/{shoppingCartId}/items/{itemId} https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/items/{itemId} https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/items/{itemId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/items/%7BitemId%7D ``` ## [](#tag/ShoppingCart/operation/deleteShoppingCartItems)Delete cart items Removes the specified items from the shopping cart. ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ##### Request Body schema: application/jsonrequired | | | | -------- | --------------------------------------------------------------------------------------------------------------------------------- | | ids | Array of stringsItem IDs | | cascade | Array of strings (AssociationType)ItemsValue: "ADDON"Cascade deletion of associated items | | itemPath | stringSelection of items to delete, in JsonPath syntax | ### Responses **200** OK **401** NOT AUTHORIZED post/shoppingCarts/{shoppingCartId}/items/delete https\://marketplace.appdirect.com/api/shoppingCarts/{shoppingCartId}/items/delete https\://virtserver.swaggerhub.com/shoppingCarts/{shoppingCartId}/items/delete ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "ids": "[]", "cascade": "[\"ADDON\"]", "itemPath": ".items[?(@.pricingPlanId=='planid')]" }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "4f59d160-0e63-45c4-bb91-7ebe873da29f", "createdOn": "2020-10-12 07:20:50.52Z", "ownerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "ownerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "isBlocked": false, "paymentMethodId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "preAuthId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "locale": "en_US", "buyerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "buyerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "items": [ { "id": "45ae34b7-ffc1-4d74-be78-dce34008cd2e", "referenceId": "45", "subscriptionId": "83407ce8-373f-11e6-ac61-9e71128cae77", "pricingPlanId": "3dcc468d-fd4c-41ce-b700-f88c0c74561f", "serviceConfiguration": { "date": "2010-10-19T00:00:00.000Z", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "discountCode": "DISCOUNT", "discountId": "30", "customPrices": [ { "costId": "9742e09a-e1b4-4b9e-b1a7-66df3e41cebe", "price": 20 } ], "units": [ ], "customAttributes": { "vendorRequiredFields": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "subscription": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "customContractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "MONTHLY", "endOfContractGracePeriod": 0, "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodLimit": 0, "contractCancellationPeriodUnit": "NONE", "continueWithoutContract": false, "autoExtensionPricingId": "string", "terminationFeeGracePeriod": 0, "terminationFeeGracePeriodUnit": "INFINITY", "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "alignWithParentCycleStartDate": false, "unitTerms": { "property1": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true }, "property2": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "sourceId": "string", "terminationFee": { "feeType": "FIXED", "amount": 0, "description": "string" }, "contractFee": 0 } } ], "customAttributes": { "purchase": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "associations": [ { "parentItemId": "string", "childItemIds": [ "string" ], "type": "ADDON" } ], "fees": [ { "id": "ce402858-4fe8-4254-8b69-73c41142f4ba", "externalId": "a8bf31a8-fe75-4ab9-9559-dcd41eca9d12", "createdOn": "2020-10-12 07:20:50.52Z", "key": "SHIPPING_FEE_100", "currency": "USD", "amount": "9.81", "description": { "defaultDescription": "Some description here. Valid from {$fromDate} until {$toDate}", "localizedDescriptions": "{\"en_US\": \"Some description here. Valid from {$fromDate} until {$toDate}\", \"es_AR\": \"Alguna descripción acá. Válido desde {$fromDate} hasta {$toDate}\"}", "params": "{\"fromDate\": \"2019-10-12 07:20:50.52Z\", \"toDate\": \"2020-10-12 07:20:50.52Z\"}" }, "revenueShare": { "appdirect": "0.00", "channel": "1.00", "vendor": "0.00" }, "itemIds": "[\"b126e204-05f9-444a-af43-7629069eed03\", \"20de5578-a903-43da-95b8-65a3b584bc29\", \"a104ae19-d5cd-4de1-802b-5b2ec60e7fbf\"]", "metadata": "key1: \"value1\"" } ], "accreditedAgents": [ { "userId": "83407ce8-373f-11e6-ac61-9e71128cae77", "companyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118" } ] }` ## [](#tag/ShoppingCart/operation/previewShoppingCart)Preview non-persisted carts Returns a preview of the shopping cart with pricing summary information and a list of errors, if any ##### header Parameters | | | | ------------------------------- | --------------------------------------- | | AD-Timezone | string | | AD-ShoppingCart-Partnerrequired | stringThe partner code of a marketplace | ##### Request Body schema: application/jsonrequired A shopping cart | | | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | stringShopping cart ID | | createdOn | stringShopping cart creation date | | ownerUserId | stringDefault:""Cart owner user ID | | ownerCompanyId | stringDefault:""Cart owner company ID | | buyerType | string (BuyerType)Default:"CUSTOMER"Enum: "CUSTOMER" "PLATFORM\_OWNER" "PARTNER"Describes the buyer's relationship with the platform, either CUSTOMER (end user), PLATFORM\_OWNER (sales representative) or PARTNER (reseller) | | currency | string (Currency)Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Supported currencies for the system | | status | stringShopping cart status | | isBlocked | booleanDefault:falseShopping Cart is locked waiting for an external event | | paymentMethodId | stringDefault:""Payment method ID | | preAuthId | stringDefault:""Cart payment pre-authorization ID | | locale | stringDefault:""Locale of shopping cart (ISO 639 language, ISO 3166 country, variant). | | buyerUserId | stringDefault:""User ID of the buyer (customer, reseller, sales representative) who initiates the purchase | | buyerCompanyId | stringDefault:""Buyer company ID | | items | Array of objects (ShoppingCartItem) | | customAttributes | object (ShoppingCartCustomAttributes)Custom attributes for the purchase, buyer, and owner | | associations | Array of objects (Association)Item associations | | fees | Array of objects (Fee)Cart fees | | accreditedAgents | Array of objects (AccreditedAgent) | ### Responses **200** OK post/v3/checkout/shoppingCarts/preview https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/preview https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/preview ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "id": "4f59d160-0e63-45c4-bb91-7ebe873da29f", "createdOn": "2020-10-12 07:20:50.52Z", "ownerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "ownerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "isBlocked": false, "paymentMethodId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "preAuthId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "locale": "en_US", "buyerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "buyerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "items": [ { "id": "45ae34b7-ffc1-4d74-be78-dce34008cd2e", "referenceId": "45", "subscriptionId": "83407ce8-373f-11e6-ac61-9e71128cae77", "pricingPlanId": "3dcc468d-fd4c-41ce-b700-f88c0c74561f", "serviceConfiguration": { "date": "2010-10-19T00:00:00.000Z", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "discountCode": "DISCOUNT", "discountId": "30", "customPrices": [ { "costId": "9742e09a-e1b4-4b9e-b1a7-66df3e41cebe", "price": 20 } ], "units": [ ], "customAttributes": { "vendorRequiredFields": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "subscription": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "customContractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "MONTHLY", "endOfContractGracePeriod": 0, "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodLimit": 0, "contractCancellationPeriodUnit": "NONE", "continueWithoutContract": false, "autoExtensionPricingId": "string", "terminationFeeGracePeriod": 0, "terminationFeeGracePeriodUnit": "INFINITY", "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "alignWithParentCycleStartDate": false, "unitTerms": { "property1": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true }, "property2": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "sourceId": "string", "terminationFee": { "feeType": "FIXED", "amount": 0, "description": "string" }, "contractFee": 0 } } ], "customAttributes": { "purchase": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "associations": [ { "parentItemId": "string", "childItemIds": [ "string" ], "type": "ADDON" } ], "fees": [ { "id": "ce402858-4fe8-4254-8b69-73c41142f4ba", "externalId": "a8bf31a8-fe75-4ab9-9559-dcd41eca9d12", "createdOn": "2020-10-12 07:20:50.52Z", "key": "SHIPPING_FEE_100", "currency": "USD", "amount": "9.81", "description": { "defaultDescription": "Some description here. Valid from {$fromDate} until {$toDate}", "localizedDescriptions": "{\"en_US\": \"Some description here. Valid from {$fromDate} until {$toDate}\", \"es_AR\": \"Alguna descripción acá. Válido desde {$fromDate} hasta {$toDate}\"}", "params": "{\"fromDate\": \"2019-10-12 07:20:50.52Z\", \"toDate\": \"2020-10-12 07:20:50.52Z\"}" }, "revenueShare": { "appdirect": "0.00", "channel": "1.00", "vendor": "0.00" }, "itemIds": "[\"b126e204-05f9-444a-af43-7629069eed03\", \"20de5578-a903-43da-95b8-65a3b584bc29\", \"a104ae19-d5cd-4de1-802b-5b2ec60e7fbf\"]", "metadata": "key1: \"value1\"" } ], "accreditedAgents": [ { "userId": "83407ce8-373f-11e6-ac61-9e71128cae77", "companyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118" } ] }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "items": [ { "itemId": "72af4c57-3aa7-432d-ac11-749284ede2d7", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "productId": "8130e107-644e-4013-8673-1f3b04d2a39d", "pricingSources": [ { "source": "BASE_CATALOG", "costs": [ { "costTypeCategory": "RECURRING", "costType": "RECURRING_FLAT", "pricingStrategy": "FREE", "salePrice": "0.0000000000" }, { "costTypeCategory": "RECURRING", "costType": "INCLUDED", "pricingStrategy": "UNLIMITED", "unit": "USER" } ] } ], "costs": [ { "costTypeCategory": "RECURRING", "costType": "INCLUDED", "pricingStrategy": "UNLIMITED", "unit": "USER", "salePrice": "0.0000000000", "totalSalePrice": "0.0000000000" }, { "costTypeCategory": "RECURRING", "costType": "RECURRING_FLAT", "pricingStrategy": "FREE", "quantity": "1.0000000000", "salePrice": "0.0000000000", "totalSalePrice": "0.0000000000" } ], "schedule": { "billingCycle": { "period": "MONTHLY", "dayOfMonth": 28 }, "servicePeriod": { "start": "2018-09-28" }, "billingPeriod": { "start": "2018-09-28" } } } ], "amountDueBeforeTax": "0.0000000000", "amountDueAfterTax": "0.0000000000", "recurringTotals": [ { "billingCycle": { "period": "MONTHLY", "dayOfMonth": 28 }, "totalSalePrice": "0.0000000000", "nextInvoiceDate": "2018-09-28" } ] }` ## [](#tag/ShoppingCart/operation/previewShoppingCartById)Preview shopping carts Previews the specified, persisted shopping cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ##### header Parameters | | | | ----------- | ------ | | AD-Timezone | string | ### Responses **200** OK get/v3/checkout/shoppingCarts/{shoppingCartId}/preview https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/preview https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/preview ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/preview \ --header 'AD-Timezone: SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "items": [ { "itemId": "72af4c57-3aa7-432d-ac11-749284ede2d7", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "productId": "8130e107-644e-4013-8673-1f3b04d2a39d", "pricingSources": [ { "source": "BASE_CATALOG", "costs": [ { "costTypeCategory": "RECURRING", "costType": "RECURRING_FLAT", "pricingStrategy": "FREE", "salePrice": "0.0000000000" }, { "costTypeCategory": "RECURRING", "costType": "INCLUDED", "pricingStrategy": "UNLIMITED", "unit": "USER" } ] } ], "costs": [ { "costTypeCategory": "RECURRING", "costType": "INCLUDED", "pricingStrategy": "UNLIMITED", "unit": "USER", "salePrice": "0.0000000000", "totalSalePrice": "0.0000000000" }, { "costTypeCategory": "RECURRING", "costType": "RECURRING_FLAT", "pricingStrategy": "FREE", "quantity": "1.0000000000", "salePrice": "0.0000000000", "totalSalePrice": "0.0000000000" } ], "schedule": { "billingCycle": { "period": "MONTHLY", "dayOfMonth": 28 }, "servicePeriod": { "start": "2018-09-28" }, "billingPeriod": { "start": "2018-09-28" } } } ], "amountDueBeforeTax": "0.0000000000", "amountDueAfterTax": "0.0000000000", "recurringTotals": [ { "billingCycle": { "period": "MONTHLY", "dayOfMonth": 28 }, "totalSalePrice": "0.0000000000", "nextInvoiceDate": "2018-09-28" } ] }` ## [](#tag/ShoppingCart/operation/getPricingSummary)Retrieve pricing summary (non-persisted shopping cart) Retrieves a pricing summary for the cart. The pricing summary includes the detailed and effective costs as well as the billing schedule and recurring charges. The effective cost indicates the price that the customer pays whereas the detailed cost provides the price sources used in the calculation of the effective cost. Prices are not prorated and tax is not included in the pricing summary. ##### header Parameters | | | | ------------------------------- | --------------------------------------- | | AD-Timezone | string | | AD-ShoppingCart-Partnerrequired | stringThe partner code of a marketplace | ##### Request Body schema: application/jsonrequired A shopping cart | | | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | stringShopping cart ID | | createdOn | stringShopping cart creation date | | ownerUserId | stringDefault:""Cart owner user ID | | ownerCompanyId | stringDefault:""Cart owner company ID | | buyerType | string (BuyerType)Default:"CUSTOMER"Enum: "CUSTOMER" "PLATFORM\_OWNER" "PARTNER"Describes the buyer's relationship with the platform, either CUSTOMER (end user), PLATFORM\_OWNER (sales representative) or PARTNER (reseller) | | currency | string (Currency)Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Supported currencies for the system | | status | stringShopping cart status | | isBlocked | booleanDefault:falseShopping Cart is locked waiting for an external event | | paymentMethodId | stringDefault:""Payment method ID | | preAuthId | stringDefault:""Cart payment pre-authorization ID | | locale | stringDefault:""Locale of shopping cart (ISO 639 language, ISO 3166 country, variant). | | buyerUserId | stringDefault:""User ID of the buyer (customer, reseller, sales representative) who initiates the purchase | | buyerCompanyId | stringDefault:""Buyer company ID | | items | Array of objects (ShoppingCartItem) | | customAttributes | object (ShoppingCartCustomAttributes)Custom attributes for the purchase, buyer, and owner | | associations | Array of objects (Association)Item associations | | fees | Array of objects (Fee)Cart fees | | accreditedAgents | Array of objects (AccreditedAgent) | ### Responses **200** OK post/v3/checkout/shoppingCarts/pricingSummary https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/pricingSummary https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/pricingSummary ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "id": "4f59d160-0e63-45c4-bb91-7ebe873da29f", "createdOn": "2020-10-12 07:20:50.52Z", "ownerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "ownerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "isBlocked": false, "paymentMethodId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "preAuthId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "locale": "en_US", "buyerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "buyerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "items": [ { "id": "45ae34b7-ffc1-4d74-be78-dce34008cd2e", "referenceId": "45", "subscriptionId": "83407ce8-373f-11e6-ac61-9e71128cae77", "pricingPlanId": "3dcc468d-fd4c-41ce-b700-f88c0c74561f", "serviceConfiguration": { "date": "2010-10-19T00:00:00.000Z", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "discountCode": "DISCOUNT", "discountId": "30", "customPrices": [ { "costId": "9742e09a-e1b4-4b9e-b1a7-66df3e41cebe", "price": 20 } ], "units": [ ], "customAttributes": { "vendorRequiredFields": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "subscription": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "customContractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "MONTHLY", "endOfContractGracePeriod": 0, "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodLimit": 0, "contractCancellationPeriodUnit": "NONE", "continueWithoutContract": false, "autoExtensionPricingId": "string", "terminationFeeGracePeriod": 0, "terminationFeeGracePeriodUnit": "INFINITY", "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "alignWithParentCycleStartDate": false, "unitTerms": { "property1": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true }, "property2": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "sourceId": "string", "terminationFee": { "feeType": "FIXED", "amount": 0, "description": "string" }, "contractFee": 0 } } ], "customAttributes": { "purchase": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "associations": [ { "parentItemId": "string", "childItemIds": [ "string" ], "type": "ADDON" } ], "fees": [ { "id": "ce402858-4fe8-4254-8b69-73c41142f4ba", "externalId": "a8bf31a8-fe75-4ab9-9559-dcd41eca9d12", "createdOn": "2020-10-12 07:20:50.52Z", "key": "SHIPPING_FEE_100", "currency": "USD", "amount": "9.81", "description": { "defaultDescription": "Some description here. Valid from {$fromDate} until {$toDate}", "localizedDescriptions": "{\"en_US\": \"Some description here. Valid from {$fromDate} until {$toDate}\", \"es_AR\": \"Alguna descripción acá. Válido desde {$fromDate} hasta {$toDate}\"}", "params": "{\"fromDate\": \"2019-10-12 07:20:50.52Z\", \"toDate\": \"2020-10-12 07:20:50.52Z\"}" }, "revenueShare": { "appdirect": "0.00", "channel": "1.00", "vendor": "0.00" }, "itemIds": "[\"b126e204-05f9-444a-af43-7629069eed03\", \"20de5578-a903-43da-95b8-65a3b584bc29\", \"a104ae19-d5cd-4de1-802b-5b2ec60e7fbf\"]", "metadata": "key1: \"value1\"" } ], "accreditedAgents": [ { "userId": "83407ce8-373f-11e6-ac61-9e71128cae77", "companyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118" } ] }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "items": [ { "itemId": "0dfba095-1727-4885-b90c-c32344090a3b", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "productId": "5932bcea-5485-4a81-9b34-58ccd4210132", "editionId": "c134a1b5-b667-45a3-b572-8f3453a277a7", "detailedCost": { "costSources": [ { "costId": "2fbde3b4-f92a-11e8-8fb5-125b89b63428", "costTypeCategory": "RECURRING", "costType": "RECURRING_FLAT", "unit": null, "sources": [ { "priceType": "BASE_PRICE", "priceLevel": "NONE", "priceEntity": "NONE", "pricingStrategy": "FLAT", "definition": { "price": "10.0000000000", "priceRanges": null }, "calculations": [ { "quantity": "1.0000000000", "salePrice": "10.0000000000", "totalPrice": "10.0000000000" } ] } ] } ] }, "effectiveCost": { "costs": [ { "costId": "2fbde3b4-f92a-11e8-8fb5-125b89b63428", "costTypeCategory": "RECURRING", "costType": "RECURRING_FLAT", "pricingStrategy": "FLAT", "unit": null, "definition": { "price": "10.0000000000", "priceRanges": null }, "calculations": [ { "quantity": "1.0000000000", "salePrice": "10.0000000000", "totalPrice": "10.0000000000" } ] } ] }, "schedule": { "billingCycle": { "period": "MONTHLY", "dayOfMonth": 15 }, "servicePeriod": { "start": "2019-02-15", "end": null }, "billingPeriod": { "start": "2019-02-15", "end": null }, "freeTrialPeriod": null } } ], "recurringTotals": [ { "billingCycle": { "period": "MONTHLY", "dayOfMonth": 15 }, "totalSalePrice": "215.0000000000", "nextInvoiceDate": "2019-02-15" } ] }` ## [](#tag/ShoppingCart/operation/getPricingSummaryByShoppingCartId)Retrieve pricing summary Retrieves a pricing summary for the cart. The pricing summary includes the detailed and effective costs as well as the billing schedule and recurring charges. The effective cost indicates the price that the customer pays whereas the detailed cost provides the price sources used in the calculation of the effective cost. Prices are not prorated and tax is not included in the pricing summary. ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ##### header Parameters | | | | ----------- | ------ | | AD-Timezone | string | ### Responses **200** OK get/v3/checkout/shoppingCarts/{shoppingCartId}/pricingSummary https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/pricingSummary https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/pricingSummary ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/pricingSummary \ --header 'AD-Timezone: SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "items": [ { "itemId": "0dfba095-1727-4885-b90c-c32344090a3b", "pricingPlanId": "d0495026-dcab-45fe-858a-757491e93121", "productId": "5932bcea-5485-4a81-9b34-58ccd4210132", "editionId": "c134a1b5-b667-45a3-b572-8f3453a277a7", "detailedCost": { "costSources": [ { "costId": "2fbde3b4-f92a-11e8-8fb5-125b89b63428", "costTypeCategory": "RECURRING", "costType": "RECURRING_FLAT", "unit": null, "sources": [ { "priceType": "BASE_PRICE", "priceLevel": "NONE", "priceEntity": "NONE", "pricingStrategy": "FLAT", "definition": { "price": "10.0000000000", "priceRanges": null }, "calculations": [ { "quantity": "1.0000000000", "salePrice": "10.0000000000", "totalPrice": "10.0000000000" } ] } ] } ] }, "effectiveCost": { "costs": [ { "costId": "2fbde3b4-f92a-11e8-8fb5-125b89b63428", "costTypeCategory": "RECURRING", "costType": "RECURRING_FLAT", "pricingStrategy": "FLAT", "unit": null, "definition": { "price": "10.0000000000", "priceRanges": null }, "calculations": [ { "quantity": "1.0000000000", "salePrice": "10.0000000000", "totalPrice": "10.0000000000" } ] } ] }, "schedule": { "billingCycle": { "period": "MONTHLY", "dayOfMonth": 15 }, "servicePeriod": { "start": "2019-02-15", "end": null }, "billingPeriod": { "start": "2019-02-15", "end": null }, "freeTrialPeriod": null } } ], "recurringTotals": [ { "billingCycle": { "period": "MONTHLY", "dayOfMonth": 15 }, "totalSalePrice": "215.0000000000", "nextInvoiceDate": "2019-02-15" } ] }` ## [](#tag/ShoppingCart/operation/validateShoppingCart)Validate non-persisted shopping carts Validates and retrieves the validation summary of the specified shopping cart payload ##### query Parameters | | | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | levelrequired | stringEnum: "PRE\_FINALIZE" "PREVENT\_FINALIZE" "PREVENT\_PROVISIONING"Level of validation. Run PRE\_FINALIZE validations before the shopping cart is finalized. Run PREVENT\_FINALIZE and PREVENT\_PROVISIONING at the time of finalization and provisioning respectively to prevent those operations if validation fails. | ##### header Parameters | | | | ------------------------------- | --------------------------------------- | | AD-ShoppingCart-Partnerrequired | stringThe partner code of a marketplace | ##### Request Body schema: application/jsonrequired | | | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | stringShopping cart ID | | createdOn | stringShopping cart creation date | | ownerUserId | stringDefault:""Cart owner user ID | | ownerCompanyId | stringDefault:""Cart owner company ID | | buyerType | string (BuyerType)Default:"CUSTOMER"Enum: "CUSTOMER" "PLATFORM\_OWNER" "PARTNER"Describes the buyer's relationship with the platform, either CUSTOMER (end user), PLATFORM\_OWNER (sales representative) or PARTNER (reseller) | | currency | string (Currency)Default:"USD"Enum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Supported currencies for the system | | status | stringShopping cart status | | isBlocked | booleanDefault:falseShopping Cart is locked waiting for an external event | | paymentMethodId | stringDefault:""Payment method ID | | preAuthId | stringDefault:""Cart payment pre-authorization ID | | locale | stringDefault:""Locale of shopping cart (ISO 639 language, ISO 3166 country, variant). | | buyerUserId | stringDefault:""User ID of the buyer (customer, reseller, sales representative) who initiates the purchase | | buyerCompanyId | stringDefault:""Buyer company ID | | items | Array of objects (ShoppingCartItem) | | customAttributes | object (ShoppingCartCustomAttributes)Custom attributes for the purchase, buyer, and owner | | associations | Array of objects (Association)Item associations | | fees | Array of objects (Fee)Cart fees | | accreditedAgents | Array of objects (AccreditedAgent) | ### Responses **200** OK post/v3/checkout/shoppingCarts/validation https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/validation https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/validation ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "id": "4f59d160-0e63-45c4-bb91-7ebe873da29f", "createdOn": "2020-10-12 07:20:50.52Z", "ownerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "ownerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "buyerType": "CUSTOMER", "currency": "USD", "status": "ACTIVE", "isBlocked": false, "paymentMethodId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "preAuthId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "locale": "en_US", "buyerUserId": "83407ce8-373f-11e6-ac61-9e71128cae77", "buyerCompanyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118", "items": [ { "id": "45ae34b7-ffc1-4d74-be78-dce34008cd2e", "referenceId": "45", "subscriptionId": "83407ce8-373f-11e6-ac61-9e71128cae77", "pricingPlanId": "3dcc468d-fd4c-41ce-b700-f88c0c74561f", "serviceConfiguration": { "date": "2010-10-19T00:00:00.000Z", "strategy": "CUSTOM" }, "billingConfiguration": { "date": "1546300800000", "strategy": "CUSTOM" }, "discountCode": "DISCOUNT", "discountId": "30", "customPrices": [ { "costId": "9742e09a-e1b4-4b9e-b1a7-66df3e41cebe", "price": 20 } ], "units": [ ], "customAttributes": { "vendorRequiredFields": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "subscription": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "customContractConfiguration": { "minimumServiceLength": 1, "minimumServiceLengthUnit": "MONTHLY", "endOfContractGracePeriod": 0, "endOfContractGracePeriodUnit": "INFINITY", "contractCancellationPeriodLimit": 0, "contractCancellationPeriodUnit": "NONE", "continueWithoutContract": false, "autoExtensionPricingId": "string", "terminationFeeGracePeriod": 0, "terminationFeeGracePeriodUnit": "INFINITY", "blockContractUpgrades": false, "blockContractDowngrades": false, "blockSwitchToShorterContract": false, "keepContractDateOnPlanChange": false, "alignWithParentCycleStartDate": false, "unitTerms": { "property1": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true }, "property2": { "blockContractIncrease": false, "blockOriginalContractDecrease": false, "blockContractDecrease": true } }, "sourceId": "string", "terminationFee": { "feeType": "FIXED", "amount": 0, "description": "string" }, "contractFee": 0 } } ], "customAttributes": { "purchase": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "buyerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerUser": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } }, "ownerCompany": { "customAttributes": { "preferredColours": [ "key_red", "key_white" ], "preferredTime": "12:00" } } }, "associations": [ { "parentItemId": "string", "childItemIds": [ "string" ], "type": "ADDON" } ], "fees": [ { "id": "ce402858-4fe8-4254-8b69-73c41142f4ba", "externalId": "a8bf31a8-fe75-4ab9-9559-dcd41eca9d12", "createdOn": "2020-10-12 07:20:50.52Z", "key": "SHIPPING_FEE_100", "currency": "USD", "amount": "9.81", "description": { "defaultDescription": "Some description here. Valid from {$fromDate} until {$toDate}", "localizedDescriptions": "{\"en_US\": \"Some description here. Valid from {$fromDate} until {$toDate}\", \"es_AR\": \"Alguna descripción acá. Válido desde {$fromDate} hasta {$toDate}\"}", "params": "{\"fromDate\": \"2019-10-12 07:20:50.52Z\", \"toDate\": \"2020-10-12 07:20:50.52Z\"}" }, "revenueShare": { "appdirect": "0.00", "channel": "1.00", "vendor": "0.00" }, "itemIds": "[\"b126e204-05f9-444a-af43-7629069eed03\", \"20de5578-a903-43da-95b8-65a3b584bc29\", \"a104ae19-d5cd-4de1-802b-5b2ec60e7fbf\"]", "metadata": "key1: \"value1\"" } ], "accreditedAgents": [ { "userId": "83407ce8-373f-11e6-ac61-9e71128cae77", "companyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118" } ] }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "ad26eb9c-f414-4ae1-9c52-06c478ec12b0", "blockingErrors": [ { "code": "PRICING_PLAN_NOT_FOUND", "message": "Pricing plan with ID e209b620-1fc3-4fe9-bd38-e811e605df8 not found.", "messageParameters": [ { "key": "PRICING_PLAN", "value": "e209b620-1fc3-4fe9-bd38-e811e605df8" } ] } ], "warnings": [ ], "info": [ ], "pendingValidations": [ ] }` ## [](#tag/ShoppingCart/operation/createShoppingCartValidationByShoppingCartId)Validate persisted shopping carts Validates and retrieves the validation summary of the specified shopping cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ##### query Parameters | | | | ------------- | ---------------------------------------------------------------------------------------------------------- | | levelrequired | stringEnum: "PRE\_FINALIZE" "PREVENT\_FINALIZE" "PREVENT\_PROVISIONING"Level of validation | ### Responses **200** OK post/v3/checkout/shoppingCarts/{shoppingCartId}/validation https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/validation https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/validation ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url 'https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/validation?level=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "ad26eb9c-f414-4ae1-9c52-06c478ec12b0", "blockingErrors": [ { "code": "PRICING_PLAN_NOT_FOUND", "message": "Pricing plan with ID e209b620-1fc3-4fe9-bd38-e811e605df8 not found.", "messageParameters": [ { "key": "PRICING_PLAN", "value": "e209b620-1fc3-4fe9-bd38-e811e605df8" } ] } ], "warnings": [ ], "info": [ ], "pendingValidations": [ ] }` ## [](#tag/ShoppingCart/operation/getShoppingCartValidationByShoppingCartId)Read validation summary for persisted shopping carts Retrieves the validation summary for the specified shopping cart, but does not validate the cart. You must use the "Validate persisted shopping carts" request to generate a summary before you can use this request. ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ### Responses **200** OK get/v3/checkout/shoppingCarts/{shoppingCartId}/validation https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/validation https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/validation ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/validation ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "ad26eb9c-f414-4ae1-9c52-06c478ec12b0", "blockingErrors": [ { "code": "PRICING_PLAN_NOT_FOUND", "message": "Pricing plan with ID e209b620-1fc3-4fe9-bd38-e811e605df8 not found.", "messageParameters": [ { "key": "PRICING_PLAN", "value": "e209b620-1fc3-4fe9-bd38-e811e605df8" } ] } ], "warnings": [ ], "info": [ ], "pendingValidations": [ ] }` ## [](#tag/ShoppingCart/operation/deleteDiscountByShoppingCartId)Remove cart discounts Deletes a discount by code from shopping cart items. To remove the discount from specific items only, send the item IDs as parameters. Otherwise, the discount will be removed from all items. ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | | discountCoderequired | stringDiscount code | ##### query Parameters | | | | ------ | ----------------------------- | | itemId | Array of stringsCart item IDs | ### Responses **204** NO CONTENT delete/v3/checkout/shoppingCarts/{shoppingCartId}/discounts/{discountCode} https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/discounts/{discountCode} https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/discounts/{discountCode} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url 'https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/discounts/%7BdiscountCode%7D?itemId=SOME_ARRAY_VALUE' ``` ## [](#tag/ShoppingCart/operation/deleteShoppingCartFee)Delete shopping cart fees Removes fees from the specified cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | | feeIdrequired | stringFee UUID | ##### header Parameters | | | | ----------------------- | --------------------------------------- | | AD-ShoppingCart-Partner | stringThe partner code of a marketplace | ### Responses **204** NO CONTENT delete/v3/checkout/shoppingCarts/{shoppingCartId}/fees/{feeId} https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/fees/{feeId} https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/fees/{feeId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/fees/%7BfeeId%7D \ --header 'AD-ShoppingCart-Partner: SOME_STRING_VALUE' ``` ## [](#tag/ShoppingCart/operation/createShoppingCartFee)Create cart fees Creates a fee and applies it to the specified cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ##### header Parameters | | | | ------------------------------- | --------------------------------------- | | AD-ShoppingCart-Partnerrequired | stringThe partner code of a marketplace | ##### Request Body schema: application/jsonrequired | | | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | id | stringFee ID | | externalId | stringExternal ID assigned by the fee provider service | | createdOn | stringFee creation date and time | | key | stringKey used to identify fee type | | currency | stringCurrency code (ISO 4217) of the fee | | amount | numberFee amount | | description | object (Description)Description of the fee | | revenueShare | object (RevenueShare)Revenue shares of the fee sent to AppDirect, the marketplace owner, and the product vendor. The total of all three revenue shares must be 1.00. | | itemIds | Array of stringsList of item IDs | | metadata | objectMetadata | ### Responses **200** OK post/v3/checkout/shoppingCarts/{shoppingCartId}/fees https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/fees https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/fees ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "id": "ce402858-4fe8-4254-8b69-73c41142f4ba", "externalId": "a8bf31a8-fe75-4ab9-9559-dcd41eca9d12", "createdOn": "2020-10-12 07:20:50.52Z", "key": "SHIPPING_FEE_100", "currency": "USD", "amount": "9.81", "description": { "defaultDescription": "Some description here. Valid from {$fromDate} until {$toDate}", "localizedDescriptions": "{\"en_US\": \"Some description here. Valid from {$fromDate} until {$toDate}\", \"es_AR\": \"Alguna descripción acá. Válido desde {$fromDate} hasta {$toDate}\"}", "params": "{\"fromDate\": \"2019-10-12 07:20:50.52Z\", \"toDate\": \"2020-10-12 07:20:50.52Z\"}" }, "revenueShare": { "appdirect": "0.00", "channel": "1.00", "vendor": "0.00" }, "itemIds": "[\"b126e204-05f9-444a-af43-7629069eed03\", \"20de5578-a903-43da-95b8-65a3b584bc29\", \"a104ae19-d5cd-4de1-802b-5b2ec60e7fbf\"]", "metadata": "key1: \"value1\"" }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "ce402858-4fe8-4254-8b69-73c41142f4ba", "externalId": "a8bf31a8-fe75-4ab9-9559-dcd41eca9d12", "createdOn": "2020-10-12 07:20:50.52Z", "key": "SHIPPING_FEE_100", "currency": "USD", "amount": "9.81", "description": { "defaultDescription": "Some description here. Valid from {$fromDate} until {$toDate}", "localizedDescriptions": "{\"en_US\": \"Some description here. Valid from {$fromDate} until {$toDate}\", \"es_AR\": \"Alguna descripción acá. Válido desde {$fromDate} hasta {$toDate}\"}", "params": "{\"fromDate\": \"2019-10-12 07:20:50.52Z\", \"toDate\": \"2020-10-12 07:20:50.52Z\"}" }, "revenueShare": { "appdirect": "0.00", "channel": "1.00", "vendor": "0.00" }, "itemIds": "[\"b126e204-05f9-444a-af43-7629069eed03\", \"20de5578-a903-43da-95b8-65a3b584bc29\", \"a104ae19-d5cd-4de1-802b-5b2ec60e7fbf\"]", "metadata": "key1: \"value1\"" }` ## [](#tag/ShoppingCart/operation/updateShoppingCartAccreditedAgents)Set accredited agents Associates an accredited Agent with the specified cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ##### header Parameters | | | | ------------------------------- | --------------------------------------- | | AD-ShoppingCart-Partnerrequired | stringThe partner code of a marketplace | ##### Request Body schema: application/jsonrequired | | | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------- | | accreditedAgents | Array of objects (AccreditedAgent) | | ArrayuserId string Default: "" Accredited agent to whom the purchase is attributed. companyId string Default: "" Company of the accredited agent to whom the purchase is attributed. | | ### Responses **200** OK put/v3/checkout/shoppingCarts/{shoppingCartId}/accreditedAgents https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/accreditedAgents https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/accreditedAgents ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "accreditedAgents": [ { "userId": "83407ce8-373f-11e6-ac61-9e71128cae77", "companyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118" } ] }` ### Response samples * 200 Content type application/json Copy `{ "userId": "83407ce8-373f-11e6-ac61-9e71128cae77", "companyId": "a411dc54-d46f-4002-ab00-3ea52e4eb118" }` ## [](#tag/ShoppingCart/operation/deleteShoppingCartAccreditedAgents)Remove accredited agents Removes the accredited agent from the specified cart ##### path Parameters | | | | ---------------------- | ---------------------- | | shoppingCartIdrequired | stringShopping cart ID | ##### header Parameters | | | | ------------------------------- | --------------------------------------- | | AD-ShoppingCart-Partnerrequired | stringThe partner code of a marketplace | ### Responses **204** NO CONTENT delete/v3/checkout/shoppingCarts/{shoppingCartId}/accreditedAgents https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/{shoppingCartId}/accreditedAgents https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/{shoppingCartId}/accreditedAgents ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/%7BshoppingCartId%7D/accreditedAgents \ --header 'AD-ShoppingCart-Partner: SOME_STRING_VALUE' ``` ## [](#tag/ShoppingCart/operation/notifyLockedCarts)Send locked cart notifications Finds all locked carts in ACTIVE status and sends approval request notifications for each one. Locked carts must be approved before they can be finalized. ##### header Parameters | | | | ----------------------- | --------------------------------------- | | AD-ShoppingCart-Partner | stringThe partner code of a marketplace | ### Responses **200** OK post/v3/checkout/shoppingCarts/notifyLockedCarts https\://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/notifyLockedCarts https\://virtserver.swaggerhub.com/v3/checkout/shoppingCarts/notifyLockedCarts ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/v3/checkout/shoppingCarts/notifyLockedCarts \ --header 'AD-ShoppingCart-Partner: SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy `"string"` # [](#tag/SubscriptionAssignments)Subscription Assignments ## [](#tag/SubscriptionAssignments/operation/resource_Subscription_readSubscriptionAssignment_GET)Read application assignment for user and subscription Retrieve a marketplace user's application assignment for a given subscription. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as a user and owner of the user entitlement. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access as a member of the company that owns the subscription. ##### path Parameters | | | | ------------------------ | ---------------------------------------------------------------------- | | subscriptionUuidrequired | stringUnique identifier of the company subscription in the API request | | userUuidrequired | stringUnique identifier of the user in the API request | ### Responses **200** Success **401** Unauthorized **404** Subscription, user or assignment not found get/account/v2/subscriptions/{subscriptionUuid}/assignments/{userUuid} https\://marketplace.appdirect.com/api/account/v2/subscriptions/{subscriptionUuid}/assignments/{userUuid} https\://virtserver.swaggerhub.com/account/v2/subscriptions/{subscriptionUuid}/assignments/{userUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/subscriptions/%7BsubscriptionUuid%7D/assignments/%7BuserUuid%7D ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/SubscriptionAssignments/operation/resource_Subscription_createSubscriptionAssignment_POST)Create application assignment Create an application assignment for a marketplace user. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as the user that owns the subscription. * `ROLE_BILLING_ADMIN` - Allows access as a Billing Admin of the company that owns the subscription. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access as a member of the company that owns the subscription. ##### path Parameters | | | | ------------------------ | ---------------------------------------------------------------------- | | subscriptionUuidrequired | stringUnique identifier of the company subscription in the API request | | userUuidrequired | stringUnique identifier of the user to assign the application to | ##### query Parameters | | | | ----------- | --------------------------------------------------------------------------------------------------------- | | creatorUuid | stringOptional parameter and will be ignored if the APIs are accessed using any role except ROLE\_PARTNER | ##### Request Body schema: application/json Optional custom user attributes to associate with the created application assignment | | | | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | name | stringThe key name of an existing subscription custom attribute | | values | Array of stringsValues of the custom attributes. If the attribute definition is MULTISELECT, all values must be a subset of the value options defined in the marketplace. If the attribute definition is TEXT, only one value is allowed. | ### Responses **200** Success **201** Success, subscription created (async) **401** Unauthorized or subscription/user not found **502** Error occurred post/account/v2/subscriptions/{subscriptionUuid}/assignments/{userUuid} https\://marketplace.appdirect.com/api/account/v2/subscriptions/{subscriptionUuid}/assignments/{userUuid} https\://virtserver.swaggerhub.com/account/v2/subscriptions/{subscriptionUuid}/assignments/{userUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "name": "test1", "values": [ "value1", "value2" ] }` ### Response samples * 200 * 502 Content type \*/\*\*/\* No sample ## [](#tag/SubscriptionAssignments/operation/resource_Subscription_deleteSubscriptionAssignment_DELETE)Delete application assignment Delete a marketplace user's application assignment. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as the user that owns the subscription. * `ROLE_BILLING_ADMIN` - Allows access as a Billing Admin of the company that owns the subscription. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER` - Allows access to manage all marketplace data. ##### path Parameters | | | | ------------------------ | ---------------------------------------------------------------------------- | | subscriptionUuidrequired | stringUnique identifier of the company subscription in the API request | | userUuidrequired | stringUnique identifier of the user to remove the application assignment for | ##### query Parameters | | | | ------------------------- | ----------------------------------------------------------------------------------------- | | disconnectVoiceConnection | booleanDisconnect voice connection of Boost application | | source | stringSource of event. Possible values are: APP\_SYNC, MICROSOFT\_PROVISIONING\_MIGRATION | ### Responses **200** Success **204** Account not found **401** Unauthorized or subscription/user not found delete/account/v2/subscriptions/{subscriptionUuid}/assignments/{userUuid} https\://marketplace.appdirect.com/api/account/v2/subscriptions/{subscriptionUuid}/assignments/{userUuid} https\://virtserver.swaggerhub.com/account/v2/subscriptions/{subscriptionUuid}/assignments/{userUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url 'https://marketplace.appdirect.com/api/account/v2/subscriptions/%7BsubscriptionUuid%7D/assignments/%7BuserUuid%7D?disconnectVoiceConnection=SOME_BOOLEAN_VALUE&source=SOME_STRING_VALUE' ``` ## [](#tag/SubscriptionAssignments/operation/resource_Subscription_readSubscriptionAssignments_GET)List application assignments for subscription Retrieve the list of marketplace application assignments for the given subscription. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as a member of the company that owns the subscription. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------------ | ---------------------------------------------------------------------- | | subscriptionUuidrequired | stringUnique identifier of the company subscription in the API request | ##### query Parameters | | | | ---------- | -------------------------------------------------------------------------------- | | page | integerDefault:0Zero-based page index | | searchText | stringSearch term used to search on different assignment fields | | size | integerDefault:50The number of search results to return per page | ### Responses **200** Success **401** Unauthorized **404** Subscription or assignments not found get/account/v2/subscriptions/{subscriptionUuid}/assignments https\://marketplace.appdirect.com/api/account/v2/subscriptions/{subscriptionUuid}/assignments https\://virtserver.swaggerhub.com/account/v2/subscriptions/{subscriptionUuid}/assignments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/subscriptions/%7BsubscriptionUuid%7D/assignments?page=SOME_INTEGER_VALUE&searchText=SOME_STRING_VALUE&size=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/SubscriptionAssignments/operation/resource_Subscription_readSubscriptionAssignmentCount_HEAD)Read application assignment count Retrieve the number of users assigned to a subscription. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as a member of the company that owns the subscription. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### path Parameters | | | | ------------------------ | ---------------------------------------------------------------------- | | subscriptionUuidrequired | stringUnique identifier of the company subscription in the API request | ### Responses **200** Success **401** Unauthorized or subscription not found head/account/v2/subscriptions/{subscriptionUuid}/assignments https\://marketplace.appdirect.com/api/account/v2/subscriptions/{subscriptionUuid}/assignments https\://virtserver.swaggerhub.com/account/v2/subscriptions/{subscriptionUuid}/assignments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request HEAD \ --url https://marketplace.appdirect.com/api/account/v2/subscriptions/%7BsubscriptionUuid%7D/assignments ``` ### Response samples * 200 Content type headers Copy ``` { "X-Total-Count": 1 } ``` # [](#tag/AppResellerAssignment)Subscription Assignments (Reseller) ## [](#tag/AppResellerAssignment/operation/resource_AppResellerV1SubscriptionAssignmentApi_POST)Assign product Assign a seat of a purchased product to a user who is a member of a linked marketplace company ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. ##### Request Body schema: application/json Information about user and subscription to be assigned | | | | ---------------------- | ---------------------------------------------------------- | | userIdrequired | stringID of the user to whom the product will be assigned | | subscriptionIdrequired | stringID of the product subscription to assign to the user | ### Responses **200** Assignment created **401** Unauthorized **409** Conflict post/appReseller/v1/subscriptionAssignments https\://marketplace.appdirect.com/api/appReseller/v1/subscriptionAssignments https\://virtserver.swaggerhub.com/appReseller/v1/subscriptionAssignments ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "userId": "2c061df6-4313-45e0-8709-a0ca19b0aaa3", "subscriptionId": "386626c0-53e2-4515-8450-4a720bb5d029" }` ### Response samples * 200 * 409 Content type application/json Copy Expand all Collapse all `{ "id": "63bf81c2-8e01-48b7-a8b1-46a0efa0e823", "status": "ACTIVE", "createdOn": 1529083173000, "subscriptionId": "386626c0-53e2-4515-8450-4a720bb5d029", "user": { "id": "386626c0-53e2-4515-8450-4a720bb5d029", "firstName": "Michael", "lastName": "Jordan" } }` ## [](#tag/AppResellerAssignment/operation/resource_AppResellerV1SubscriptionAssignmentApi_GET)List subscription assignments Retrieves a list of assignments for a given subscription. You can filter the list using optional query parameters. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. ##### query Parameters | | | | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | number | integerPage number starting at 1. The default value is 1. | | size | integerNumber of results per page. The default value is 50. | | sort | stringSort field and order. For ascending sort order, use the '+\[FieldName]' format. For descending order, use '-\[FieldName]' format. The default value is '-createdOn'. | | createdOn | stringDate filter, defined by upper or lower inclusive limits, in Unix timestamp format. Acceptable values are: gte(\[timestamp]) - 'greater than or equal to'; lte(\[timestamp]) - 'less than or equal to'. | | status | stringSubscription status (valid values are PENDING\_REQUIRED\_DATA, PENDING\_SEAT\_AVAILABILITY, PENDING\_USER\_ACTIVATION, PENDING\_REMOTE\_CREATION, SUBSCRIPTION\_SUSPENDED\_FREE\_TRIAL\_EXPIRED, SUBSCRIPTION\_SUSPENDED\_RENEW\_CONTRACT, SUBSCRIPTION\_SUSPENDED\_PAY\_INVOICE, SUBSCRIPTION\_SUSPENDED\_MANUAL\_SUSPENSION, FAILED, ACTIVE, PENDING\_REMOTE\_CANCELLATION, CANCELLED). The filter format is: in(\[status], ...). | | subscriptionIdrequired | stringSubscription ID purchased by the Reseller company | | userId | stringUser ID. Use the in(\[id], ...) format to filter by multiple IDs, or the userId=\[id] format to filter by a single ID. | ### Responses **200** Success **401** Unauthorized get/appReseller/v1/subscriptionAssignments https\://marketplace.appdirect.com/api/appReseller/v1/subscriptionAssignments https\://virtserver.swaggerhub.com/appReseller/v1/subscriptionAssignments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/subscriptionAssignments?number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sort=SOME_STRING_VALUE&createdOn=SOME_STRING_VALUE&status=SOME_STRING_VALUE&subscriptionId=SOME_STRING_VALUE&userId=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "63bf81c2-8e01-48b7-a8b1-46a0efa0e823", "status": "ACTIVE", "createdOn": 1529083173000, "subscriptionId": "386626c0-53e2-4515-8450-4a720bb5d029", "user": { "id": "386626c0-53e2-4515-8450-4a720bb5d029", "firstName": "Michael", "lastName": "Jordan" } }, { "id": "5cdf116b-0603-4d26-88d8-5e1afd625931", "status": "CANCELLED", "createdOn": 1527863555000, "subscriptionId": "386626c0-53e2-4515-8450-4a720bb5d029", "user": { "id": "bb14ace3-4490-47e8-84f1-ab6a85da69e5", "firstName": "Mary", "lastName": "Gonzalez" } } ], "page": { "size": 50, "totalElements": 2, "totalPages": 1, "number": 1 } }` ## [](#tag/AppResellerAssignment/operation/resource_AppResellerBillingV1AssignmentApi_DELETE)Unassign product Unassign a product from a user. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company. ##### path Parameters | | | | -------------------------------- | --------------------------------- | | subscriptionAssignmentIdrequired | stringSubscription Assignment ID. | ### Responses **204** Unassignment request accepted or assignment not found **400** Assignment application not enabled for usage **401** User not authenticated **409** Assignment status not compatible delete/appReseller/v1/subscriptionAssignments/{subscriptionAssignmentId} https\://marketplace.appdirect.com/api/appReseller/v1/subscriptionAssignments/{subscriptionAssignmentId} https\://virtserver.swaggerhub.com/appReseller/v1/subscriptionAssignments/{subscriptionAssignmentId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/appReseller/v1/subscriptionAssignments/%7BsubscriptionAssignmentId%7D ``` # [](#tag/Subscriptions)Subscriptions ## [](#tag/Subscriptions/operation/resource_Subscription_requestSubscriptionReactivation_POST)Subscription reactivation request Send a subscription reactivation request. This endpoint sends a notification to the subscription owner. If company-wide billing is enabled, this endpoint also sends a notification to all company administrators (Company Admin and Billing Admin). ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as a member of the company that owns the subscription. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. ##### path Parameters | | | | ------------------------ | ------------------------------------------------------------------ | | subscriptionUuidrequired | stringUnique identifier of company subscription in the API request | ### Responses **200** Success **401** Unauthorized or subscription not found post/account/v2/subscriptions/{subscriptionUuid}/reactivationRequest https\://marketplace.appdirect.com/api/account/v2/subscriptions/{subscriptionUuid}/reactivationRequest https\://virtserver.swaggerhub.com/account/v2/subscriptions/{subscriptionUuid}/reactivationRequest ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request POST \ --url https://marketplace.appdirect.com/api/account/v2/subscriptions/%7BsubscriptionUuid%7D/reactivationRequest ``` ## [](#tag/Subscriptions/operation/resource_Subscription_readSamlCertificate_GET)Read subscription SAML Certificate Retrieve a subscriptions's public SAML verification certificate. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as the user that owns the subscription. * `ROLE_BILLING_ADMIN` - Allows access as a Billing Admin of the company that owns the subscription. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows read access to all marketplace data. * `ROLE_CHANNEL_PRODUCT_SUPPORT` - Allows access as a Product Support agent for the marketplace. * `ROLE_APPLICATION` - Allows access as the Developer that owns the Product. ##### path Parameters | | | | ------------------------ | ------------------------------------------------------------------ | | subscriptionUuidrequired | stringUnique identifier of company subscription in the API request | ### Responses **200** Success **401** Unauthorized **500** Subscription not found get/account/v2/subscriptions/{subscriptionUuid}/saml/certificate https\://marketplace.appdirect.com/api/account/v2/subscriptions/{subscriptionUuid}/saml/certificate https\://virtserver.swaggerhub.com/account/v2/subscriptions/{subscriptionUuid}/saml/certificate ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/subscriptions/%7BsubscriptionUuid%7D/saml/certificate ``` ### Response samples * 200 Content type application/json Copy `"-----BEGIN CERTIFICATE-----\nMIICyDCCAbCgAwIBAgIGAWF7mAIjMA0GCSqGSIb3DQEBBQUAMCUxIzAhBgNVBAoM\nGkNPTVBBTllfRU5USVRMRU1FTlQtNzQ1NzI5MB4XDTE4MDIwODE3MjMzNVoXDTIz\nMDIwOTE3MjMzNVowJTEjMCEGA1UECgwaQ09NUEFOWV9FTlRJVExFTUVOVC03NDU3\nMjkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCQvnSC76Jwsrjw0FDO\nMzutqNLyrlww86LiEcDiaGn/Ms6cASbpQFJiA7f5BVbTHCAS4fPQnLcBoZs25OwP\n69ibm5hrJlfmZwPVU0Odqd9M/kGmV4U4EDgieH6BcF0cXwpJ8OeXLhf8N+9tr9sN\n7MvkvMgGqpjwXAwYDFZWxBf0+k6O+rO/XuCuIKtc4eD0jPIS6NfxD5DvXNGc83ro\nffgjM0HNq41jieDAhmAAnj12LoRE4V3qQwqbE3p5JBHsmjOJ2/kGoZdkorf3oSuT\njlsLooDi/NTKlWxnlIvnlNSBnlfzpZl6yQIW4j8FDe/4p02G6VMYIozTB37OM98j\n4USHAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAHrlJjQs05EykfyuvUFZUOjAiqwN\nM/1WHW8xtCA/qa7H1PJQ6B7xyJcmw/ad23ui74sycfkmCLMACP1tb0M8CJ6/rsZH\nltUy8sXSGg3fyTA9Ff8sJiMs0nCw0Wzkk+P5JGig7kPBi1W7gSFTP4tfrktp65sU\nxefLNh/axCHE2C5lxrYtwsE8ocSqNZwPDIWihcaapvdxDyr8l62F2dL3NXulLVRW\nOV4G+KGVwCCEswjTN3idyGjknBCgaiFmKMPFeZm5feUE6f2D40Z/CLrcaB1HV5/q\nMBljuA6qKsDLaABwtxvviQ18p2GYmfpXv5mLJlSNSRnzH9zQzjGsqV09x7U=\n-----END CERTIFICATE-----\n"` ## [](#tag/Subscriptions/operation/resource_Subscription_readSamlInfo_GET)Read SAML metadata for subscription Retrieve a subscription's SAML metadata. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access as the user that owns the subscription. * `ROLE_BILLING_ADMIN` - Allows access as a Billing Admin of the company that owns the subscription. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows read access to all marketplace data. * `ROLE_CHANNEL_PRODUCT_SUPPORT` - Allows access as a Product Support agent for the marketplace. * `ROLE_APPLICATION` - Allows access as the Developer that owns the Product. ##### path Parameters | | | | ------------------------ | ------------------------------------------------------------------ | | subscriptionUuidrequired | stringUnique identifier of company subscription in the API request | ### Responses **200** Success **401** Unauthorized **404** Subscription not found get/account/v2/subscriptions/{subscriptionUuid}/saml https\://marketplace.appdirect.com/api/account/v2/subscriptions/{subscriptionUuid}/saml https\://virtserver.swaggerhub.com/account/v2/subscriptions/{subscriptionUuid}/saml ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/subscriptions/%7BsubscriptionUuid%7D/saml ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/Subscriptions/operation/resource_Other_readCompanySubscriptions_GET)List all subscriptions for a company List all of the subscriptions for the given company ##### path Parameters | | | | ----------------- | ---------------- | | companyIdrequired | stringCompany ID | ##### query Parameters | | | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | fromDate | stringFilters results to only include subscriptions that were created on or after the specified date in yyyy/MM/DD HH:mm:ss format | | toDate | stringFilters results to only include subscriptions that were created on or before the specified date in yyyy/MM/DD HH:mm:ss format | | discountId | numberFilters subscriptions by internal discount ID | | status | stringFilters subscriptions by status | | editionId | numberFilters subscriptions by internal edition ID | | paymentPlanId | numberFilters subscriptions by internal payment plan ID | | lastModified | numberFilters subscriptions by last modified date | | applicationIds | numberFilters subscriptions by internal application ID | | bundleApplicationId | numberFilters subscriptions by internal bundle ID | | expand | stringExpands filtered subscription results to include details about the specified query parameters, one or more of "order", "product", or "edition". | | orderReferenceCode | stringFilters subscriptions by order reference code | | count | integerDefault:250Number of results to fetch. Used for paging. | | sortField | stringDefault:"DATE"Enum: "APPLICATION" "COMPANY" "DATE" "OWNER" "STATUS" "SUBSCRIPTION\_ID"Sort field | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order | | start | integerDefault:0First result index. Used for paging. | ### Responses **200** OK **404** Not Found get/billing/v1/companies/{companyId}/subscriptions https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/subscriptions https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/subscriptions ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/companies/%7BcompanyId%7D/subscriptions?fromDate=SOME_STRING_VALUE&toDate=SOME_STRING_VALUE&discountId=SOME_NUMBER_VALUE&status=SOME_STRING_VALUE&editionId=SOME_NUMBER_VALUE&paymentPlanId=SOME_NUMBER_VALUE&lastModified=SOME_NUMBER_VALUE&applicationIds=SOME_NUMBER_VALUE&bundleApplicationId=SOME_NUMBER_VALUE&expand=SOME_STRING_VALUE&orderReferenceCode=SOME_STRING_VALUE&count=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Other_changeSubscription_PUT)Change subscription details Change the specified subscription for the specified user and company with the provided data.
You cannot perform assisted sales, in which the buyer purchases a product for or on behalf of someone else, through the API.
When you use the Change Subscription Details request to update a subscription that was created though the user interface as an assisted sale, a new order is created for the specified user ID and company. Because the new order is not created as an assisted sale, the salesSupportUser parameter is returned with a value of null. ##### path Parameters | | | | ---------------------- | ----------------------- | | companyIdrequired | stringUser's company ID | | subscriptionIdrequired | stringSubscription ID | | userIdrequired | stringUser ID | ##### query Parameters | | | | ---------------- | ----------------------------------------------------------------------------------------------------------- | | sendNotification | booleanDefault:trueSend notification of the subscription's creation. Default value is true. | ##### Request Body schema:application/xmlapplication/xml Subscription data object | | | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | assignedUsers | number or nullNumber of users assigned to subscription | | bundleApplicationId | number or nullBundle ID. Specify during subscription creation if you want the subscription to be part of a bundle. Retrieve a list of bundle IDs with the [List all bundles](#list-all-bundles) request, and then specify the desired ID here. Only supported for the [Create a subscription](#create-a-subscription) endpoint and not supported for any other endpoints. | | company | object or null (LinkWS) | | creationDate | number or nullSubscription creation date | | edition | object or null (LinkWS) | | endDate | number or nullSubscription end date | | externalAccountId | string or nullExternal account identifier (from vendor) | | id | string or nullID | | internalId | string or nullThe UUID for a subscription | | externalId | string or nullExternal ID for a subscription. Not used to change or create a subscription. If a subscription has an external ID, the ID is included in the responses to the [list subscription](#list-subscriptions) or [read subscription](#retrieve-a-subscription) APIs. To set an external ID of a subscription, use the [Update subscriptions](#update-subscriptions) API. | | label | string or nullLabel for a subscription | | maxUsers | number or nullMaximum number of users allowed to be assigned to subscription | | order | object or null (OrderWS)Resource links | | product | object or null (LinkWS) | | redirectUrl | string or nullInteractive endpoint URL | | status | string or nullSubscription status (Valid values are INITIALIZED, FAILED, FREE\_TRIAL, FREE\_TRIAL\_EXPIRED, ACTIVE, SUSPENDED, or CANCELLED.) | | upcomingOrder | object or null (OrderWS)Resource links | | user | object or null (LinkWS) | ### Responses **200** OK **400** Bad Request **404** Not Found **409** Conflict put/billing/v1/companies/{companyId}/users/{userId}/subscriptions/{subscriptionId} https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/subscriptions/{subscriptionId} https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/subscriptions/{subscriptionId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Other_readUserSubscriptions_GET)List all subscriptions for a user List all of the subscriptions for the given user ##### path Parameters | | | | ----------------- | ----------------------- | | companyIdrequired | stringUser's company ID | | userIdrequired | stringUser ID | ##### query Parameters | | | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | fromDate | stringFilters results to only include subscriptions that were created on or after the specified date in yyyy/MM/DD HH:mm:ss format | | toDate | stringFilters results to only include subscriptions that were created on or before the specified date in yyyy/MM/DD HH:mm:ss format | | discountId | numberFilters subscriptions by internal discount ID | | status | stringFilters subscriptions by order status | | editionId | numberFilters subscriptions by internal edition ID | | paymentPlanId | numberFilters subscriptions by internal payment plan ID | | lastModified | numberFilters subscriptions by last modified date | | applicationIds | numberFilters subscriptions by internal application ID | | bundleApplicationId | numberFilters subscriptions by internal bundle ID | | expand | stringExpands filtered subscription results to include details about the specified query parameters, one or more of "order", "product", or "edition". | | orderReferenceCode | stringFilters subscriptions by order reference code | | count | integerDefault:250Number of results to fetch. Used for paging. | | sortField | stringDefault:"DATE"Enum: "APPLICATION" "COMPANY" "DATE" "OWNER" "STATUS" "SUBSCRIPTION\_ID"Sort field | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order | | start | integerDefault:0First result index. Used for paging. | ### Responses **200** OK **404** Not Found get/billing/v1/companies/{companyId}/users/{userId}/subscriptions https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/subscriptions https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/subscriptions ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/companies/%7BcompanyId%7D/users/%7BuserId%7D/subscriptions?fromDate=SOME_STRING_VALUE&toDate=SOME_STRING_VALUE&discountId=SOME_NUMBER_VALUE&status=SOME_STRING_VALUE&editionId=SOME_NUMBER_VALUE&paymentPlanId=SOME_NUMBER_VALUE&lastModified=SOME_NUMBER_VALUE&applicationIds=SOME_NUMBER_VALUE&bundleApplicationId=SOME_NUMBER_VALUE&expand=SOME_STRING_VALUE&orderReferenceCode=SOME_STRING_VALUE&count=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Other_createSubscription_POST)Create a subscription Create a subscription for the given user and company using the provided data ##### path Parameters | | | | ----------------- | ----------------------- | | companyIdrequired | stringUser's company ID | | userIdrequired | stringUser ID | ##### query Parameters | | | | ---------------- | ----------------------------------------------------------------------------------------------------------- | | sendNotification | booleanDefault:trueSend notification of the subscription's creation. Default value is true. | ##### Request Body schema:application/xmlapplication/xml Subscription data object | | | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | assignedUsers | number or nullNumber of users assigned to subscription | | bundleApplicationId | number or nullBundle ID. Specify during subscription creation if you want the subscription to be part of a bundle. Retrieve a list of bundle IDs with the [List all bundles](#list-all-bundles) request, and then specify the desired ID here. Only supported for the [Create a subscription](#create-a-subscription) endpoint and not supported for any other endpoints. | | company | object or null (LinkWS) | | creationDate | number or nullSubscription creation date | | edition | object or null (LinkWS) | | endDate | number or nullSubscription end date | | externalAccountId | string or nullExternal account identifier (from vendor) | | id | string or nullID | | internalId | string or nullThe UUID for a subscription | | externalId | string or nullExternal ID for a subscription. Not used to change or create a subscription. If a subscription has an external ID, the ID is included in the responses to the [list subscription](#list-subscriptions) or [read subscription](#retrieve-a-subscription) APIs. To set an external ID of a subscription, use the [Update subscriptions](#update-subscriptions) API. | | label | string or nullLabel for a subscription | | maxUsers | number or nullMaximum number of users allowed to be assigned to subscription | | order | object or null (OrderWS)Resource links | | product | object or null (LinkWS) | | redirectUrl | string or nullInteractive endpoint URL | | status | string or nullSubscription status (Valid values are INITIALIZED, FAILED, FREE\_TRIAL, FREE\_TRIAL\_EXPIRED, ACTIVE, SUSPENDED, or CANCELLED.) | | upcomingOrder | object or null (OrderWS)Resource links | | user | object or null (LinkWS) | ### Responses **201** Created **400** Bad Request **404** Not Found **409** Conflict post/billing/v1/companies/{companyId}/users/{userId}/subscriptions https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/subscriptions https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/subscriptions ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 201 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Other_previewChangeSubscription_PUT)Preview changed subscription details Preview the changes for the given subscription using the provided data ##### path Parameters | | | | ---------------------- | ----------------------- | | companyIdrequired | stringUser's company ID | | subscriptionIdrequired | stringSubscription ID | | userIdrequired | stringUser ID | ##### Request Body schema:application/xmlapplication/xml Subscription data object | | | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | assignedUsers | number or nullNumber of users assigned to subscription | | bundleApplicationId | number or nullBundle ID. Specify during subscription creation if you want the subscription to be part of a bundle. Retrieve a list of bundle IDs with the [List all bundles](#list-all-bundles) request, and then specify the desired ID here. Only supported for the [Create a subscription](#create-a-subscription) endpoint and not supported for any other endpoints. | | company | object or null (LinkWS) | | creationDate | number or nullSubscription creation date | | edition | object or null (LinkWS) | | endDate | number or nullSubscription end date | | externalAccountId | string or nullExternal account identifier (from vendor) | | id | string or nullID | | internalId | string or nullThe UUID for a subscription | | externalId | string or nullExternal ID for a subscription. Not used to change or create a subscription. If a subscription has an external ID, the ID is included in the responses to the [list subscription](#list-subscriptions) or [read subscription](#retrieve-a-subscription) APIs. To set an external ID of a subscription, use the [Update subscriptions](#update-subscriptions) API. | | label | string or nullLabel for a subscription | | maxUsers | number or nullMaximum number of users allowed to be assigned to subscription | | order | object or null (OrderWS)Resource links | | product | object or null (LinkWS) | | redirectUrl | string or nullInteractive endpoint URL | | status | string or nullSubscription status (Valid values are INITIALIZED, FAILED, FREE\_TRIAL, FREE\_TRIAL\_EXPIRED, ACTIVE, SUSPENDED, or CANCELLED.) | | upcomingOrder | object or null (OrderWS)Resource links | | user | object or null (LinkWS) | ### Responses **200** OK **400** Bad Request **404** Not Found put/billing/v1/companies/{companyId}/users/{userId}/subscriptions/{subscriptionId}/preview https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/subscriptions/{subscriptionId}/preview https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/subscriptions/{subscriptionId}/preview ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Other_previewCreateSubscription_POST)Preview create a subscription Preview creating a subscription for the given user and company using the provided data ##### path Parameters | | | | ----------------- | ----------------------- | | companyIdrequired | stringUser's company ID | | userIdrequired | stringUser ID | ##### Request Body schema:application/xmlapplication/xml Subscription data object | | | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | assignedUsers | number or nullNumber of users assigned to subscription | | bundleApplicationId | number or nullBundle ID. Specify during subscription creation if you want the subscription to be part of a bundle. Retrieve a list of bundle IDs with the [List all bundles](#list-all-bundles) request, and then specify the desired ID here. Only supported for the [Create a subscription](#create-a-subscription) endpoint and not supported for any other endpoints. | | company | object or null (LinkWS) | | creationDate | number or nullSubscription creation date | | edition | object or null (LinkWS) | | endDate | number or nullSubscription end date | | externalAccountId | string or nullExternal account identifier (from vendor) | | id | string or nullID | | internalId | string or nullThe UUID for a subscription | | externalId | string or nullExternal ID for a subscription. Not used to change or create a subscription. If a subscription has an external ID, the ID is included in the responses to the [list subscription](#list-subscriptions) or [read subscription](#retrieve-a-subscription) APIs. To set an external ID of a subscription, use the [Update subscriptions](#update-subscriptions) API. | | label | string or nullLabel for a subscription | | maxUsers | number or nullMaximum number of users allowed to be assigned to subscription | | order | object or null (OrderWS)Resource links | | product | object or null (LinkWS) | | redirectUrl | string or nullInteractive endpoint URL | | status | string or nullSubscription status (Valid values are INITIALIZED, FAILED, FREE\_TRIAL, FREE\_TRIAL\_EXPIRED, ACTIVE, SUSPENDED, or CANCELLED.) | | upcomingOrder | object or null (OrderWS)Resource links | | user | object or null (LinkWS) | ### Responses **201** Created **400** Bad Request **404** Not Found post/billing/v1/companies/{companyId}/users/{userId}/subscriptions/preview https\://marketplace.appdirect.com/api/billing/v1/companies/{companyId}/users/{userId}/subscriptions/preview https\://virtserver.swaggerhub.com/billing/v1/companies/{companyId}/users/{userId}/subscriptions/preview ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 201 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Other_readSubscriptionPurchaseOrders_GET)List all purchase orders for a subscription List all the purchase orders for the given subscription ##### path Parameters | | | | ---------------------- | ---------------------- | | subscriptionIdrequired | stringSubscription ID. | ##### query Parameters | | | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | startDateFrom | stringFilters results to only include subscriptions where billing starts on or after the specified date (format: Mon March 01 00:00:00 EDT 2015) | | startDateTo | stringFilters results to only include subscriptions where billing starts on or before the specified date (format: Mon March 01 00:00:00 EDT 2015) | | status | stringEnum: "INITIALIZED" "PENDING\_USER\_APPROVAL" "PENDING\_REMOTE\_CREATION" "PENDING\_MANUAL\_RECOVERY" "PENDING\_ASYNCHRONOUS\_CREATION" "FREE\_TRIAL" "ACTIVE" "FINISHED" "ONE\_TIME" "CANCELLED" "SUSPENDED" "FREE\_TRIAL\_EXPIRED" "FREE\_TRIAL\_CANCELLED" "DELETED" "FAILED" "UPCOMING" "PENDING\_MIGRATION\_ACTIVATION" "PENDING\_DELAYED\_PROVISIONING"Filters subscriptions by order status | | currency | stringEnum: "USD" "CAD" "EUR" "JPY" "GBP" "KRW" "CHF" "SEK" "SGD" "MYR" "AUD" "MXN" "INR" "BRL" "DKK" "NZD" "NOK" "ZAR" "PHP" "CNY" "SAR" "GTQ" "IDR" "ARS" "COP" "PEN"Filters subscriptions by currency | | type | stringEnum: "NEW" "MIGRATION" "ADOPTION" "FREE\_TRIAL\_ACTIVATION" "TERMINATION\_FEE" "END\_OF\_CONTRACT\_MIGRATION" "REFUND" "CREDIT" "ONE\_TIME\_FEE" "ADDITIONAL\_FEE" "END\_OF\_DISCOUNT\_MIGRATION" "METERED\_USAGE"Filters subscriptions by order type.
NEW: The first order of a subscription. The order contains flat fees (one time or recurring) for this subscription. It is active until the subscription is updated or canceled.
MIGRATION: The order created after a subscription change. The order includes flat fees for both one-time and recurring editions.
ADOPTION: The order created by an administrator who has taken ownership of an application from another user within the same company.
FREE\_TRIAL\_ACTIVATION: Created when a free trial is manually upgraded to a paid subscription. Any subscription that is updated from free trial to paid automatically keeps its NEW status purchase order.
TERMINATION\_FEE: A subscription is canceled that had a termination fee. This purchase order represents the fees incurred as a result of the cancellation.
END\_OF\_CONTRACT\_MIGRATION: Created when a subscription update takes place as a result of a contract extension. If the contract autorenewal is set to either continue without a contract or renew the contract with the same pricing plan, then no migration occurs and the original purchase order is updated to include the new end date for the contract.
REFUND: Created when a refund is performed. The refund purchase order is created for only on-platform refunds. Off-platform refunds do not generate this type of purchase order.
CREDIT: Created during subscription update events. Any subscription update calculates a paid period and a credit period. The credit is then provided to the user to prorate the subscription.
ONE\_TIME\_FEE: Created if an edition includes one-time setup fees.
ADDITIONAL\_FEE: Used for off-order charges. A developer change creates an off-order charge and charges their customer a custom amount outside of the normal subscription cycle.
END\_OF\_DISCOUNT\_MIGRATION: Created after a discount of limited duration expires. This purchase order is created to represent the updated costs without the discount.
METERED\_USAGE: A purchase order created to accumulate usage fees during a billing period. The order is only valid for the billing period but it is updated with usage lines over the course of the billing period. A metered purchase order is invoiced in arrears at the end of the billing cycle. | | frequency | stringEnum: "ONE\_TIME" "MONTHLY" "QUARTERLY" "SIX\_MONTHS" "YEARLY" "TWO\_YEARS" "THREE\_YEARS" "DAILY"Filters subscriptions by pricing frequency | | orderReferenceCode | stringFilters subscriptions by order reference code | | applicationIds | numberFilters subscriptions by internal application ID | | fromCreationDate | numberFilters results to only include subscriptions that were created on or after the specified date | | toCreationDate | numberFilters results to only include subscriptions that were created on or before the specified date | | count | integerDefault:250Number of results to fetch. Used for paging. | | sortField | stringDefault:"DATE"Enum: "DATE" "ORDER\_ID" "TOTAL"Sort field. | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order. | | start | integerDefault:0First result index. Used for paging. | ### Responses **200** OK get/billing/v1/subscriptions/{subscriptionId}/orders https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId}/orders https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId}/orders ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/subscriptions/%7BsubscriptionId%7D/orders?startDateFrom=SOME_STRING_VALUE&startDateTo=SOME_STRING_VALUE&status=SOME_STRING_VALUE¤cy=SOME_STRING_VALUE&type=SOME_STRING_VALUE&frequency=SOME_STRING_VALUE&orderReferenceCode=SOME_STRING_VALUE&applicationIds=SOME_NUMBER_VALUE&fromCreationDate=SOME_NUMBER_VALUE&toCreationDate=SOME_NUMBER_VALUE&count=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_changeAddonInstance_PUT)Update an add-on instance Update the given add-on instance on the given subscription using the provided data ##### path Parameters | | | | ------------------------- | --------------------- | | addonInstanceUuidrequired | string | | subscriptionIdrequired | stringSubscription ID | ##### Request Body schema:application/xmlapplication/xml Add-on instance object | | | | ------------ | ------------------------------------------------------------------------ | | creationDate | number or nullCreation date of the addon instance | | offeringUuid | string or nullUnique identifier for add-on offering | | order | object or null (OrderWS)Resource links | | status | string or nullAddon instance status. May be ACTIVE, CANCELLED or FAILED. | | units | number or nullUnits for add-on instance | | uuid | string or nullUnique identifier for add-on instance | ### Responses **200** OK **404** Not Found put/billing/v1/subscriptions/{subscriptionId}/addons/{addonInstanceUuid} https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId}/addons/{addonInstanceUuid} https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId}/addons/{addonInstanceUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_cancelAddonInstance_DELETE)Delete an add-on instance Delete the given add-on instance on the given subscription ##### path Parameters | | | | ------------------------- | --------------------- | | addonInstanceUuidrequired | string | | subscriptionIdrequired | stringSubscription ID | ### Responses **204** No Content **404** Not Found delete/billing/v1/subscriptions/{subscriptionId}/addons/{addonInstanceUuid} https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId}/addons/{addonInstanceUuid} https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId}/addons/{addonInstanceUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/billing/v1/subscriptions/%7BsubscriptionId%7D/addons/%7BaddonInstanceUuid%7D ``` ## [](#tag/Subscriptions/operation/resource_Subscription_readSubscriptions_GET)List all subscriptions The list may be filtered using the optional filter parameters ##### query Parameters | | | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | fromDate | stringFilters results to only include subscriptions that were created on or after the specified date in yyyy/MM/DD HH:mm:ss format | | toDate | stringFilters results to only include subscriptions that were created on or before the specified date in yyyy/MM/DD HH:mm:ss format | | discountId | numberFilters subscriptions by internal discount ID | | status | stringFilters subscriptions by order status | | editionId | numberFilters subscriptions by internal edition ID | | paymentPlanId | numberFilters subscriptions by internal payment plan ID | | lastModified | numberFilters results to only include subscriptions that were modified on or after the specified date in UNIX Epoch milliseconds | | applicationIds | numberFilters subscriptions by internal Application ID | | bundleApplicationId | numberFilters subscriptions by internal bundle ID | | expand | stringExpands filtered subscription results to include details about the specified query parameters, one or more of "order", "product", or "edition". | | orderReferenceCode | stringFilters subscriptions by order reference code | | count | integerDefault:250Number of results to fetch. Used for paging. | | sortField | stringDefault:"DATE"Enum: "APPLICATION" "COMPANY" "DATE" "OWNER" "STATUS" "SUBSCRIPTION\_ID"Sort field | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order | | start | integerDefault:0First result index. Used for paging. | ### Responses **200** OK **404** Not Found get/billing/v1/subscriptions https\://marketplace.appdirect.com/api/billing/v1/subscriptions https\://virtserver.swaggerhub.com/billing/v1/subscriptions ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/subscriptions?fromDate=SOME_STRING_VALUE&toDate=SOME_STRING_VALUE&discountId=SOME_NUMBER_VALUE&status=SOME_STRING_VALUE&editionId=SOME_NUMBER_VALUE&paymentPlanId=SOME_NUMBER_VALUE&lastModified=SOME_NUMBER_VALUE&applicationIds=SOME_NUMBER_VALUE&bundleApplicationId=SOME_NUMBER_VALUE&expand=SOME_STRING_VALUE&orderReferenceCode=SOME_STRING_VALUE&count=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_readSubscriptionPayments_GET)List all payments for a subscription List all the payments for the given subscription ##### path Parameters | | | | ---------------------- | --------------------- | | subscriptionIdrequired | stringSubscription ID | ##### query Parameters | | | | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | count | integerDefault:250Number of results to fetch. Used for paging. | | fromDate | numberFrom date | | method | stringEnum: "ADP\_INVOICE" "ARIBAPAY" "BT\_BILL" "CLICKANDBUY" "CLOUDFOUNDRY" "CREDIT\_CARD" "CUMULA\_BILL" "DTAG" "EXTERNAL\_INVOICE" "KREDITKARTE" "LASTSCHRIFT\_MRNEXNET" "MANO\_TEO\_BILL" "MANUAL" "MARKETPLACE\_CREDITS" "NETS\_ARVATO\_INVOICE" "NEXTEL" "PAYPAL" "ROGERS\_CC\_DTMF" "ROGERS\_CC\_POS" "SNAP" "TBILL" "THISTLE" "TOICLEARING"Payment method | | result | stringEnum: "FAILED" "GATEWAY\_NOT\_AVAILABLE" "MANUAL" "SUCCESSFUL"Payment result | | sortField | stringDefault:"PAYMENT\_ID"Enum: "AMOUNT" "DATE" "PAYMENT\_ID"Sort field | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order | | start | integerDefault:0First result index. Used for paging. | | toDate | numberTo date | ### Responses **200** OK **404** Not Found get/billing/v1/subscriptions/{subscriptionId}/payments https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId}/payments https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId}/payments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/subscriptions/%7BsubscriptionId%7D/payments?count=SOME_INTEGER_VALUE&fromDate=SOME_NUMBER_VALUE&method=SOME_STRING_VALUE&result=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_readSubscription_GET)Retrieve a subscription Retrieve the subscription for the given subscription ID ##### path Parameters | | | | ---------------------- | ------------------------------------------------ | | subscriptionIdrequired | stringThe unique identifier for the subscription | ### Responses **200** OK **404** Not Found get/billing/v1/subscriptions/{subscriptionId} https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId} https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/billing/v1/subscriptions/%7BsubscriptionId%7D ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_cancelSubscription_DELETE)Request cancellation Requests cancellation of the given subscription ##### path Parameters | | | | ---------------------- | --------------------- | | subscriptionIdrequired | stringSubscription ID | ##### query Parameters | | | | ---------------- | ------------------------------------------------------------------- | | sendNotification | booleanDefault:trueSends email notification if true | ### Responses **202** Subscription cancellation was requested successfully **204** Subscription cancellation was requested and executed successfully **404** Not Found delete/billing/v1/subscriptions/{subscriptionId} https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId} https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url 'https://marketplace.appdirect.com/api/billing/v1/subscriptions/%7BsubscriptionId%7D?sendNotification=SOME_BOOLEAN_VALUE' ``` ## [](#tag/Subscriptions/operation/resource_Other_updateSubscription_PATCH)Update subscriptions Use this request to manage subscription lifecycles (suspend and activate subscriptions), update external IDs, and add or change subscription custom attribute values. ##### path Parameters | | | | ---------------------- | --------------------- | | subscriptionIdrequired | stringSubscription ID | ##### Request Body schema:application/xmlapplication/xml Subscription data object | | | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | statusrequired | stringEnum: "ACTIVE" "SUSPENDED"The desired subscription lifecycle status. Set to SUSPENDED to suspend an active subscription, or ACTIVE to reactivate a suspended subscription. | | suspensionReasonMessage | stringReason for subscription suspension. Only used, and required, when setting the status to SUSPENDED. | | externalId | stringThe external ID to add or update in the subscription. Only set an external ID if required. | | customAttributes | Array of objects (SubscriptionCustomAttribute)An array of subscription custom attributes. If specified in a PATCH request, the values will be updated or added to the subscription. The custom attributes must already be defined in the marketplace (at Manage > Marketplace > Settings > Custom Attributes > Subscription Custom Attributes). | ### Responses **200** OK **400** Bad Request **404** Subscription not found **412** The subscription cannot be updated patch/billing/v1/subscriptions/{subscriptionId} https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId} https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_readAddonInstances_GET)Read addon instances for a subscription Read addon instances for a subscription ##### path Parameters | | | | ---------------------- | --------------------- | | subscriptionIdrequired | stringSubscription ID | ##### query Parameters | | | | --------- | ----------------------------------------------------------------------------------------------------------------- | | filter | stringSearch filter | | sortField | stringDefault:"DATE"Enum: "DATE" "STATUS" "UUID"Sort field (UUID, DATE or STATUS) | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order (ASC or DESC) | ### Responses **200** OK **404** Not Found get/billing/v1/subscriptions/{subscriptionId}/addons https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId}/addons https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId}/addons ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/subscriptions/%7BsubscriptionId%7D/addons?filter=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_createAddonInstance_POST)Create an add-on instance Create an add-on instance on the given subscription using the given data ##### path Parameters | | | | ---------------------- | --------------------- | | subscriptionIdrequired | stringSubscription ID | ##### Request Body schema:application/xmlapplication/xml Add-on instance object | | | | ------------ | ------------------------------------------------------------------------ | | creationDate | number or nullCreation date of the addon instance | | offeringUuid | string or nullUnique identifier for add-on offering | | order | object or null (OrderWS)Resource links | | status | string or nullAddon instance status. May be ACTIVE, CANCELLED or FAILED. | | units | number or nullUnits for add-on instance | | uuid | string or nullUnique identifier for add-on instance | ### Responses **201** Created **400** Bad Request **404** Not Found **409** Conflict post/billing/v1/subscriptions/{subscriptionId}/addons https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId}/addons https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId}/addons ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 201 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_readSubscriptionInvoices_GET)List all invoices for a subscription List all of the invoices for the given subscription ##### path Parameters | | | | ---------------------- | --------------------- | | subscriptionIdrequired | stringSubscription ID | ##### query Parameters | | | | ----------- | ------------------------------------------------------------------------------------------------------- | | count | integerDefault:250Number of results to fetch. Used for paging. | | excludeFree | booleanExclude invoices with no charges (free) | | fromDate | numberFrom date | | sortField | stringDefault:"INVOICE\_ID"Enum: "DATE" "INVOICE\_ID" "TOTAL"Sort field | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Sort order | | start | integerDefault:0First result index. Used for paging. | | status | stringEnum: "CARRIED" "PAID" "UNPAID" "VOIDED"Invoice status | | toDate | numberTo date | ### Responses **200** OK **404** Not Found get/billing/v1/subscriptions/{subscriptionId}/invoices https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId}/invoices https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId}/invoices ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/billing/v1/subscriptions/%7BsubscriptionId%7D/invoices?count=SOME_INTEGER_VALUE&excludeFree=SOME_BOOLEAN_VALUE&fromDate=SOME_NUMBER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&start=SOME_INTEGER_VALUE&status=SOME_STRING_VALUE&toDate=SOME_NUMBER_VALUE' ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_previewCreateAddonInstance_POST)Preview creation of an addon instance for a subscription Preview creation of an addon instance for a subscription ##### path Parameters | | | | ---------------------- | --------------------- | | subscriptionIdrequired | stringSubscription ID | ##### Request Body schema:application/xmlapplication/xml Payload of addon instance to create | | | | ------------ | ------------------------------------------------------------------------ | | creationDate | number or nullCreation date of the addon instance | | offeringUuid | string or nullUnique identifier for add-on offering | | order | object or null (OrderWS)Resource links | | status | string or nullAddon instance status. May be ACTIVE, CANCELLED or FAILED. | | units | number or nullUnits for add-on instance | | uuid | string or nullUnique identifier for add-on instance | ### Responses **200** OK **400** Bad Request **404** Subscription Not Found post/billing/v1/subscriptions/{subscriptionId}/addons/preview https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId}/addons/preview https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId}/addons/preview ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_previewChangeAddonInstance_PUT)Preview change of an addon instance for a subscription Preview change of an addon instance for a subscription ##### path Parameters | | | | ------------------------- | --------------------- | | addonInstanceUuidrequired | string | | subscriptionIdrequired | stringSubscription ID | ##### Request Body schema:application/xmlapplication/xml Payload of addon instance to create | | | | ------------ | ------------------------------------------------------------------------ | | creationDate | number or nullCreation date of the addon instance | | offeringUuid | string or nullUnique identifier for add-on offering | | order | object or null (OrderWS)Resource links | | status | string or nullAddon instance status. May be ACTIVE, CANCELLED or FAILED. | | units | number or nullUnits for add-on instance | | uuid | string or nullUnique identifier for add-on instance | ### Responses **200** OK **400** Bad Request **404** Subscription Not Found put/billing/v1/subscriptions/{subscriptionId}/addons/{addonInstanceUuid}/preview https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId}/addons/{addonInstanceUuid}/preview https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId}/addons/{addonInstanceUuid}/preview ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/xmlapplication/xml No sample ### Response samples * 200 Content type application/xmlapplication/xml No sample ## [](#tag/Subscriptions/operation/resource_Subscription_previewCancelSubscription_GET)Preview subscription cancellation Preview a subscription cancellation for the given subscription ID ##### path Parameters | | | | ---------------------- | ------------------------- | | subscriptionIdrequired | stringThe subscription ID | ### Responses **200** OK **404** Not Found get/billing/v1/subscriptions/{subscriptionId}/previewCancel https\://marketplace.appdirect.com/api/billing/v1/subscriptions/{subscriptionId}/previewCancel https\://virtserver.swaggerhub.com/billing/v1/subscriptions/{subscriptionId}/previewCancel ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/billing/v1/subscriptions/%7BsubscriptionId%7D/previewCancel ``` ### Response samples * 200 Content type application/xmlapplication/xml No sample # [](#tag/AppResellerSubscription)Subscriptions (Reseller) ## [](#tag/AppResellerSubscription/operation/resource_AppResellerBillingV1SubscriptionApi_POST)Create subscription Note: This endpoint is being deprecated. // Create a new subscription on behalf of a user who is a member of a marketplace company linked to the current reseller company ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company ##### Request Body schema: application/jsonrequired Information about the new subscription that will be created | | | | ----------------------- | ----------------------------------------------------------------------------------------- | | targetCompanyIdrequired | string(Required) ID of the company in which the Reseller will create the new subscription | | targetUserIdrequired | string(Required) ID of the user for whom the Reseller will create the new subscription | | paymentPlanIdrequired | string(Required) Edition Payment Plan ID | | parentSubscriptionId | string or nullID of an add-on product's parent subscription | | orderLinesrequired | stringUnit type and quantity | ### Responses **200** Success **401** Unauthorized **409** Subscription already created post/appReseller/v1/subscriptions https\://marketplace.appdirect.com/api/appReseller/v1/subscriptions https\://virtserver.swaggerhub.com/appReseller/v1/subscriptions ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "targetCompanyId": "698555fc-bc65-4163-9fee-16308edec41b", "targetUserId": "2c061df6-4313-45e0-8709-a0ca19b0aaa3", "parentSubscriptionId": "386626c0-53e2-4515-8450-4a720bb5d029", "paymentPlanId": "30ccf1e7-1937-40cb-8e73-851a226fd4ea", "orderLines": [ { "unit": "USER", "quantity": "1" } ] }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "386626c0-53e2-4515-8450-4a720bb5d029", "activeOrder": { "id": "1553", "paymentPlanId": "30ccf1e7-1937-40cb-8e73-851a226fd4ea", "status": "PENDING MANUAL RECOVERY", "frequency": "One Time", "totalFee": "USD350.00", "editionName": "Edition", "orderLines": [ { "unit": "USER", "quantity": "1" } ], "createdOn": 1529083173000 }, "company": { "id": "698555fc-bc65-4163-9fee-16308edec41b", "name": "Company A" }, "user": { "id": "2c061df6-4313-45e0-8709-a0ca19b0aaa3", "firstName": "Michael", "lastName": "Jordan" }, "applicationName": "AUTO_DISCOUNTS_APP", "pendingEvent": "SUBSCRIPTION_CHANGE", "status": "ACTIVE", "createdOn": 1529083173000, "referenceCode": "bundle09" }` ## [](#tag/AppResellerSubscription/operation/resource_AppResellerBillingV1SubscriptionApi_GET)List subscriptions Note: This endpoint is being deprecated. // Retrieves a list of all user subscriptions of a linked company. You can filter the list using optional query parameters. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company * `ROLE_RESELLER_MANAGER` - Allows access as a Reseller Manager for the company ##### query Parameters | | | | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | contextrequired | stringValue: "RESELLER, RESELLER\_MANAGER"Supported billing contexts | | number | integerPage number | | size | integerNumber of results per page | | sort | stringSort field and order. For ascending sort order, use the '+\[FieldName]' format. For descending order, use the '-\[FieldName]' format. | | userId | stringFor RESELLER, the customer's user ID; for RESELLER\_MANAGER, the Reseller's user ID | | resellerCompanyIdrequired | stringReseller's company ID | | customerCompanyIdrequired | stringUser's company ID. Required only for RESELLER context | | createdOn | stringDate filter, defined by upper or lower inclusive or exclusive limits, in Unix timestamp format. Acceptable values are: gte(\[timestamp]) - 'greater than or equal to'; gt(\[timestamp]) - 'greater than'; lte(\[timestamp]) - 'less than or equal to'; or lt(\[timestamp]) - 'less than.' | | status | stringEnum: "INITIALIZED" "FAILED" "FREE\_TRIAL" "FREE\_TRIAL\_EXPIRED" "ACTIVE" "SUSPENDED" "CANCELLED"Subscription status. Acceptable values are: \[status] - 'equal to'; or in(\[status1],\[status2]) - 'status in the list'. For example, status=FAILED or status=in(FAILED,ACTIVE) | | paidStatus | stringValue: "PAID, FREE"Status of the subscription related to the payment | | pending | booleanIndicates whether subscription has pending events | | searchText | stringSearch text | ### Responses **200** Success **401** Unauthorized get/appReseller/v1/subscriptions https\://marketplace.appdirect.com/api/appReseller/v1/subscriptions https\://virtserver.swaggerhub.com/appReseller/v1/subscriptions ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/appReseller/v1/subscriptions?context=SOME_STRING_VALUE&number=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sort=SOME_STRING_VALUE&userId=SOME_STRING_VALUE&resellerCompanyId=SOME_STRING_VALUE&customerCompanyId=SOME_STRING_VALUE&createdOn=SOME_STRING_VALUE&status=SOME_STRING_VALUE&paidStatus=SOME_STRING_VALUE&pending=SOME_BOOLEAN_VALUE&searchText=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "content": [ { "id": "386626c0-53e2-4515-8450-4a720bb5d029", "activeOrder": { "id": "1553", "status": "PENDING MANUAL RECOVERY", "frequency": "One Time", "totalFee": "USD350.00", "editionName": "Edition", "createdOn": 1529083173000 }, "company": { "id": "698555fc-bc65-4163-9fee-16308edec41b", "name": "Company A" }, "user": { "id": "386626c0-53e2-4515-8450-4a720bb5d029", "firstName": "Michael", "lastName": "Jordan" }, "applicationName": "AUTO_DISCOUNTS_APP", "pendingEvent": "SUBSCRIPTION_CHANGE", "status": "ACTIVE" }, { "id": "38e8bb4a-d737-4564-afee-e68edb00fd38", "activeOrder": { "id": "3345", "status": "PENDING MANUAL RECOVERY", "frequency": "One Time", "totalFee": "USD350.00", "editionName": "Recurring Edition", "createdOn": 1529083173000 }, "company": { "id": "386626c0-53e2-4515-8450-4a720bb5d029", "name": "Company B" }, "user": { "id": "386626c0-53e2-4515-8450-4a720bb5d029", "firstName": "Michael", "lastName": "Jordan" }, "applicationName": "AUTO_DISCOUNTS_APP", "pendingEvent": "SUBSCRIPTION_CHANGE", "status": "ACTIVE" } ], "page": { "size": 10, "totalElements": 2, "totalPages": 1, "number": 1 } }` ## [](#tag/AppResellerSubscription/operation/resource_AppResellerBillingV1SubscriptionApi_GET_ONE)Subscription details Note: This endpoint is being deprecated. // Read a subscription by ID ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller ##### path Parameters | | | | ---------------------- | --------------------- | | subscriptionIdrequired | stringSubscription ID | ### Responses **200** Success **401** Unauthorized **404** Not found get/appReseller/v1/subscriptions/{subscriptionId} https\://marketplace.appdirect.com/api/appReseller/v1/subscriptions/{subscriptionId} https\://virtserver.swaggerhub.com/appReseller/v1/subscriptions/{subscriptionId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/appReseller/v1/subscriptions/%7BsubscriptionId%7D ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "386626c0-53e2-4515-8450-4a720bb5d029", "activeOrder": { "id": "1553", "createdOn": 1529083173000, "paymentPlanId": "30ccf1e7-1937-40cb-8e73-851a226fd4ea", "status": "PENDING MANUAL RECOVERY", "frequency": "One Time", "totalFee": "USD350.00", "editionName": "Edition", "orderLines": [ { "unit": "USER", "quantity": "1" } ] }, "company": { "id": "698555fc-bc65-4163-9fee-16308edec41b", "name": "Company A" }, "user": { "id": "2c061df6-4313-45e0-8709-a0ca19b0aaa3", "firstName": "Michael", "lastName": "Jordan" }, "applicationName": "AUTO_DISCOUNTS_APP", "pendingEvent": "SUBSCRIPTION_CHANGE", "status": "ACTIVE", "createdOn": 1529083173000, "referenceCode": "bundle09" }` ## [](#tag/AppResellerSubscription/operation/resource_AppResellerBillingV1SubscriptionApi_PUT)Update subscription Note: This endpoint is being deprecated. // Upgrade or downgrade a subscription on behalf of a user who is a member of a marketplace company linked to the current reseller company.
When you upgrade or downgrade subscriptions, you must provide both the paymentPlanId and the orderLines objects in the request even if the units are not changing. ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company ##### path Parameters | | | | ---------------------- | --------------------- | | subscriptionIdrequired | stringSubscription ID | ##### Request Body schema: application/jsonrequired Information about the new values to set to the subscription | | | | ------------- | --------------------------------------------------------------------------- | | paymentPlanId | stringEdition Payment Plan ID | | orderLines | Array of objects (OrderLineDetailsWS)Unit type and quantity | ### Responses **200** Success **401** Unauthorized **404** Not found **409** Subscription has a pending event and can't be updated put/appReseller/v1/subscriptions/{subscriptionId} https\://marketplace.appdirect.com/api/appReseller/v1/subscriptions/{subscriptionId} https\://virtserver.swaggerhub.com/appReseller/v1/subscriptions/{subscriptionId} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "paymentPlanId": "30ccf1e7-1937-40cb-8e73-851a226fd4ea", "orderLines": [ { "unit": "USER", "quantity": "15" } ] }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "id": "386626c0-53e2-4515-8450-4a720bb5d029", "activeOrder": { "id": "1553", "paymentPlanId": "30ccf1e7-1937-40cb-8e73-851a226fd4ea", "status": "PENDING MANUAL RECOVERY", "frequency": "One Time", "totalFee": "USD350.00", "editionName": "Edition", "orderLines": [ { "unit": "USER", "quantity": "15" } ], "createdOn": 1529083173000 }, "company": { "id": "698555fc-bc65-4163-9fee-16308edec41b", "name": "Company A" }, "user": { "id": "2c061df6-4313-45e0-8709-a0ca19b0aaa3", "firstName": "Michael", "lastName": "Jordan" }, "applicationName": "AUTO_DISCOUNTS_APP", "pendingEvent": "SUBSCRIPTION_CHANGE", "status": "ACTIVE", "createdOn": 1529083173000, "referenceCode": "bundle09" }` ## [](#tag/AppResellerSubscription/operation/resource_AppResellerBillingV1SubscriptionApi_DELETE)Cancel subscription Note: This endpoint is being deprecated. // Cancel a subscription on behalf of a user who is a member of a company linked to the current reseller ##### Required Scopes and Authorization Rules * `ROLE_RESELLER` - Allows access as a Reseller for the company ##### path Parameters | | | | ---------------------- | --------------------- | | subscriptionIdrequired | stringSubscription ID | ### Responses **204** Subscription not found **409** Subscription has a pending event and can't be deleted delete/appReseller/v1/subscriptions/{subscriptionId} https\://marketplace.appdirect.com/api/appReseller/v1/subscriptions/{subscriptionId} https\://virtserver.swaggerhub.com/appReseller/v1/subscriptions/{subscriptionId} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/appReseller/v1/subscriptions/%7BsubscriptionId%7D ``` # [](#tag/Sync)Sync ## [](#tag/Sync/operation/resource_developerAccount_createDeveloperAccount_POST)Create developer account This call creates a developer account. Maximum of global requests of 20 per 2 seconds. ##### Required Scopes and Authorization Rules * `ROLE_APPLICATION` - User must provide consumer key and secret from the applications profile. ##### Request Body schema: application/json Used when type='DEVELOPER\_ACCOUNT' and operation='CREATE' | | | | ----------------- | ------------------------------------------------------------- | | typerequired | stringRequired. It must have the value 'DEVELOPER\_ACCOUNT' | | operationrequired | stringRequired. The operation. Options: 'CREATE' and 'EXPIRE' | | developerAccounts | Array of objects (DeveloperAccount) | ### Responses **202** Accepted **400** Bad Request **401** Unauthorized **403** Sync is disabled or Forbidden **429** Too many requests post/sync/v1/tasks#create https\://marketplace.appdirect.com/api/sync/v1/tasks#create https\://virtserver.swaggerhub.com/sync/v1/tasks#create ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "type": "DEVELOPER_ACCOUNT", "operation": "CREATE", "developerAccounts": [ { "developerIdentifier": "f0b5c422-0400-459f-879c-ac369d924bb9", "developerDeveloperIdentifier": "bcde7116-5d20-4628-83a6-59b032a7cd2e", "name": "ABC Company", "contactFirstName": "Alex", "contactLastName": "Ferguson", "addressLine": "50 Grove St.", "addressLine2": "address line 2", "addressLine3": "address line 3", "postalCode": "12340", "city": "Somerville", "state": "MA", "country": "postalCode", "phoneNumber": "415-555-5555", "email": "abcinc@abc.com", "primaryDomain": "abc.com", "additionalDomains": [ "abc1.com", "abc2.com" ], "customAttributes": { "customAtrribute1": "1234567890" } } ] }` ## [](#tag/Sync/operation/resource_developerAccount_expireDeveloperAccount_POST)Expire developer account This call expires a developer account. Maximum of global requests of 20 per 2 seconds. ##### Required Scopes and Authorization Rules * `ROLE_APPLICATION` - User must provide consumer key and secret from the applications profile. ##### Request Body schema: application/json Used when type='DEVELOPER\_ACCOUNT' and operation='EXPIRE' | | | | ----------------- | ------------------------------------------------------------- | | typerequired | stringRequired. It must have the value 'DEVELOPER\_ACCOUNT' | | operationrequired | stringRequired. The operation. Options: 'CREATE' and 'EXPIRE' | | developerAccounts | Array of objects (DeveloperAccount) | ### Responses **202** Accepted **400** Bad Request **401** Unauthorized **403** Sync is disabled or Forbidden **429** Too many requests post/sync/v1/tasks#expire https\://marketplace.appdirect.com/api/sync/v1/tasks#expire https\://virtserver.swaggerhub.com/sync/v1/tasks#expire ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "type": "DEVELOPER_ACCOUNT", "operation": "CREATE", "developerAccounts": [ { "developerIdentifier": "f0b5c422-0400-459f-879c-ac369d924bb9", "developerDeveloperIdentifier": "bcde7116-5d20-4628-83a6-59b032a7cd2e", "name": "ABC Company", "contactFirstName": "Alex", "contactLastName": "Ferguson", "addressLine": "50 Grove St.", "addressLine2": "address line 2", "addressLine3": "address line 3", "postalCode": "12340", "city": "Somerville", "state": "MA", "country": "postalCode", "phoneNumber": "415-555-5555", "email": "abcinc@abc.com", "primaryDomain": "abc.com", "additionalDomains": [ "abc1.com", "abc2.com" ], "customAttributes": { "customAtrribute1": "1234567890" } } ] }` ## [](#tag/Sync/operation/resource_user_assignUser_POST)Assign user This call assigns a user. Maximum of global requests of 20 per 2 seconds. ##### Required Scopes and Authorization Rules * `ROLE_APPLICATION` - User must provide consumer key and secret from the applications profile. ##### Request Body schema: application/json Used when type='ASSIGNMENT' and operation='ASSIGN' | | | | --------------------------- | ------------------------------------------------------------------------------------------------- | | typerequired | stringRequired. It must have the value 'ASSIGNMENT' | | operationrequired | stringRequired. The operation. Options: 'ASSIGN' and 'UNASSIGN' | | accountIdentifierrequired | stringRequired. The Account Identifier provided when the subscription was created | | developerIdentifierrequired | string<uuid>Required. The company UUID of the Developer's company | | userIdentifierrequired | stringRequired. The user identifier in the Developer's system | | userName | string | | firstName | string | | lastName | string | | email | string | ### Responses **202** Accepted **400** Bad Request **401** Unauthorized **403** Sync is disabled or Forbidden **429** Too many requests post/sync/v1/tasks#assign https\://marketplace.appdirect.com/api/sync/v1/tasks#assign https\://virtserver.swaggerhub.com/sync/v1/tasks#assign ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "type": "ASSIGNMENT", "operation": "ASSIGN", "accountIdentifier": "200ae1d9-c5b9-4c0b-843c-45d8e74d741a", "developerIdentifier": "f0b5c422-0400-459f-879c-ac369d924bb9", "userIdentifier": "45bbf36e-5902-4eb3-9072-87d267d302d4", "userName": "Test_UserName", "firstName": "Test_FirstName", "lastName": "Test_LastName", "email": "test_email@yopmail.com" }` ## [](#tag/Sync/operation/resource_user_unassignUser_POST)Unassign user This call unassigns a user. Maximum of global requests of 20 per 2 seconds. ##### Request Body schema: application/json Used when type='ASSIGNMENT' and operation='UNASSIGN' | | | | --------------------------- | ------------------------------------------------------------------------------------------------- | | typerequired | stringRequired. It must have the value 'ASSIGNMENT' | | operationrequired | stringRequired. The operation. Options: 'ASSIGN' and 'UNASSIGN' | | accountIdentifierrequired | stringRequired. The Account Identifier provided when the subscription was created | | developerIdentifierrequired | string<uuid>Required. The company UUID of the Developer's company | | userIdentifierrequired | stringRequired. The user identifier in the Developer's system | | userName | string | | firstName | string | | lastName | string | | email | string | ### Responses **202** Accepted **400** Bad Request **401** Unauthorized **403** Sync is disabled or Forbidden **429** Too many requests post/sync/v1/tasks#unassign https\://marketplace.appdirect.com/api/sync/v1/tasks#unassign https\://virtserver.swaggerhub.com/sync/v1/tasks#unassign ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "type": "ASSIGNMENT", "operation": "ASSIGN", "accountIdentifier": "200ae1d9-c5b9-4c0b-843c-45d8e74d741a", "developerIdentifier": "f0b5c422-0400-459f-879c-ac369d924bb9", "userIdentifier": "45bbf36e-5902-4eb3-9072-87d267d302d4", "userName": "Test_UserName", "firstName": "Test_FirstName", "lastName": "Test_LastName", "email": "test_email@yopmail.com" }` ## [](#tag/Sync/operation/userAssignment_GET)Get user assignment This call retrieves a user assignment. Maximum of global requests of 20 per 2 seconds. ##### Required Scopes and Authorization Rules * `ROLE_APPLICATION` - User must provide consumer key and secret from the applications profile. ##### query Parameters | | | | --------------------------- | ------ | | developerIdentifierrequired | string | | accountIdentifierrequired | string | | userIdentifierrequired | string | ### Responses **200** Ok **400** Bad Request **401** Unauthorized **403** Sync is disabled or Forbidden **404** User is not found or Subscription is not found for the Developer **429** Too many requests get/sync/v1/assignments https\://marketplace.appdirect.com/api/sync/v1/assignments https\://virtserver.swaggerhub.com/sync/v1/assignments ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/sync/v1/assignments?developerIdentifier=SOME_STRING_VALUE&accountIdentifier=SOME_STRING_VALUE&userIdentifier=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy `{ "userIdentifier": "45bbf36e-5902-4eb3-9072-87d267d302d4", "accountIdentifier": "200ae1d9-c5b9-4c0b-843c-45d8e74d741a", "userName": "Test_UserName", "firstName": "Test_FirstName", "lastName": "Test_LastName", "email": "test_email@yopmail.com", "assigned": true }` # [](#tag/UserAccounts)User Accounts ## [](#tag/UserAccounts/operation/provisioning)Create user connections Creates a new user connection for Search. A connection (accountName) associates the app (application UUID) and user information (userId, companyId, and handle). The connection is used to, for example, identify events related to the user's app account. accountName Format: {user\_handle}@{user\_uuid}@{company\_uuid} Note: Application UUID = Product UUID ##### Request Body schema: application/jsonrequired | | | | ------------ | ------------------------------------------------------------------------------------------------------------------- | | apprequired | object (ApplicationToConnect)Identify an application that can be connected to users for Search | | userrequired | object (UserToConnect)Identify a user so they can be connected, with an app user account, to Search | ### Responses **201** Success **400** Input is invalid or malformed **401** Request cannot be authenticated **403** Request is authenticated but does not have permission to access the resource(s) **404** The application and/or user were not found **409** Inputs are valid, but this user and handle are already connected to the service **502** Internal services are unavailable post/appwise/v2/accounts https\://marketplace.appdirect.com/api/appwise/v2/accounts https\://virtserver.swaggerhub.com/appwise/v2/accounts ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "app": { "id": "b2fc6737-3d3f-4da2-afda-f80f25b89af9" }, "user": { "userId": "a13a9998-e025-4751-8fee-72afdc0fe6d5", "companyId": "2cc88871-e942-4910-96e3-0521d7ae52f4", "handle": "bob" } }` ### Response samples * 201 * 400 * 401 * 403 * 404 * 409 * 502 Content type application/json Copy Expand all Collapse all `{ "connection": { "accountName": "bob@a1130ec9-3044-4cc6-b9a8-5a71fd2581a5@ce91a616-77f6-48b5-b6f3-d22bdeb362d9" } }` ## [](#tag/UserAccounts/operation/disconnecting)Disconnect user accounts Disconnects an existing user account from Search. To access this API, you must configure product-scoped OAuth2 authentication for the application. ##### query Parameters | | | | ------------------- | ----------------------------------------------------------------------------- | | appIdrequired | stringNote: Application UUID = Product UUID | | accountNamerequired | stringThe user application account connection (accountName) to disconnect | | callbackUrl | stringCallback URL to which to publish status updates about the disconnection | ### Responses **200** Success **400** Input is invalid or malformed **401** Request cannot be authenticated **403** Request is authenticated but does not have permission to access the resource(s) **502** Internal services are unavailable delete/appwise/v2/accounts https\://marketplace.appdirect.com/api/appwise/v2/accounts https\://virtserver.swaggerhub.com/appwise/v2/accounts ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url 'https://marketplace.appdirect.com/api/appwise/v2/accounts?appId=SOME_STRING_VALUE&accountName=SOME_STRING_VALUE&callbackUrl=SOME_STRING_VALUE' ``` ### Response samples * 200 * 400 * 401 * 403 * 502 Content type application/json Copy Expand all Collapse all `{ "app": { "id": "b2fc6737-3d3f-4da2-afda-f80f25b89af9" }, "connection": { "accountName": "bob@a13a9998-e025-4751-8fee-72afdc0fe6d5@2cc88871-e942-4910-96e3-0521d7ae52f4", "status": "PENDING" }, "user": { "companyId": "2cc88871-e942-4910-96e3-0521d7ae52f4", "userId": "a13a9998-e025-4751-8fee-72afdc0fe6d5" } }` # [](#tag/User)Users ## [](#tag/User/operation/resource_User_readAllUsers_GET)List all users Retrieves all marketplace users ##### Required Scopes and Authorization Rules * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. ##### query Parameters | | | | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | name | stringFirst or last name of user | | email | stringEmail address of user | | externalId | stringExternal ID of user | | username | stringUser name of user | | companyMembershipRole | stringIf specified, returns only users with the specified role, one of the following values: ROLE\_CHANNEL\_ADMIN (Marketplace Manager), ROLE\_CHANNEL\_PRODUCT\_SUPPORT (Product Support), ROLE\_SALES\_SUPPORT (Sales Support), ROLE\_RESELLER\_MANAGER (Reseller Manager), ROLE\_RESELLER (Reseller), ROLE\_CHANNEL\_SUPPORT (Customer Support), ROLE\_SYS\_ADMIN (Company Admin), ROLE\_BILLING\_ADMIN (Billing Admin), ROLE\_DEVELOPER (Developer) | | custom.customAttributeName | stringAccepts a notIn filter in the form of ?custom.customAttributeName=notIn(customAttributeValue1, customAttributeValue2, customAttributeValueN...) that excludes users with matching values. Before you can use the filter, you must first create "Text" type user custom attributes in the user interface. You can then specify the custom attribute name and values as customAttributeName and customAttributeValueN. See . | | lastModified | numberThe date on which the user was last modified, in UNIX Epoch milliseconds | | page | integerDefault:0Zero-based page index | | size | integerDefault:50Number of results per page to return | | sortField | stringDefault:"DATE"Enum: "DATE" "FIRST\_NAME" "LAST\_NAME"The property to sort by | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Ordering type | | includeCustomAttributes | booleanOptional. Default is true. When set to true, user custom attributes are included in the API response. When set to false, user custom attributes are not included. | ### Responses **200** Success **401** Unauthorized get/account/v2/users https\://marketplace.appdirect.com/api/account/v2/users https\://virtserver.swaggerhub.com/account/v2/users ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/users?name=SOME_STRING_VALUE&email=SOME_STRING_VALUE&externalId=SOME_STRING_VALUE&username=SOME_STRING_VALUE&companyMembershipRole=SOME_STRING_VALUE&custom.customAttributeName=SOME_STRING_VALUE&lastModified=SOME_NUMBER_VALUE&page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE&includeCustomAttributes=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_updateInactiveUser_PATCH)Activate a user Activate a marketplace user using its associated activation token. ##### Required Scopes and Authorization Rules * `ROLE_USER` - Allows access to an user who possesses an activation token. ##### path Parameters | | | | ----------------------- | ----------------------------------------------------------------------- | | activationTokenrequired | stringUser's activation token, typically received via invitation emails | ##### Request Body schema: application/json User activation information | | | | -------------- | ------------------------------------------------------------------- | | activated | booleanIs user activated | | email | stringUser email | | password | stringUser password | | termsOfService | booleanIndicates whether the user has accepted the terms of service | | privacyPolicy | booleanIndicates whether the user has agreed to the privacy policy | ### Responses **200** Success **401** Unauthorized **404** Token not found patch/account/v2/inactiveUsers/{activationToken} https\://marketplace.appdirect.com/api/account/v2/inactiveUsers/{activationToken} https\://virtserver.swaggerhub.com/account/v2/inactiveUsers/{activationToken} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "email": "alex.gonsalez@company2438285395.com", "password": "some-password", "activated": true, "termsOfService": true, "privacyPolicy": true }` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_readUser_GET)Read a user Retrieves a marketplace user by ID or external ID. If you use the ID, you can omit a prefix or use 'id:' as the prefix. If you use the external ID, you must always specify the 'externalId:' prefix. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_USER` - Allows access to read any company user. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. ##### path Parameters | | | | ---------------- | ------------------------------------------------------- | | userUuidrequired | stringUnique identifier (ID or external ID) of the user | ##### query Parameters | | | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | includeCustomAttributes | booleanOptional. Default is true. When set to true, user custom attributes are included in the API response. When set to false, user custom attributes are not included. | ### Responses **200** Success **401** Unauthorized **404** User not found get/account/v2/users/{userUuid} https\://marketplace.appdirect.com/api/account/v2/users/{userUuid} https\://virtserver.swaggerhub.com/account/v2/users/{userUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/users/%7BuserUuid%7D?includeCustomAttributes=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_updateUser_PUT)Update a user Updates a marketplace user ##### Required Scopes and Authorization Rules * `ROLE_PARTNER` - Allows access to read and write all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. ##### path Parameters | | | | ---------------- | ---------------------------------------------------------------------- | | userUuidrequired | stringUnique identifier of the user assigned by the AppDirect platform | ##### Request Body schema: application/jsonrequired Specified updates to user information | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | boostUser | object or null (BoostUser) | | externalId | stringExternal identifier of user | | firstName | string or nullFirst name of user | | lastName | string or nullLast name of user | | ldapId | string or nullLDAP identifier of user | | idpUuid | string or nullThe external identity provider's ID for the user | | locale | stringUser locale in the standard ISO 639-1 language code + ISO 3166-1 country code format. For example: 'en\_US' | | currency | stringCurrency | | roles | Array of stringsAll users have ROLE\_USER (end-user access). To assign the Network Manager, role use ROLE\_CORPORATE\_ADMIN. For company membership roles, see [UserCompanyMembershipAccountV2](#usercompanymembershipaccountv2). | ### Responses **200** Success **400** Bad request **401** Unauthorized **404** User not found put/account/v2/users/{userUuid} https\://marketplace.appdirect.com/api/account/v2/users/{userUuid} https\://virtserver.swaggerhub.com/account/v2/users/{userUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "firstName": "Jane", "lastName": "Lee", "currency": "USD", "externalId": "b34974b2-f5d6-4326-9859-5247dc42ee60", "locale": "en_US", "ldapId": "1", "boostUser": { "apsUid": "murnu8w" }, "roles": [ "ROLE_CORPORATE_ADMIN" ] }` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_updateUser_PATCH)Patch a user Update ('patch') one or more fields in the user details. This only adds or updates the values for the properties that you include in the call; all other properties, and data already saved for them, are ignored ##### Required Scopes and Authorization Rules * `ROLE_PARTNER` - Allows access to read and write all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_USER` - Allows access as a User for the marketplace.This permission allows a user to modify the following fields for their own user account: firstName, lastName, locale, and currency * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. ##### path Parameters | | | | ---------------- | ---------------------------------------------------------------------- | | userUuidrequired | stringUnique identifier of the user assigned by the AppDirect platform | ##### Request Body schema: application/jsonrequired Specified updates to user information | | | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | boostUser | object or null (BoostUser) | | externalId | stringExternal identifier of user | | firstName | string or nullFirst name of user | | lastName | string or nullLast name of user | | username | string or nullUser name. If not provided, use the user's email address | | ldapId | string or nullLDAP identifier of user | | idpUuid | string or nullThe external identity provider's ID for the user | | locale | stringUser locale in the standard ISO 639-1 language code + ISO 3166-1 country code format. For example: 'en\_US' | | currency | stringCurrency | | roles | Array of stringsAll users have ROLE\_USER (end-user access). To assign the Network Manager, role use ROLE\_CORPORATE\_ADMIN. For company membership roles, see [UserCompanyMembershipAccountV2](#usercompanymembershipaccountv2). | ### Responses **200** Success **400** Bad request **401** Unauthorized **404** User not found patch/account/v2/users/{userUuid} https\://marketplace.appdirect.com/api/account/v2/users/{userUuid} https\://virtserver.swaggerhub.com/account/v2/users/{userUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "firstName": "Jane", "lastName": "Lee", "currency": "USD", "externalId": "b34974b2-f5d6-4326-9859-5247dc42ee60", "locale": "en_US", "ldapId": "1", "boostUser": { "apsUid": "murnu8w" }, "roles": [ "ROLE_CORPORATE_ADMIN" ], "idpUuid": "c412543-1233-6547-9809-0647dc42ee51" }` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_readResellerUser_GET)Read reseller user company associations Reads a reseller user's company associations ##### Required Scopes and Authorization Rules * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_USER` - Allows access to read any company user. ##### path Parameters | | | | ---------------- | ----------------------------------- | | userUuidrequired | stringUnique identifier of the user | ##### query Parameters | | | | --------- | ---------------------------------------------------------------------------------------- | | page | integerDefault:0Zero-based page index | | size | integerDefault:50Number of results per page to return | | sortField | stringDefault:"DATE"Value: "DATE"The property to sort by | | sortOrder | stringDefault:"ASC"Enum: "ASC" "DESC"Ordering type | ### Responses **200** Success **401** Unauthorized **404** User not found get/account/v2/users/{userUuid}/rssrCompanyAssociations https\://marketplace.appdirect.com/api/account/v2/users/{userUuid}/rssrCompanyAssociations https\://virtserver.swaggerhub.com/account/v2/users/{userUuid}/rssrCompanyAssociations ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/users/%7BuserUuid%7D/rssrCompanyAssociations?page=SOME_INTEGER_VALUE&size=SOME_INTEGER_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE' ``` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_readUserMemberships_GET)Read user memberships Retrieve a user's company memberships. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_USER` - Allows access to retrieve own membership. ##### path Parameters | | | | ---------------- | -------------------------------------------------- | | userUuidrequired | stringUnique identifier of user in the API request | ##### query Parameters | | | | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | status | stringStatus of membership to be requested | | includeUserCustomAttributes | booleanOptional. Default is true. When set to true, user custom attributes will be included in the API response. When set to false, user custom attributes will not be included. | | includeCompanyCustomAttributes | booleanOptional. Default is true. When set to true, company custom attributes will be included in the API response. When set to false, company custom attributes will not be included. | ### Responses **200** Success **401** Unauthorized **404** User not found get/account/v2/users/{userUuid}/memberships https\://marketplace.appdirect.com/api/account/v2/users/{userUuid}/memberships https\://virtserver.swaggerhub.com/account/v2/users/{userUuid}/memberships ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/account/v2/users/%7BuserUuid%7D/memberships?status=SOME_STRING_VALUE&includeUserCustomAttributes=SOME_BOOLEAN_VALUE&includeCompanyCustomAttributes=SOME_BOOLEAN_VALUE' ``` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_updateCurrentCompany_PUT)Update last used company membership Update a marketplace user's last used company. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER` - Allows access to read and write all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_USER` - Allows updating company as company member. ##### path Parameters | | | | ------------------- | ------------------------------------------------------ | | companyUuidrequired | stringUnique identifier of company to set as last used | | userUuidrequired | stringUnique identifier of user in the API request | ### Responses **204** Success, no content **401** Unauthorized **404** User/Company not found put/account/v2/users/{userUuid}/memberships/{companyUuid}/current https\://marketplace.appdirect.com/api/account/v2/users/{userUuid}/memberships/{companyUuid}/current https\://virtserver.swaggerhub.com/account/v2/users/{userUuid}/memberships/{companyUuid}/current ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request PUT \ --url https://marketplace.appdirect.com/api/account/v2/users/%7BuserUuid%7D/memberships/%7BcompanyUuid%7D/current ``` ### Response samples * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_updateUserPicture_PUT)Update user picture Update a marketplace user’s profile picture. This method expects a Content-Type request header with a value of “multipart/form-data”. The updated user resource is returned. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER` - Allows access to read and write all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_USER` - Allows access to retrieve self or other company users. ##### path Parameters | | | | ---------------- | -------------------------------------------------- | | userUuidrequired | stringUnique identifier of user in the API request | ##### Request Body schema: application/json Image file that will be used as the profile picture. object ### Responses **200** Success **401** Unauthorized **404** User not found put/account/v2/users/{userUuid}/picture https\://marketplace.appdirect.com/api/account/v2/users/{userUuid}/picture https\://virtserver.swaggerhub.com/account/v2/users/{userUuid}/picture ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ }` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_readUserProfile_GET)Read user profile Retrieve profile information for a marketplace user. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER_READ` - Allows access to read all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_CHANNEL_SUPPORT` - Allows access as a Customer Support agent for the marketplace. * `ROLE_SALES_SUPPORT` - Allows access as a Sales Support agent for the marketplace. * `ROLE_USER` - Allows access to retrieve self or other company user profiles. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. ##### path Parameters | | | | ---------------- | -------------------------------------------------- | | userUuidrequired | stringUnique identifier of user in the API request | ### Responses **200** Success **401** Unauthorized **404** User not found get/account/v2/users/{userUuid}/profile https\://marketplace.appdirect.com/api/account/v2/users/{userUuid}/profile https\://virtserver.swaggerhub.com/account/v2/users/{userUuid}/profile ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/account/v2/users/%7BuserUuid%7D/profile ``` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_updateUserProfile_PUT)Update user profile Update a marketplace user's profile. Also marks user's checklist with profile as completed. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER` - Allows access to read and write all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_USER` - Allows updating own or other company user profiles. ##### path Parameters | | | | ---------------- | -------------------------------------------------- | | userUuidrequired | stringUnique identifier of user in the API request | ##### query Parameters | | | | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | removeUnspecifiedCustomAttributes | booleanDefault:falseWhen true, custom attributes not included in the body will be removed from the user's profile. When false, custom attributes not included in the body will remain in the user's profile, unmodified. | ##### Request Body schema: application/json User profile resource containing requested updates | | | | ----------------------------- | ------------------------------------------------------------------------------------------- | | links | Array of objects or null (Link)Resource links | | birthday | stringBirthday date | | currentCity | stringCurrent city | | customAttributes | Array of objects (CustomAttributeAccountV2)Custom attributes | | educations | Array of objects (EducationAccountV2)List of user's educational credentials | | emailAddresses | Array of objects (EmailAddressAccountV2)Email addresses | | homePhone | stringHome phone number | | hometown | stringHometown | | ims | Array of objects (IM)List of instant messaging accounts | | mobilePhone | stringMobile phone number | | twitter | stringTwitter account | | twoFactorAuthenticationMethod | stringTwo factor authentication method | | workExperiences | Array of objects (WorkExperienceAccountV2)List of work experiences | | workPhone | stringWork phone number | ### Responses **200** Success **401** Unauthorized **404** User not found put/account/v2/users/{userUuid}/profile https\://marketplace.appdirect.com/api/account/v2/users/{userUuid}/profile https\://virtserver.swaggerhub.com/account/v2/users/{userUuid}/profile ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "links": [ { "href": "http://appdirect/api/account/v2/users/48dc0e2b-995b-4013-bd3f-2946309ca0fd", "rel": "user" }, { "href": "...", "rel": "..." } ], "birthday": "1999/9/9", "currentCity": "Current City", "customAttributes": [ ], "educations": [ { "current": false, "degree": "bachelor's", "endYear": 2010, "field": "Computer Science", "school": "MIT", "startYear": 2007 } ], "emailAddresses": [ { "address": "alternate@company.com", "type": "WORK", "verified": false } ], "homePhone": "+1 123 123 1234", "hometown": "Home Town", "ims": [ { "account": "someAccount", "type": "OTHER" }, { "account": "someAccount", "type": "OTHER" }, { "account": "someAccount", "type": "OTHER" } ], "mobilePhone": "+1 123 ", "twitter": "twitter_account", "twoFactorAuthenticationMethod": "twoFactorAuthenticationIsGreat", "workExperiences": [ { "current": true, "description": "Developer @ Appdirect", "employer": "Appdirect", "endYear": 2017, "position": "Manager", "startYear": 2011 } ], "workPhone": "+1 123 123 1234" }` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_patchUserProfile_PATCH)Patch user profile Update a marketplace user's profile. Also marks user's checklist with profile as completed. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER` - Allows access to read and write all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. * `ROLE_USER` - Allows updating own or other company user profiles. ##### path Parameters | | | | ---------------- | -------------------------------------------------- | | userUuidrequired | stringUnique identifier of user in the API request | ##### query Parameters | | | | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | removeUnspecifiedCustomAttributes | booleanDefault:falseWhen true, custom attributes not included in the body will be removed from the user's profile. When false, custom attributes not included in the body will remain in the user's profile, unmodified. | ##### Request Body schema: application/json User profile resource containing requested updates | | | | ----------------------------- | ------------------------------------------------------------------------------------------- | | links | Array of objects or null (Link)Resource links | | birthday | stringBirthday date | | currentCity | stringCurrent city | | customAttributes | Array of objects (CustomAttributeAccountV2)Custom attributes | | educations | Array of objects (EducationAccountV2)List of user's educational credentials | | emailAddresses | Array of objects (EmailAddressAccountV2)Email addresses | | homePhone | stringHome phone number | | hometown | stringHometown | | ims | Array of objects (IM)List of instant messaging accounts | | mobilePhone | stringMobile phone number | | twitter | stringTwitter account | | twoFactorAuthenticationMethod | stringTwo factor authentication method | | workExperiences | Array of objects (WorkExperienceAccountV2)List of work experiences | | workPhone | stringWork phone number | ### Responses **200** Success **401** Unauthorized **404** User not found patch/account/v2/users/{userUuid}/profile https\://marketplace.appdirect.com/api/account/v2/users/{userUuid}/profile https\://virtserver.swaggerhub.com/account/v2/users/{userUuid}/profile ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "links": [ { "href": "http://appdirect/api/account/v2/users/48dc0e2b-995b-4013-bd3f-2946309ca0fd", "rel": "user" }, { "href": "...", "rel": "..." } ], "birthday": "1999/9/9", "currentCity": "Current City", "customAttributes": [ ], "educations": [ { "current": false, "degree": "bachelor's", "endYear": 2010, "field": "Computer Science", "school": "MIT", "startYear": 2007 } ], "emailAddresses": [ { "address": "alternate@company.com", "type": "WORK", "verified": false } ], "homePhone": "+1 123 123 1234", "hometown": "Home Town", "ims": [ { "account": "someAccount", "type": "OTHER" }, { "account": "someAccount", "type": "OTHER" }, { "account": "someAccount", "type": "OTHER" } ], "mobilePhone": "+1 123 ", "twitter": "twitter_account", "twoFactorAuthenticationMethod": "twoFactorAuthenticationIsGreat", "workExperiences": [ { "current": true, "description": "Developer @ Appdirect", "employer": "Appdirect", "endYear": 2017, "position": "Manager", "startYear": 2011 } ], "workPhone": "+1 123 123 1234" }` ### Response samples * 200 * 404 Content type \*/\*\*/\* No sample ## [](#tag/User/operation/resource_User_setTemporaryPassword_PUT)Set a temporary password Set a temporary password for the given marketplace user. User must be active and specified password must meet user's company password policy. Effective company is the last company used by the user. ##### Required Scopes and Authorization Rules * `ROLE_PARTNER` - Allows access to read and write all marketplace data. * `ROLE_CORPORATE_ADMIN` - Allows access as a Network Manager for the marketplace. * `ROLE_CHANNEL_ADMIN` - Allows access as a Marketplace Manager for the marketplace. * `ROLE_SYS_ADMIN` - Allows access as a Company Admin for the company. ##### path Parameters | | | | ---------------- | -------------------------------------------------- | | userUuidrequired | stringUnique identifier of user in the API request | ##### Request Body schema: application/json Temporary password, user require to reset password at next login | | | | -------- | -------------- | | password | stringPassword | ### Responses **200** Success **401** Unauthorized **403** Role hierarchy violation. The user making the request cannot change the password of a user with a higher role than their own. **404** User not found put/account/v2/users/{userUuid}/temporaryPassword https\://marketplace.appdirect.com/api/account/v2/users/{userUuid}/temporaryPassword https\://virtserver.swaggerhub.com/account/v2/users/{userUuid}/temporaryPassword ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy `{ "password": "temppassword123" }` ### Response samples * 404 Content type \*/\*\*/\* No sample # [](#tag/Webhook)Webhooks ## [](#tag/Webhook/operation/resource_Other_readWebhooks_GET)List all webhooks This call lists all webhooks on your marketplace. ##### query Parameters | | | | --------- | --------------------------------------------------------------------------------------------------------------- | | page | stringDefault:"0"Number of pages requested | | size | stringDefault:"10"Number of record per page | | sortField | stringDefault:"DATE"Value: "DATE"Field used to sort the response | | sortOrder | stringDefault:"DESC"Enum: "ASC" "DESC"The order to sort the response(ASC, DESC) | ### Responses **200** Webhooks fetched successfully. get/channel/v1/webhooks https\://marketplace.appdirect.com/api/channel/v1/webhooks https\://virtserver.swaggerhub.com/channel/v1/webhooks ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url 'https://marketplace.appdirect.com/api/channel/v1/webhooks?page=SOME_STRING_VALUE&size=SOME_STRING_VALUE&sortField=SOME_STRING_VALUE&sortOrder=SOME_STRING_VALUE' ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "links": [ ], "content": [ { "uuid": "bc528c0f-12ae-44ca-bf05-270e90f8e5a6", "createdOn": 1480311491334, "lastModified": 1480311491334, "resourceType": "SALES_OPPORTUNITY", "resourceActions": [ "ADDED" ], "url": "https://example.com/endpoint", "partner": "APPDIRECT", "authenticationToken": "abc", "oauth2Config": { "accessTokenUri": "http://example.com/endpoint", "clientId": "clientId", "clientSecret": "clientSecret", "username": "username", "password": "password" }, "links": [ { "rel": "self", "href": "http://appdirect/api/channel/v1/webhooks?page=0&size=10&sortField=DATE&sortOrder=DESC" } ] }, { "uuid": "7b55aec2-6b90-4f25-ad96-4e5e3d830b56", "createdOn": 1480311491325, "lastModified": 1480311491325, "resourceType": "SALES_OPPORTUNITY", "resourceActions": [ "ADDED" ], "url": "https://example.com/endpoint", "partner": "APPDIRECT", "authenticationToken": "abc", "oauth2Config": { "accessTokenUri": "http://example.com/endpoint", "clientId": "clientId", "clientSecret": "clientSecret", "username": "username", "password": "password" }, "links": [ { "rel": "self", "href": "http://appdirect/api/channel/v1/webhooks?page=0&size=10&sortField=DATE&sortOrder=DESC" } ] } ], "page": { "size": 10, "totalElements": 2, "totalPages": 1, "number": 0 } }` ## [](#tag/Webhook/operation/resource_Other_createWebhook_POST)Create a webhook This call creates a new webhook on your marketplace. ##### Request Body schema: application/json webhook information | | | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | authenticationToken | stringAuthentication token to be passed in the HTTP header | | createdOn | numberCreation date | | lastModified | numberLast modified date | | oauth2Config | object (WebhookOAuth2Config) | | partner | stringChannel of the webhook | | resourceActions | Array of strings (WebhookResourceAction)ItemsEnum: "ADDED" "REMOVED" "CHANGED"Actions done on the resource that triggers the Webhook | | resourceTyperequired | string (WebhookResourceType)Enum: "RESELLER\_REGISTRANT" "SALES\_LEAD" "SALES\_OPPORTUNITY" "QUOTE" "COMPANY" "SUBSCRIPTION" "PAYMENT\_INSTRUMENT" "USER" "MEMBERSHIP" "DISCOUNT" "ORDER" "CATALOG\_PRODUCT" "PLATFORM" "APP\_ASSIGNMENT" "INVOICE" "STAGING\_PRODUCT" "LEAD" | | scope | string (WebhookScope)Enum: "PARTNER" "COMPANY" | | scopeId | string | | urlrequired | stringEndpoint to call when an action is done on a resource | | uuid | stringUnique identifier | ### Responses **201** Webhook created. post/channel/v1/webhooks https\://marketplace.appdirect.com/api/channel/v1/webhooks https\://virtserver.swaggerhub.com/channel/v1/webhooks ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "authenticationToken": "...", "createdOn": 12345, "lastModified": 12345, "oauth2Config": { "accessTokenUri": "...", "clientId": "...", "clientSecret": "...", "password": "...", "username": "..." }, "partner": "...", "resourceActions": [ "CHANGED", "CHANGED" ], "resourceType": "STAGING_PRODUCT", "scope": "COMPANY", "scopeId": "...", "url": "...", "uuid": "..." }` ### Response samples * 201 Content type application/json Copy Expand all Collapse all `{ "uuid": "3b5e41ef-2f4c-4e42-854f-b4f245b0a022", "createdOn": 1480311486245, "lastModified": 1480311486245, "resourceType": "SALES_OPPORTUNITY", "resourceActions": [ "ADDED" ], "url": "https://example.com/endpoint", "partner": "APPDIRECT", "authenticationToken": "abc", "oauth2Config": { "accessTokenUri": "http://example.com/endpoint", "clientId": "clientId", "clientSecret": "clientSecret", "username": "username", "password": "password" }, "links": [ { "rel": "self", "href": "http://appdirect/api/channel/v1/webhooks/3b5e41ef-2f4c-4e42-854f-b4f245b0a022" } ] }` ## [](#tag/Webhook/operation/resource_Other_readWebhook_GET)Retrieve a webhook This call returns all details for a specific webhook. ##### path Parameters | | | | ------------------- | ------ | | webhookUuidrequired | string | ### Responses **200** Webhook fetched successfully. get/channel/v1/webhooks/{webhookUuid} https\://marketplace.appdirect.com/api/channel/v1/webhooks/{webhookUuid} https\://virtserver.swaggerhub.com/channel/v1/webhooks/{webhookUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request GET \ --url https://marketplace.appdirect.com/api/channel/v1/webhooks/%7BwebhookUuid%7D ``` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "uuid": "ecdb1bc2-20e2-4b2c-9b0c-9678a8907ce2", "createdOn": 1480311490360, "lastModified": 1480311490360, "resourceType": "SALES_OPPORTUNITY", "resourceActions": [ "ADDED" ], "url": "https://example.com/endpoint", "partner": "APPDIRECT", "authenticationToken": "abc", "oauth2Config": { "accessTokenUri": "http://example.com/endpoint", "clientId": "clientId", "clientSecret": "clientSecret", "username": "username", "password": "password" }, "links": [ { "rel": "self", "href": "http://appdirect/api/channel/v1/webhooks/ecdb1bc2-20e2-4b2c-9b0c-9678a8907ce2" } ] }` ## [](#tag/Webhook/operation/resource_Other_updateWebhook_PUT)Update a webhook This call updates a webhook on your marketplace. ##### path Parameters | | | | ------------------- | ------ | | webhookUuidrequired | string | ##### Request Body schema: application/json | | | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | authenticationToken | stringAuthentication token to be passed in the HTTP header | | createdOn | numberCreation date | | lastModified | numberLast modified date | | oauth2Config | object (WebhookOAuth2Config) | | partner | stringChannel of the webhook | | resourceActions | Array of strings (WebhookResourceAction)ItemsEnum: "ADDED" "REMOVED" "CHANGED"Actions done on the resource that triggers the Webhook | | resourceTyperequired | string (WebhookResourceType)Enum: "RESELLER\_REGISTRANT" "SALES\_LEAD" "SALES\_OPPORTUNITY" "QUOTE" "COMPANY" "SUBSCRIPTION" "PAYMENT\_INSTRUMENT" "USER" "MEMBERSHIP" "DISCOUNT" "ORDER" "CATALOG\_PRODUCT" "PLATFORM" "APP\_ASSIGNMENT" "INVOICE" "STAGING\_PRODUCT" "LEAD" | | scope | string (WebhookScope)Enum: "PARTNER" "COMPANY" | | scopeId | string | | urlrequired | stringEndpoint to call when an action is done on a resource | | uuid | stringUnique identifier | ### Responses **200** Webhook updated successfully. put/channel/v1/webhooks/{webhookUuid} https\://marketplace.appdirect.com/api/channel/v1/webhooks/{webhookUuid} https\://virtserver.swaggerhub.com/channel/v1/webhooks/{webhookUuid} ### Request samples * Payload * Shell + Curl * Node + Request * Java + Okhttp Content type application/json Copy Expand all Collapse all `{ "authenticationToken": "...", "createdOn": 12345, "lastModified": 12345, "oauth2Config": { "accessTokenUri": "...", "clientId": "...", "clientSecret": "...", "password": "...", "username": "..." }, "partner": "...", "resourceActions": [ "CHANGED", "CHANGED" ], "resourceType": "STAGING_PRODUCT", "scope": "COMPANY", "scopeId": "...", "url": "...", "uuid": "..." }` ### Response samples * 200 Content type application/json Copy Expand all Collapse all `{ "uuid": "40e762c3-9a05-4a9a-b5fa-a07b11c70c80", "createdOn": 1480311491644, "lastModified": 1480311491644, "resourceType": "SALES_OPPORTUNITY", "resourceActions": [ "ADDED" ], "url": "https://example.com/endpoint", "partner": "APPDIRECT", "authenticationToken": "abc", "oauth2Config": { "accessTokenUri": "http://example.com/endpoint", "clientId": "clientId", "clientSecret": "clientSecret", "username": "username", "password": "password" }, "links": [ { "rel": "self", "href": "http://appdirect/api/channel/v1/webhooks/40e762c3-9a05-4a9a-b5fa-a07b11c70c80" } ] }` ## [](#tag/Webhook/operation/resource_Other_deleteWebhook_DELETE)Delete a webhook This call deletes a webhook from your marketplace. ##### path Parameters | | | | ------------------- | ------ | | webhookUuidrequired | string | ### Responses **204** Webhook deleted successfully. delete/channel/v1/webhooks/{webhookUuid} https\://marketplace.appdirect.com/api/channel/v1/webhooks/{webhookUuid} https\://virtserver.swaggerhub.com/channel/v1/webhooks/{webhookUuid} ### Request samples * Shell + Curl * Node + Request * Java + Okhttp Copy ``` curl --request DELETE \ --url https://marketplace.appdirect.com/api/channel/v1/webhooks/%7BwebhookUuid%7D ``` [![AppDirect footer logo](/img/AppDirect-Logo_White.svg)](https://www.appdirect.com) * © 2025 AppDirect Inc. * [Privacy Notice](https://www.appdirect.com/privacy-notice) * [Legal](https://www.appdirect.com/legal) * [Security](https://www.appdirect.com/products/support-and-services/platform-security) - [](https://www.linkedin.com/company/appdirect) - [](https://twitter.com/AppDirect) - [](https://facebook.com/AppDirect) --- [Skip to main content](#__docusaurus_skipToContent_fallback) [![My Site Logo](/img/logo_dark.svg)![My Site Logo](/img/logo_dark.svg)](/index.md) [**Developer Portal**](/index.md) User Guides ![](/img/BillingSubs_icon.svg) Billing and Subscriptions Manage subscriptions, payment method information and discounts using REST APIs. ![](/img/Product_icon.svg) Products Manage products in the catalog by defining product information, editions and pricing plans using GraphQL APIs. ![](/img/UserCompanyMgt_icon.svg) Users and Accounts Manage users, companies, and memberships in your marketplace including user roles and permissions. ![](/img/APIAuth_icon.svg) API Authentication Our APIs use an OAuth-authenticated interface that facilitates secure data access by partners and developers. [View all](/user-guides/.md) [ ](/user-guides/.md) [>](/user-guides/.md) APIs and References ![](/img/GraphQL_icon.svg) GraphQL API Reference Explore the reference documentation to learn more about the queries and mutations currently available within the AppDirect GraphQL API. ![](/img/REST_API_Ref_icon.svg) REST API Reference See examples of how to perform different tasks, like user and company management or billing and subscription management. ![](/img/AD_AI_Icon.svg) AI APIs Customize, integrate, and extend AIs for your organization and customers via industry-standard APIs ![](/img/swap-box-line_blue2.svg) LLMs.txt Provides LLM-friendly documentation to help AI tools like Cursor understand and work with the AppDirect Developer Portal content. [View all](/references-api/.md) [ ](/references-api/.md) [>](/references-api/.md) Developer Tools ![](/img/GraphQLExplorer_icon.svg) GraphQL Explorer Quickly write, validate, and test GraphQL queries for AppDirect APIs ![](/img/GraphQLSchema_icon.svg) GraphQL Schema Introspection Query the schema to discover available queries, mutations, subscriptions, types and fields in our GraphQL API. ![](/img/DemoGraphQLExplorer_icon.svg) Demo GraphQL API Explorer Check out the demo explorer tool by running queries using sample data. [View all](/user-guides/graphql-dev-tools/.md) [ ](/user-guides/graphql-dev-tools/.md) [>](/user-guides/graphql-dev-tools/.md) Storefront Theming ![](/img/GettingStarted_icon.svg) Getting Started Learn to modify elements of Plaza, our default theme, to customise components for storefront display including homepage and product profiles. ![](/img/AD_Learning_icon.svg) How to Guides Everything you need to know about customizing styles, meta tags, creating a header and footer, or localising, uploading and publishing your theme. ![](/img/DevToolkit_icon.svg) Storefront Toolkit Check out the demo explorer tool by running queries using sample data. [Overview](/storefront/.md) [ ](/storefront/.md) [>](/storefront/.md) [Webhooks](/webhooks/webhookintro/.md) Search [Sign Up](https://www.appdirect.com/store/signup) # Search the documentation [![AppDirect footer logo](/img/AppDirect-Logo_White.svg)](https://www.appdirect.com) * © 2025 AppDirect Inc. * [Privacy Notice](https://www.appdirect.com/privacy-notice) * [Legal](https://www.appdirect.com/legal) * [Security](https://www.appdirect.com/products/support-and-services/platform-security) - [](https://www.linkedin.com/company/appdirect) - [](https://twitter.com/AppDirect) - [](https://facebook.com/AppDirect) --- # Demo GraphQL Explorer --- # Hosted GraphQL Explorer --- # Introspection App --- # empty --- # APIs and References AppDirect’s growing list of APIs enable developers to customize experiences, and integrate with proprietary or partner systems. ### GraphQL API Reference Explore the reference documentation to learn more about the queries and mutations currently available within the AppDirect GraphQL API. [Read the guide](/graphql-docs/docs) ### REST API Reference See examples of how to perform different tasks, like user and company management or billing and subscription management. [Read the guide](/rest.md) ### AI API Reference Customize, integrate, and extend AIs for your organization and customers via industry-standard APIs. [Read the guide](https://developer.appdirect.com/ai-rest) ### llms.txt Provides LLM-friendly documentation to help AI tools like Cursor understand and work with the AppDirect Developer Portal content. [Read the guide](/references-api/llms.md) --- # LLMs-ready documentation ### What is LLMs.txt?[​](#what-is-llmstxt "Direct link to What is LLMs.txt?") AppDirect provides LLM-friendly documentation so AI tools (Cursor, Windsurf, GitHub Copilot, ChatGPT, Claude, and others) can understand and work with the AppDirect Developer Portal content. The LLM files are automatically generated from our docs at build time and are refreshed with each release. ### Available documentation[​](#available-documentation "Direct link to Available documentation") * **Concise index (llms.txt)**: Optimized for fast ingestion by AI tools. * View online / download: * **Complete documentation (llms-full.txt)**: Full content following the LLMs.txt standard. * View online / download: #### GraphQL[​](#graphql "Direct link to GraphQL") * **Concise GraphQL index (llms.txt)** * View online / download: * **Complete GraphQL examples (llms-full.txt)** * View online / download: What each file includes: * In `llms.txt`: A complete list of all GraphQL queries and mutations with brief descriptions and links. * In `llms-full.txt`: A full example for every query and mutation, plus all input/output types (including nested types), arguments, enums, and return details. ### What’s included (structure overview)[​](#whats-included-structure-overview "Direct link to What’s included (structure overview)") Based on our current `llms.txt`, the documentation covers: * **APIs and References**: GraphQL Queries and Mutations List & Exmaples. * **User Guides**: API usage (authentication, GraphQL, REST), products, billing/subscriptions, inventory, extensions, notifications, reseller, search, checkout, and more. * **Storefront**: Getting started, how-to guides (components, data, localization, static assets, checkout, headers/footers, meta tags, pages, uploads), reference (page objects, templating language, theme structure, toolkit commands), installation, and developer tools. * **Webhooks**: Concepts, configuration, authentication, payloads, resources, troubleshooting, and examples. * **Developer tools**: GraphQL Explorer, schema introspection, demo explorer. * **Internal/AI**: AppDirect AI API reference and AI user guides (best practices, prompt engineering, data sources, getting started). This index helps LLMs navigate the site and link to specific pages. ### Use with AI tools[​](#use-with-ai-tools "Direct link to Use with AI tools") * **Cursor** * Type `@Docs` in your prompt and reference: * Ask about REST/GraphQL endpoints, Storefront theming, or webhooks; Cursor will ground answers on our docs. * **Windsurf** * Reference with `@https://developer.appdirect.com/llms.txt` in prompts. * Optionally add the URL to your `.windsurfrules` for persistent access. * **ChatGPT & Claude** * Mention you’re using the AppDirect Developer Portal and include: * The model will fetch and ground on our documentation for accurate answers. * **GitHub Copilot** * Copilot cannot fetch external docs directly. Paste small, relevant snippets or link to specific pages so suggestions are better aligned. ### Example prompts[​](#example-prompts "Direct link to Example prompts") * "Where are AppDirect REST API rate limits documented, and what are the defaults?" * "Show a GraphQL mutation to create product editions and explain required fields." * "Steps to upload a Storefront theme" * "How do I configure webhook authentication and validate payload signatures?" * "Send custom metered usage v2 events with examples and limits." ### How it’s generated[​](#how-its-generated "Direct link to How it’s generated") Our LLM files are built using an automated process that compiles pages, reference content, and navigation into machine-friendly text. The files follow the LLMs.txt standard for compatibility across tools. They are regenerated with each site release to ensure freshness. --- # Customize your storefront Starting with Plaza, our core store theme, you can easily brand and merchandise your store using our powerful toolkit and robust, flexible component library. [Get Started](/storefront/getting-started.md) ### How to Guides Learn to customize the look and feel of your store including navigation, header and footer, home page, product profiles and other store settings. Manage menus, content, and translations. [Static Assets](/storefront/how-tos/static-assets/.md)[Adding Localizations](/storefront/how-tos/localization/.md)[Custom Pages](/storefront/how-tos/storefront-pages.md)[Using Marketplace Data](/storefront/how-tos/data/.md)[Importing a Theme](/storefront/how-tos/import-theme.md) ### Developer Tools Use our powerful toolkit to install and edit CSS and HTML files and develop your theme on a local machine. Modify pages, stylesheets, and other elements of your theme and test in browser. [Storefront Toolkit](/storefront/developer-tools/toolkit/.md)[Developer Toolbar](/storefront/developer-tools/storefront-toolbar.md) ### Component Library The building blocks of the Plaza Core Theme are fully editable both in style as well as content like images and feature copy. Use as is or use the Toolkit to customize or author your own. [Plaza Core Theme](/storefront/developer-tools/storefront-plaza.md)[Component Library](/storefront/developer-tools/storefront-components.md)[Customize Components](/storefront/how-tos/components/storefront-custom-components.md) ### Architecture Understand the underlying technologies of how themes are composed. [Theme Structure](/storefront/reference/storefront-structure.md)[Page Structure](/storefront/reference/storefront-page-structure.md)[Page Objects](/storefront/reference/page-objects/.md) ### Theme Manager Leverage the Theme Manager to upload, manage and publish versions of your store theme. [Upload a Theme](/storefront/how-tos/storefront-upload-theme.md)[Manage Uploaded Themes](https://help.appdirect.com/platform/Default.htm#StorefrontBuilder/sfb-work-manager.htm%3FTocPath%3DCustomize%2520the%2520storefront%7CWork%2520with%2520the%2520Theme%2520Manager%7C_____0) ### Theme Editor An editor in the marketplace itself which you can use to customize pages with drag-and-drop components and other visual tools. [Theme Editor](https://help.appdirect.com/platform/Default.htm#StorefrontBuilder/sfb-vis-editor.htm%3FTocPath%3DCustomize%2520the%2520storefront%7CWork%2520with%2520the%2520Storefront%2520Builder%7C_____0) --- ## [🗃️ Static Assets](/storefront/how-tos/static-assets/.md) [3 items](/storefront/how-tos/static-assets/.md) --- # Storefront Components Library ![](/assets/images/components-531626dc00c34a9e702694bae3f2c729.png) The [Storefront Components Library](#) is a collection of components that you can use to build your storefront theme. The components are organized into categories, and each category contains a set of components that you can use to build your storefront theme. Those components can be then customized in our [online theme editor](https://help.appdirect.com/platform/Default.htm#StorefrontBuilder/sfb-vis-editor.htm%3FTocPath%3DCustomize%2520the%2520storefront%7CWork%2520with%2520the%2520Storefront%2520Builder%7C_____0). * [Access the online Storefront Components Library documentation](#) * [How to get started with components in the toolkit](/storefront/how-tos/components/storefront-custom-components.md) * [How to customize components in our online editor](https://help.appdirect.com/platform/Default.htm#StorefrontBuilder/sfb-vis-editor.htm%3FTocPath%3DCustomize%2520the%2520storefront%7CWork%2520with%2520the%2520Storefront%2520Builder%7C_____0) --- # Storefront Plaza Theme The *Plaza* theme provides a generic e-commerce storefront for a marketplace that primarily sells digital subscription services. You can use Plaza as a reference and example when working on your own themes. The Plaza theme meets the AA accessibility standards defined in [version 2.2 of the W3C Web Content Accessibility Guidelines](https://www.w3.org/TR/WCAG2/) specification. The Plaza theme is based on the *component* approach to theme design. Components are re-usable and configurable UI elements, such as sidebars or sliders. provides a library of components with the Storefront Toolkit, and you can also create custom components if you need them (see Enable custom components). You can work with components in the Storefront Toolkit by adding them to the storefront pages. After a Plaza based theme has been uploaded to the marketplace, the components in it can be fine-tuned by a using the Theme Editor. The Plaza theme contains the following pages and sections: * A Home page, which features a product carousel and a slider (horizontal list) of selected products. * A product Listing page that contains a vertical list of all products. * A profile page for bundle products. * A Product profile page, which includes a product banner, image, description, and some supplementary information such as product questions. There are also subsections for edition and pricing information and product features. * An FAQ page. * The Checkout page (if your marketplace uses the latest version of the checkout feature). * A Header & Footer section for modifying the banners that appear across the top and bottom of each storefront page. Some components are used on multiple pages, while others are only available on a single page. The following sections show each page in the Plaza theme and the components used on each page. ## Home page[​](#home-page "Direct link to Home page") The Plaza home page contains a carousel at the top of the page as well as a product slider that lists popular products. | Component name | Description | Customization options | | -------------- | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- | | Carousel | Series of slides that link to any desired page or website. | Slide contents, carets and page dots, carousel height, speed of slide rotation. | | Slider | List of products to promote to site visitors, based on product groups or a manually curated selection. | Number of rows, tile size and style, quickview appearance. | ![Plaza home page](/assets/images/components-home-103f8534983e860b6d3b1dd954fb8956.png "Plaza home page") ## Listing page[​](#listing-page "Direct link to Listing page") The listing page, where you browse, search for, and filter marketplace products, contains three fixed components. | Component name | Description | Customization options | | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | | Title and Sorting | The page title as well as the list filters and sorting options. | n/a | | Category Sidebar | Displays the various product categories, attributes, and ratings, which you can select to filter the product list. For more information about product groups, categories, and attributes, see Organize products. | Dividers, borders, backgrounds, size, presence of subcategories. | | Product Listing | Paged list of marketplace products, which you can narrow with filters or selections in the sidebar. | Icon size, text/background/border colors, presence of comparison option and ratings. | ![](/assets/images/components-listing-5eaea420ff187cf1ce5064f2498c583c.png) ## Product profile page[​](#product-profile-page "Direct link to Product profile page") The product profile page contains many components that display different profile information. Most of the contents of the components are determined by product configuration (see the topics in the [Edit product profiles and branding](https://help.appdirect.com/products/Default.htm#DevCenter/dc-edit-profile-brand.htm%3FTocPath%3DProducts%7CEdit%2520product%2520profiles%2520and%2520branding%7C_____0) section). | Component name | Description | Customization options | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | | Product Banner | Top banner that includes the product logo, a short description, and a call to action (Buy, Start a Free Trial, and so on). | Background style and color, product image, text size, banner size, presence or rating stars. | | Product Page Tabs | Tab links to the different sections of the profile page. | Height, spacing, text and background colors. | | Product Description | Images, product description, prices and add-ons. | Image style, presence of prices and add-ons. | | Product Top Features | A list of the product "Benefits" that are configured as part of the profile. | Number of columns, presence of icons. | | Product Featured Customers | List of featured customer logos. | Color or monochrome for logos, automatic rotation of logos and rotation speed. | | Product Reviews | List of verbatim reviews and ratings. | Position of average rating, presence of reviewer avatar, "More reviews" button label. | | Product Additional Info | Product terms and conditions, support information, and categories | Number of columns, position of information, background and border colors. | | Product Questions | Product questions and answers, as well as a button that users can click to ask questions. | n/a | | Product Resources | List of supplementary resources such as PDFs, Sribd documents, or videos. | Number and spacing of columns. | | Product Similar Apps | A slider that lists similar products (that is, products sold by the same vendor). Unlike other sliders, you cannot choose the products to include. | Slider title, number of rows, tile size and style, quickview appearance. | ![](/assets/images/components-profile-f36a38a7238c761da815462b08e17e76.png) ![Profile page componets 2](/assets/images/components-profile2-55ad89937a5439078e32b58913cf4f95.png "Profile page componets 2") ![Profile page components - questions](/assets/images/components-profile-q-7e1f0e20e18c4816d0a6e6d2a80521d1.png "Profile page components - questions") ![Profile page components - resources](/assets/images/components-profile-resources-3b76ac9b127ea1d14053edf317605f88.png "Profile page components - resources") ![Profile page components 3](/assets/images/components-profile3-c0a8f1d5445b16238902e4097ddf9054.png "Profile page components 3") ## Editions and pricing[​](#editions-and-pricing "Direct link to Editions and pricing") The Editions & Pricing page contains a single component that lists the product edition information in a series of tiles. The number and contents of the tiles depend on the edition configuration (see [Edit editions and pricing](https://help.appdirect.com/products/Default.htm#DevCenter/dc-edit-edition-price.htm%3FTocPath%3DProducts%7CEdit%2520editions%2520and%2520pricing%7C_____0)). | Component name | Description | Customization options | | --------------- | ----------------------------------------- | --------------------- | | Product Pricing | A slider that lists all product editions. | n/a | ![Editions and pricing components](/assets/images/components-editions-pricing-0e8ae54eb556cf7e627378c543ee359d.png "Editions and pricing components") ## Feature Details[​](#feature-details "Direct link to Feature Details") The Feature Details page contains a single component that contains the detailed product feature descriptions (see [Add product features](https://help.appdirect.com/products/Default.htm#DevCenter/Prod-Add-Features.html%3FTocPath%3DProducts%7CEdit%2520product%2520profiles%2520and%2520branding%7C_____3)). | Component name | Description | Customization options | | ----------------------- | --------------------------------------------- | -------------------------------------------------------------------------- | | Product Feature Details | A vertical list of the full product features. | Number of columns, alignment, image position and shadow, background color. | ![Product feature details components](/assets/images/components-feature-details-85f6e209ec053c93efeca8db353c7d92.png "Product feature details components") ## FAQ[​](#faq "Direct link to FAQ") The FAQ page contains a single component that displays any FAQ entries that the configured (see Create FAQs). | Component name | Description | Customization options | | -------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | FAQs | The FAQ question and response text. | Determine whether each question is expandable or all text is displayed by default. Background and menu color, dividers, padding and borders. | ![FAQ components](/assets/images/components-faq-ab43abb85b82780c5e4876dc3e6a8ff1.png "FAQ components") ## Checkout[​](#checkout "Direct link to Checkout") The Checkout page in the Theme Editor is only available on marketplaces that use the latest version of the checkout feature. If you want to use the latest checkout version or are not sure which version your marketplace uses, contact . The Checkout page is separate from the other storefront pages and has its own button, text, and link styles. The options are similar to those described in Change storefront colors but only apply to the Checkout page. | Component name | Customization options | | -------------- | --------------------------------------------------------------------------- | | n/a | Change the logo to use on the Checkout page. Choose text and button colors. | : Checkout page components ## Header & Footer[​](#header--footer "Direct link to Header & Footer") The Header & Footer section of the Plaza theme serves as a container for the storefront header and footer, the banners that appear across the top and bottom of each storefront page. You can modify the menus that appear in the header and footer. See Work with header and footer menus. ### Header[​](#header "Direct link to Header") ![FAQ components](/assets/images/component-header-713cf3dfa207e19593699ed5c71a49ac.png "FAQ components") The header can include these components: | Component name | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------------- | | Announcement Bar | An optional bar for highlighting a special message. | | Auxiliary Bar | An optional bar to supplement the Home bar. | | Home Bar | The main marketplace navigation bar. This bar can include the logo, the name of the current user, and the cart icon. | | Navigation Bar | An optional bar for additional links to navigate the marketplace. | | Search field | The search field for searching the marketplace. | For each of these components, Marketplace Managers can modify characteristics such as the size, background color, text size and color, alignment, borders, and placement. Marketplace Managers can upload custom logos to use for the to use for the cart and login icons in the Home bar. They can also upload an icon for the Search field, and specify the bar in which it appears. ### Footer[​](#footer "Direct link to Footer") ![FAQ components](/assets/images/component-footer-34963e3c20e39f704b682c0df63fb490.png "FAQ components") The Footer component offers three basic styles: Classic, Newsletter & Social, or Sitemap. The Classic style displays all footer items in one main section, while the other two styles split them between the main section and an additional bottom bar that can have its own background and text colors. In addition to the standard formatting options in both sections (colors, text size and placement, and so on), s can use the Footer options to add a copyright notice, and links to social media sites such as Facebook, Twitter, and LinkedIn. --- # Using the developer toolbar After you install and start the Storefront Toolkit, you can view your theme by opening a web browser and going to `http://localhost:3555/en-US/home` to display the storefront. The *developer toolbar* appears on the right side of the browser. By default, the developer toolbar is collapsed, and only the icons appear as shown in the following image. ![](/assets/images/sfb-dev-tool-bar-45267d4537b4510f1f535cf41bedbce7.png) The developer toolbar includes resources that you can use to view the code and preview your changes directly in the browser as you customize your theme in a text editor. Click the icon at the top of the toolbar or the expand/collapse button at the bottom to view full labels for the following options. ## Available options[​](#available-options "Direct link to Available options") ### Dev Tools[​](#dev-tools "Direct link to Dev Tools") Click the icon to expand or collapse the developer toolbar to display or hide the full labels for each of the toolbar items. ### Documentation[​](#documentation "Direct link to Documentation") While you are using the developer toolbar, you can quickly access resources to help build your theme. Click this button to launch the online help in a separate window. ### Header Views[​](#header-views "Direct link to Header Views") In the header section of your developer tool, you can quickly view the header of your storefront as it will appear when a user is:  * logged in * *not* logged in * in the checkout flow * in single sign-on (SSO) flow * viewing administrator pages Note that when you select the checkout flow or SSO flow, the header only displays the logo of your marketplace. If you do not specify an access token, the logged-in and administrator page header views are simulated: * The Logged-In view displays the storefront as seen by an end user with basic user permissions. * The Admin view displays the MyApps page with a simulated view. To view the logged-in header with specific user permissions, you must create an API client and generate an access token you can enter in the Access Token field in the Header submenu. For details, see Test the logged-in header with an access token. ### Data Viewer[​](#data-viewer "Direct link to Data Viewer") The Data Viewer function imports actual data from your marketplace, in order to provide a more accurate view of what it will look like in production. You can use this feature to view information about meta tags, locales, products, UI elements, and other items. See Use AppDirect data and Customized data for more information. ### Search Data[​](#search-data "Direct link to Search Data") You can use the toolbar Search Data function to help you find the data you need to customize your template. Complete the following procedure to find additional data. To search for data: 1. Start the Toolkit. 2. In the browser, go to the toolbar and click **Search Data**. The Search Data bar appears and Apps is selected by default in the drop-down list. 3. Select one of the following options from the drop-down list: * Apps---Applications (or products) available in your storefront. * Categories---Filters products into one or more levels. * Attributes---Filters products using inherent characteristics of a product. 4. Enter a search string. Application, category, or attribute names appear depending on your selection in the previous step. 5. Select the application, category, or attribute and the following information appears: * Integration---Data tag that you can add to your theme template to view information about the application in the Data Viewer. * Raw data---Information pulled from the Products API. See Use AppDirect data and Customized data for more information about searching for data. ### Show Grid[​](#show-grid "Direct link to Show Grid") Use this feature to view the page based on a grid view, which divides the page into columns to help you place elements on a page. ### Expand or Collapse[​](#expand-or-collapse "Direct link to Expand or Collapse") Click this icon to expand or collapse the developer toolbar to display or hide the full labels for each of the toolbar items. See Customize themes to begin customizing a theme for your storefront. --- info Still haven't installed the toolkit? Get started **[here](/storefront/storefront-installation.md)**. note This document applies to `sfb-toolkit@5.x.x` or newer. For older versions please see **[here](/storefront/reference/custom-components/legacy/legacy-storefront-toolkit.md)**. # Storefront Toolkit The Storefront Toolkit consists of a set of tools that developers can use to build storefront themes. In general, the theme customization process includes running commands from the command line, manually updating various storefront HTML and CSS files, and previewing changes on a local server. To create themes using the Storefront Toolkit, you must install third-party programs to run a development environment in which you can develop and preview themes before they are available in the production environment. ## Command-line commands and options[​](#command-line-commands-and-options "Direct link to Command-line commands and options") This section explains how to use the different Storefront Toolkit commands available through the command line. When you work with the developer tool, you typically require two command-line windows. In the first window, you start the tool; in the second, you can run other commands (create new themes, update the theme configuration, and so on). You can use the command line to do the following: | Command | Description | | -------------------------------------------------------------- | ----------------------------------------------------------------------------- | | `sfb-toolkit setup` | Creates a new project/environment where Developer can store themes | | `sfb-toolkit create [name]` | Creates a new theme | | `sfb-toolkit components-copy` | Copy UI library components | | `sfb-toolkit components-delete` | Delete copied UI library components | | `sfb-toolkit components-add` | Add a new custom component | | `sfb-toolkit checkout [name]` | Changes context to the theme \[name] | | `sfb-toolkit about` | Lists existing themes | | `sfb-toolkit status` | Gives information about current configuration | | `sfb-toolkit update` | Update current theme's configuration | | `sfb-toolkit start` | Starts local server with current theme on `https://localhost:3555/en-US/home` | | `sfb-toolkit package` | Creates a .zip file with current theme files | | `sfb-toolkit install [module]` | Installs npm module in the currently selected theme | | `sfb-toolkit import [themePath] [marketplacePath] [themeName]` | Imports a theme | | `sfb-toolkit components` | Setup custom components | | `sfb-toolkit version` | Shows version of sfb-toolkit | For a full list of commands, use the help option: ``` sfb-toolkit --help ``` See the [Toolkit commands overview](https://drive.google.com/file/d/1YEzXbQR6JNiw_q0dM7-KdtnpeQaPIG75/view?usp=sharing) for a video tutorial on how to use commands to improve your workflow. ### Create themes[​](#create-themes "Direct link to Create themes") Use the following procedure to create themes. You can create as many custom themes as required. Each theme appears as a separate folder at the root of the themes folder you created during installation (see Install the Storefront Toolkit). To create a theme 1. Open a command-line window. 2. Go to the themes directory you created during installation. 3. Type `sfb-toolkit create themeName` and press **Enter**. You are prompted to select one of the standard marketplace themes as a starting point. The choices are classic and Plaza. 4. Use the arrow keys to highlight the theme you want, and press **Enter**.A folder with the specified theme name is created, and you are prompted to type the path to your marketplace. 5. Type your full marketplace URL. important Ensure that you include `https://` in the URL. Press **Enter**. Your context changes to the new theme, and you can now import data from the specified marketplace. ### List themes[​](#list-themes "Direct link to List themes") Use the following procedure to list all of the custom themes that you have created, and determine which is currently the default theme used when you start the Storefront Toolkit. To list themes 1. Open a command-line window. 2. Go to the themes directory you created during installation. 3. Type `sfb-toolkit about` and press **Enter**. All available themes are listed. The current theme is highlighted. ### Switch between themes[​](#switch-between-themes "Direct link to Switch between themes") You can switch between your various custom themes at any time. When you switch between themes, you can refresh the browser preview page to view the newly selected theme. To select a theme 1. Open a command-line window. 2. Go to the themes directory you created during installation. 3. Type `sfb-toolkit checkout themeName`, where `themeName` is the name of one of the available themes, and press **Enter**. Your context changes to the specified theme. ### View theme configuration[​](#view-theme-configuration "Direct link to View theme configuration") Use the following procedure to change the configuration of the current theme. The configuration consists of the marketplace URL as well as the path to the `PageObjects`, which control the flow of data between the marketplace and the toolkit. To view theme configuration 1. Open a command-line window. 2. Go to the themes directory you created during installation. 3. Type `sfb-toolkit status` and press **Enter**. The marketplace and `PageObjects` paths are listed. ### Update your marketplace URL[​](#update-your-marketplace-url "Direct link to Update your marketplace URL") Use the following procedure to update the marketplace URL of the current theme. To update the theme configuration 1. Open a command-line window. 2. Go to the themes directory you created during installation. 3. Type `sfb-toolkit update` and press **Enter**. You are prompted for a marketplace path. 4. Type the full marketplace URL. important Ensure that you include `https://` in the URL. Press **Enter**. The configuration is updated. --- # Storefront Toolkit Changelog # @appdirect/sfb-toolkit Storefront Toolkit CLI to power up building your custom theme for AppDirect's Marketplace. ### Requirements[​](#requirements "Direct link to Requirements") * Node 10.x or 12.x for versions 1.x.x to 3.0.6 * Node 16.x or 18.x for versions 4.x.x or newer ### Release Notes:[​](#release-notes "Direct link to Release Notes:") **5.0.7** * Updated Plaza theme version to [`sfb-theme-plaza@0.0.89`](https://www.npmjs.com/package/@appdirect/sfb-theme-plaza/v/0.0.89) * Updated storefront builder components to [`sfb-theme-components@2.1.7`](https://www.npmjs.com/package/@appdirect/sfb-theme-components/v/2.1.7) ### How to use[​](#how-to-use "Direct link to How to use") The idea behind Toolkit CLI is similar to how `git` CLI has been made. Developers can have multiple themes in a single environment. | Command | Description | | -------------------------------------------------------------- | ----------------------------------------------------------------------------- | | `sfb-toolkit setup` | Creates a new project/environment where Developer can store themes | | `sfb-toolkit create [name]` | Creates a new theme | | `sfb-toolkit checkout [name]` | Changes context to the theme \[name] | | `sfb-toolkit about` | Lists existing themes | | `sfb-toolkit status` | Gives information about current configuration | | `sfb-toolkit update` | Update current theme's configuration | | `sfb-toolkit start` | Starts local server with current theme on `https://localhost:3555/en-US/home` | | `sfb-toolkit package` | Creates a .zip file with current theme files | | `sfb-toolkit storybook` | \[**Deprecated**] Start storybook for the currently selected theme | | `sfb-toolkit install [module]` | Installs npm module in the currently selected theme | | `sfb-toolkit components` | Setup custom components | | `sfb-toolkit components-info` | Custom components information | | `sfb-toolkit components-copy` | Copy UI library custom components | | `sfb-toolkit components-delete` | Delete copied UI library components | | `sfb-toolkit components-add` | Add a new custom components | | `sfb-toolkit import [themePath] [marketplacePath] [themeName]` | Imports a theme | | `sfb-toolkit version` | Shows version of sfb-toolkit | ### Other Resources[​](#other-resources "Direct link to Other Resources") * [Official Documentation](https://developer.appdirect.com/storefront/) * [Checkout Integration](https://help.appdirect.com/platform/Default.htm#StorefrontBuilder/sfb-checkout-intro.htm) This Repository is owned and maintained by UI Platform team @ AppDirect Inc. --- # Upgrading to 4.0 and later Storefront Toolkit version 4.0 and later use version 16.x or 18.x of Node.js as a prerequisite. This represents a significant change that came about after versions 10.x and 12.x of Node.js were deprecated. If you have installed version 3.x.x of Storefront Toolkit and later upgrade to version 4.0, you can continue to use and work on existing themes originally created in the earlier Toolkit versions. However, you may encounter warnings and other issues as a result of the change. This section describes the issues you may encounter as the result of an upgrade, and provides advice on how to address them. ## Deprecation warnings[​](#deprecation-warnings "Direct link to Deprecation warnings") Some commands (*checkout*, *start*, and *package*) may display deprecation warnings. These do not prevent the commands from functioning unless there is also an error. These deprecation warnings are the result of minor incompatibilities which arise because the SASS files for the Toolkit are now compiled with Dart Sass rather than node-sass. You can fix this issue by using the *math.div* or *calc* functions when employing division in a SASS file. If you update related items in your theme, the warnings should no longer appear. ## Existing themes with custom components[​](#existing-themes-with-custom-components "Direct link to Existing themes with custom components") If an existing theme includes custom components, you may encounter an error when using the *start* command: `Can't resolve scheduler/tracing`. This error occurs due to a difference in the version of React used by each version of the Toolkit. Version 4.0 of the Toolkit uses a version of React (16.14.0) that has renamed *schedule/tracking* to *schedule/tracing*, and is thus unable to find *schedule/tracking* when it is cited in an older theme. To fix this issue in your theme, run the *storybook* command. The *start* command should then work normally afterward. note **About @appdirect/sfb-theme-components** It is not possible to upgrade *@appdirect/sfb-theme-components* to the latest version while using an earlier version of the Toolkit. You must upgrade your Toolkit to version **4.0** to get the latest (**0.0.293**) @appdirect/sfb-theme-components update. ## Existing themes based on Classic theme[​](#existing-themes-based-on-classic-theme "Direct link to Existing themes based on Classic theme") If an existing theme is based on the classic theme you may encounter other errors: * `Top-level selectors may not contain the parent selector "&"` * `compound selectors may no longer be extended` Like the deprecation messages, these errors occur because the Toolkit now uses Dart Sass rather than node-sass. To resolve them, you must use a text editor to perform several steps: 1. In the theme *\*.scss* files, replace all instances of: `& .configurator-editions {` with `.configurator-editions {` 2. Similarly, in the *\_profile-elements.scss* file replace: `&.profile__image {` with `.profile__image {` 3. Open the *assets/css/theme/component/\_button.scss* file and add these lines of code after the `&.is-active` declaration: ``` &--is-active { color: $BUTTON_COLOR_SELECTED; text-shadow: 0 1px 0 $BUTTON_TEXT_SHADOW_SELECTED; border-color: $BUTTON_BORDER_SELECTED; background-color: $BUTTON_BACKGROUND_SELECTED; box-shadow: inset 0 2px 6px -1px $BUTTON_BOX_SHADOW_SELECTED; } ``` 4. Open the *assets/css/theme/pages/\_listing.scss* file and replace all instances of: `@extend .button.is-active` with `@extend .button--is-active` Once you have made and saved these changes, the errors should no longer occur.   --- # Getting Started info Still haven't installed the toolkit? [Get started here](/storefront/storefront-installation.md). ## Start the Storefront Toolkit[​](#start-the-storefront-toolkit "Direct link to Start the Storefront Toolkit") 1. Open a command-line window 2. Go to the workspace directory---that is, the *`themeFolderName`* directory you created during installation. 3. Type `sfb-toolkit start` and press **Enter**. Wait for the command to start the service, indicated by the following message: ``` AppDirect Toolkit is running, you can view your storefront preview at: http://localhost:3555/en-US/home ``` 4. Open a browser and go to `http://localhost:3555/en-US/home`. The storefront opens and the developer tool appears on the right side of the page. 5. You can now edit the storefront pages in the text editor, and see the changes appear in the browser. note Leave the command-line window open with the `start` command running. To run other commands, open a new window. See Use the [developer toolbar](/storefront/developer-tools/storefront-toolbar.md) to learn more about the developer tool. ## Next Steps[​](#next-steps "Direct link to Next Steps") When the Toolkit starts it launches a web server and provides its URL. You can go to this URL in a web browser to see the effect of your changes to the theme as you make them. You use the developer toolbar to perform various tasks, such as importing data from the marketplace for display in your storefront. When creating themes for your storefront we recommend that you use a development environment identical to your production environment. In the development environment you can build your theme locally and preview changes in the browser. After you complete your theme you can package it as a `.zip` file and upload it to your production environment with the Theme manager. ## Video tutorials[​](#video-tutorials "Direct link to Video tutorials") The following video tutorials demonstrate the basic steps required to get started with the Storefront Toolkit. * [Installation](https://drive.google.com/file/d/17dzkvmpUoXWe1Sz_t6Dxy1eQ1kJ1iV6N/view?usp=sharing). Demonstrates how to install the Storefront Toolkit on OSX. * [Base theme overview](https://drive.google.com/file/d/1qtfDwjmgEogd9_aCbcGYUkEzgDE-dUBw/view?usp=sharing). Describes the base theme and its different components, which are provided with the toolkit. * [Storefront Toolkit toolbar](https://drive.google.com/file/d/1QCkJZvGgYNlRZyB-sCoihMJAJk2nQlG4/view?usp=sharing). Describes the toolbar that you can view in the browser preview. * [Toolkit commands overview](https://drive.google.com/file/d/1YEzXbQR6JNiw_q0dM7-KdtnpeQaPIG75/view?usp=sharing). Explains how to use the available commands to improve your workflow. * [Modify your first page](https://drive.google.com/file/d/1yM9Vgjag7kMhSMcbU-e4vVh0Owcey70y/view?usp=sharing). Demonstrates how to customize your theme, using the home page as an example. * [HTML templating engine](https://drive.google.com/file/d/19l3H-hnfUyn11LcrNs3n1cpCRsJWHInT/view?usp=sharing). Describes the Theme Editor templating engine and the features available to use in your templates. * [Custom pages and profile page overrides](https://drive.google.com/file/d/1ibX6U2VI8GIft8yqSvvaehj4UbcI12SR/view?usp=sharing). Explains how to create custom pages and use custom data. * [Manage headers and footers](https://drive.google.com/file/d/1oYDGWNz3OJm4-42p2aGPGCX9p2H1cgkc/view?usp=sharing). Explains the unique templating system for headers and footers, and demonstrates how to customize them. * [Overview](https://drive.google.com/file/d/1ZSYNO7sr78qVd7LP8E-2XOlqna9vBBqG/view?usp=sharing). Explains how to use the Theme Manager to publish themes and manage theme versions. --- # Custom components note This document applies to `sfb-toolkit@5.x.x` and `sfb-theme-components@0.0.352` or newer. For older versions please see **[here](/storefront/reference/custom-components/legacy/legacy-custom-components-getting-started.md)**. The Plaza theme enables you to create themes using our React components library, which is included in the latest sfb-toolkit version. The toolkit includes components that you can use to quickly build and customize your storefront pages through the Theme Editor. For example, you can integrate `Slider`, `Carousel`, `ProductBanner`, and many more components with your Plaza theme. If none of the components in our library suit your needs, you can create custom components. Custom components are components that you can create and customize through the [schema](/storefront/reference/custom-components/schema.md) object. The `Getting Started` section contains everything you need to know to start building your custom components according to our guidelines and best practices. caution While custom components allow for great flexibility please check the **[risks](/storefront/reference/custom-components/custom-components-risks.md)** associated with using them. ## Installation[​](#installation "Direct link to Installation") caution Once custom components are installed there is currently no command to automatically reverse this action! See **[here](/storefront/how-tos/components/storefront-custom-components-uninstall.md)** for instructions on how to manually remove them. To setup your theme to use custom components, execute the following command: ``` sfb-toolkit components ``` For a more in depth explanation on this command please see [here](/storefront/reference/toolkit-commands.md#install-custom-components-to-a-theme). ## Creating new component[​](#creating-new-component "Direct link to Creating new component") You can create a new component by executing the command below. For more information about this command see [here](/storefront/how-tos/components/storefront-custom-components-add.md). ``` sfb-toolkit components-add ``` ## Reuse our UI library components[​](#reuse-our-ui-library-components "Direct link to Reuse our UI library components") You can reuse existing UI elements (atoms and components) from our UI library for your custom components. For example, if you want to reuse the `Button` atom in your custom component, add the following import: ### Components[​](#components "Direct link to Components") To reuse a `component` you can execute the following toolkit command to create a local copy of the component(s) selected. For more information about this command see [here](/storefront/how-tos/components/storefront-custom-components-customize-ui-library.md). ``` sfb-toolkit components-copy ``` The components available to be copied will be listed after the `components-copy` command is executed. note The components available depend on the version of the UI library (`sfb-theme-components`) used by the `theme`. ### Atoms[​](#atoms "Direct link to Atoms") info Atoms are small UI elements that we use to create `components`. To reuse one of our `atoms` you can import them directly from `@appdirect/sfb-theme-components/src/atoms`: ``` import Button from '@appdirect/sfb-theme-components/src/atoms/button/Button'; ``` ## Availability[​](#availability "Direct link to Availability") `@appdirect/sfb-toolkit@5.x.x`
`@appdirect/sfb-theme-components@0.0.352+` --- # Add components to your storefront theme note This command is available starting `sfb-toolkit@5.x.x`. ## Using the toolkit[​](#using-the-toolkit "Direct link to Using the toolkit") An easy way to add a component to your theme is by executing the following command: ``` sfb-toolkit components-add ``` Once the command is executed you will be prompted to provide the following data: 1. Name of the new component you wish to add (letters and numbers only). 2. On which storefront page (if any) you want the new component to be added to. 1. You may choose if the component should be `orderable` (integrated with our Theme Editor) or `non-orderable` (stand-alone). note The `orderable` option is only available for themes using `@appdirect/sfb-theme-components@0.352` or newer. ### Orderable components[​](#orderable-components "Direct link to Orderable components") Orderable components are components that will be added to the theme and are **recognized and configurable** through our Theme Editor. ### Non-orderable components[​](#non-orderable-components "Direct link to Non-orderable components") Orderable components are components that will be added to the theme but are **not recognized and configurable** through our Theme Editor. ## Remove added components[​](#remove-added-components "Direct link to Remove added components") ### Orderable components[​](#orderable-components-1 "Direct link to Orderable components") To remove an orderable component you added please follow these steps: 1. Delete your added component folder found under: `workspaceFolder/themes/[yourThemeName]/customComponents/components/[addedComponenNamte]` 2. Open `workspaceFolder/themes/[yourThemeName]/settings.json` 1. Find the `orderableComponents` list 2. Remove the object with the `name` attribute matching the component you added 3. Open `workspaceFolder/themes/[yourThemeName]/customComponents/index.js` 1. Find and remove the component you added ### Non-orderable components[​](#non-orderable-components-1 "Direct link to Non-orderable components") To remove a non-orderable component you added please follow thse steps: 1. Delete your added component folder found under: `workspaceFolder/themes/[yourThemeName]/customComponents/components/[addedComponenNamte]` 2. Open `workspaceFolder/themes/[yourThemeName]/content/pages/[pageYouSlectedToAddComponent]/[pageName].html` 1. Remove `` 3. Open `workspaceFolder/themes/[yourThemeName]/customComponents/index.js` 1. Find and remove the component you added --- note This document applies to `sfb-toolkit@5.x.x` and `sfb-theme-components@0.0.352` or newer. # Customize UI library components If you want to customize some of our UI components (i.e. **Carousel**) you can easily do this by using the following command: ``` sfb-toolkit components-copy ``` Once the command is executed you will be provided with a list of **components** that you can copy and customize locally. A folder named **sfb\_theme\_components\_\[sfbThemeComponentsVersionInstalled]** (i.e. **sfb\_theme\_components\_0\_0\_352**) will be created in the `workspaceFolder/themes/[yourThemeName]/customComponents` folder. The `sfbThemeComponentsVersionInstalled` refers to the `version` of `@appdirect/sfb-theme-components@[version]` that is installed in your theme. After the component(s) are selected you will be given three options to choose from: 1. Comment out existing exported components and add those selected. 2. Replace existing components with those selected. 3. Do nothing. (Manual index update will be required) ### Comment out existing exported components and add those selected[​](#comment-out-existing-exported-components-and-add-those-selected "Direct link to Comment out existing exported components and add those selected") When choosing this option the `workspaceFolder/themes/[yourThemeName]/customComponents/index.js` file will be updated and any `UI library component(s)` with the same `name` already exported will be automatically `commented out`. Example for when having selected the `Carousel` component: Before (index.js): ``` export { default as HeroBanner } from './sfb_theme_components_0_0_352/src/components/hero-banner/HeroBanner' export { default as Carousel } from './sfb_theme_components_0_0_352/src/components/carousel/Carousel' ``` After (index.js): ``` export { default as HeroBanner } from './sfb_theme_components_0_0_352/src/components/hero-banner/HeroBanner' // export { default as Carousel } from './sfb_theme_components_0_0_352/src/components/carousel/Carousel' export { default as Carousel } from './sfb_theme_components_0_0_356/src/components/carousel/Carousel' ``` ### Replace existing components with those selected[​](#replace-existing-components-with-those-selected "Direct link to Replace existing components with those selected") When choosing this option the `customComponents/index.js` file will be updated and any `UI library component(s)` with the same `name` already exported will be automatically `replaced` by the new component. Example for when having selected the `Carousel` component: Before (index.js): ``` export { default as HeroBanner } from './sfb_theme_components_0_0_352/src/components/hero-banner/HeroBanner' export { default as Carousel } from './sfb_theme_components_0_0_352/src/components/carousel/Carousel' ``` After (index.js): ``` export { default as HeroBanner } from './sfb_theme_components_0_0_352/src/components/hero-banner/HeroBanner' export { default as Carousel } from './sfb_theme_components_0_0_356/src/components/carousel/Carousel' ``` ### Do nothing (manual index update will be required)[​](#do-nothing-manual-index-update-will-be-required "Direct link to Do nothing (manual index update will be required)") When choosing this option the `customComponents/index.js` file will **NOT** be updated. Choose this option if you wish to use the UI library component copied as part of another component. Example for when having selected the `Carousel` component: Before (index.js): ``` export { default as HeroBanner } from './sfb_theme_components_0_0_352/src/components/hero-banner/HeroBanner' export { default as Carousel } from './sfb_theme_components_0_0_352/src/components/carousel/Carousel' ``` After (index.js): ``` export { default as HeroBanner } from './sfb_theme_components_0_0_352/src/components/hero-banner/HeroBanner' export { default as Carousel } from './sfb_theme_components_0_0_352/src/components/carousel/Carousel' ``` --- # Using Marketplace Data Most components leverage data provided by the "Page Objects". You can access the data directly in your component. Use the data viewer (in the toolkit toolbar) to find the content that you want to pass to your component. The components expose a public interface where you can use the property marketplaceData to list the data to provide to the component. The marketplace data contains the default strings provided. Example: ``` Resources.schema = () => ({ name: 'ProductResources', marketplaceData: { header: 'application.resources.i18n.Resources', documents: 'application.resources.public.documents', videos: 'application.resources.public.videos' } }); ``` --- # Delete UI library components note Only UI library **components** created through `sfb-toolkit components-copy` command can be deleted using this method. If you wish to delete any of our UI library components you can easily do this by executing the command below and following the prompts: ``` sfb-toolkit components-delete ``` A list of components will be shown together with the `version` of the UI library (`@appdirect/sfb-theme-components@0.0.352` or newer) that they were copied from separated by `_`: ``` * [0_0_352] Header * [0_0_352] Footer ``` This command will also automatically remove all the selected components (non commented out) from the `workspaceFolder/themes/[yourThemeName]/customComponents/index.js` file. ## Delete nested UI library components[​](#delete-nested-ui-library-components "Direct link to Delete nested UI library components") Some of our components are part of other components (i.e. `HeaderAuxiliaryBar` is part of `Header`). As such, if you chose to copy (`sfb-toolkit components-copy`) both `HeaderAuxiliaryBar` and `Header` then you will not be able to delete the `HeaderAuxliaryBar` without selecting to also delete the `Header`. Nevertheless, it is possible to delete the `Header` without having to delete `HeaderAuxliaryBar`. An error will be shown to indicate this dependency: ``` [0_0_352] HeaderAuxiliaryBar........................[ERROR][DEPENDENCY_WITH_HEADER] ``` --- # Layout Management Layout Management is a feature available in Plaza theme that enables you to manage multiple components in a page container element. Through the page container element, you can add default components to your theme for any storefront page. Then, in the Theme Editor, a Marketplace Manager can add, delete, and reorder components inside the page container element. ## Example[​](#example "Direct link to Example") For example, you might want a `Carousel` and a `Slider` component on the home page. Inside your `home.html` file in the `content/pages/home` theme folder, you would add this tag element anywhere in your page: ``` ``` This element sets a page container section on the home page. Next, in the `settings.json` file of your current theme, specify which components you want to include in the page container section: ``` export const settings = { "pages" : { "home" : { "components" : { "Carousel:orderable:c06a8060-3014-49c8-80a4-18995de16c3c" : { "backgroundColor" : { "value" : "#fff", "type" : "COLORPICKER" }, "slides" : { "value" : [ { "contentType" : "IMAGE_WITH_TEXT", "slideData" : { "slideName" : "Product Demo", "buttonLabel" : "Request Demo", "title" : "AppInsights", "text" : "AppInsights provides real-time insights through visualization tools that will drive your company towards digital transformation", "image" : { "type" : "IMAGE_UPLOADER", "filename" : "AppInsights_image632x370.jpg", "url" : "https://d33na3ni6eqf5j.cloudfront.net/fdaaa076-7fe6-4f59-83a0-e8f76067f0ce/99348845-a0ba-4aeb-89ca-61eb426430f1.jpg" }, "textAlignment" : "left", "textSize" : "small", "slideLink" : "https://www.appdirect.com/products/appinsights/request-demo-appinsights", "imagePosition" : "right", "backgroundColor" : "#fff" } }, { "contentType" : "IMAGE_ONLY", "slideData" : { "slideName" : "Product Promotion", "title" : "One searchable view across all of your enterprise content", "text" : "Secured end-to-end and at rest with AES-256 bit encryption. Users can only search content they have permission to access.", "image" : { "type" : "IMAGE_UPLOADER", "filename" : "AppWise_image.jpg", "url" : "https://d33na3ni6eqf5j.cloudfront.net/5dd60cb8-8d15-4cec-b6bd-1a85ae666f76/05da8a68-5d65-40d3-a68e-a043e800989e.jpg" }, "textSize" : "medium", "slideLink" : "https://www.appdirect.com/products/appwise/features/integrations", "textColor" : "#fff", "imageSizing" : "fill", "backgroundColor" : "#707070" } } ], "type" : "SLIDES" }, "delay" : { "value" : "5", "type" : "DROPDOWN" }, "isDisplayCarets" : { "value" : true, "type" : "TOGGLE_CHECK" }, "isAutorotate" : { "value" : true, "type" : "TOGGLE_CHECK" }, "caretsColorTheme" : { "value" : "dark", "type" : "DROPDOWN" }, "isDisplayDots" : { "value" : true, "type" : "TOGGLE_CHECK" }, "isDisplayCaretsOnHover" : { "value" : true, "type" : "TOGGLE_CHECK" }, "height" : { "value" : "400", "type" : "DROPDOWN" } }, "Slider:orderable:906daff8-d299-42ba-b873-91bf4798ba69" : { "layout" : { "value" : "square", "type" : "RADIO" }, "productsList" : { "value" : { "contentType" : "dynamic", "queries" : { "sort" : "ALPHABETICAL" } }, "type" : "PRODUCTS_LIST" }, "maxRows" : { "value" : "2", "type" : "RADIO" }, "size" : { "value" : "small", "type" : "RADIO" }, "borderRadius" : { "value" : 8, "type" : "SLIDER" }, "quickviewDisplayOptions" : { "value" : [ "isScreenshotVisible" ], "type" : "CHECKBOX" }, "quickviewViewMode" : { "value" : "default", "type" : "DROPDOWN" }, "sliderTitle" : { "value" : "uieditor.home.Slider:orderable:906daff8-d299-42ba-b873-91bf4798ba69.sliderTitle", "isLocalized" : true, "type" : "INPUT" }, "sliderOptions" : { "value" : true, "type" : "TOGGLE" }, "tileBackgroundColor" : { "value" : "#EAEAEA", "type" : "COLORPICKER" }, "quickviewOptions" : { "value" : [ "isQuickviewVisible" ], "type" : "CHECKBOX" }, "displayOptions" : { "value" : [ "isDescriptionVisible", "isRatingsVisible" ], "type" : "CHECKBOX" }, "buttonLabel" : { "value" : "uieditor.home.Slider:orderable:906daff8-d299-42ba-b873-91bf4798ba69.buttonLabel", "isLocalized" : true, "type" : "INPUT" } } }, "orderableComponents" : [ { "name" : "Carousel", "id" : "Carousel:orderable:c06a8060-3014-49c8-80a4-18995de16c3c" }, { "name" : "Slider", "id" : "Slider:orderable:906daff8-d299-42ba-b873-91bf4798ba69" } ] } } } ``` As you can see, for each component that you want to add to the container, you need to follow this pattern for the component ID: `{componentName}:orderable:{uuid}` * **componentName**: The component exported name. * **uuid**: A generated UUID. You can generate whatever UUID you want. For example, to add a `Carousel` to the container, you can identify the component with this unique ID: `Carousel:orderable:c06a8060-3014-49c8-80a4-18995de16c3c` Finally, there is an `orderableComponents` array that you need to fill with the components that you want to manage in the container for a given storefront page. Make sure to use the same component ID that you declared previously for that page. Here is what the array would look like for the previous example: ``` "orderableComponents": [ { "name": "Carousel", "id": "Carousel:orderable:c06a8060-3014-49c8-80a4-18995de16c3c" }, { "name": "Slider", "id": "Slider:orderable:906daff8-d299-42ba-b873-91bf4798ba69" } ] ``` ## Integration with the Theme Editor[​](#integration-with-the-theme-editor "Direct link to Integration with the Theme Editor") In order to manage the layout with the Theme Editor, you need to package the theme using `sfb-toolkit package`. Then, upload the theme .zip file with the Theme Manager so you can customize it with the Theme Editor. As you can see below in the screenshot, in the components list on the home page you see the components that you set as default for the `PageOrderableContainer` in the `settings.json` file. They are easily identified with a drag handle icon because those components can be reordered between them. When a page contains a `PageOrderableContainer` section, an "Add" icon appears in the top right of the components list. This means that you can add more components to the `PageOrderableContainer` section. Finally, when you hover the mouse over an "orderable" component, a trash icon appears, which indicates that you can delete the component. ![](data:image/png;base64,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mLLloMzeecRjk/Z3qav7C45a6HYceZC3den8CY5dd0V9Rq3bI7fnzqLHT7gGvnIEEFP+KwkeUoKKPWwkWaDCKU4//vijDBw4UNKlSyfNmjWTXLlyyb59+1Q4unXrJsOGDZNSpUrJ7t27pUePHnLq1CmpU6eOFClSRM6cOSM//fST9OvXT55++ml59NFH3U4bAmQXqIULF1ppjBhaO1wrEKTs2bOrV7F8+XKt/8iRI3rzJqUNKGPevHluAuisG0ILUbZb2rRp7Zty/fp1ef/99+XTTz9VAcVBezm1a9eWcuXKaZ5Fixaph1m5cmUVWuwsVKiQfP755zJhwgTB/nr16qk44xpMnjxZ84E5LXoJTNy832vjUqTw3UlCXqdAzdp5VNAtm978Dik19icZuW6vvHTnP04BKntl6Z/y6fq9ct6VrqMr8G43dA87zlsvM7Yflhzp00j9wjnthxO1niSBCqc44X/+d955R65evSojRoyQsmXLWidUsmRJmTp1qixYsEAFCt7GiRMnBN5R27ZtrXRPPPGE/Otf/5KRI0dKpUqVEngXmTNnlh07dqhnhvJwgy9evFiyZcumQmcVYltBWcWKFdM9q1atkl69egluYHgXSWkDPJIPP/xQ4EmhXm9WpkwZy7PzlgZloUs2ceJE6dChg1uyJ5980tq3YcMGFaj7779fmjRpYu3/+OOPdf2OO+6QFi1a6Pq9994rEG5f7bMK4EpECSxzjdZ5M9comLdDut9T3g9X75JqrhG/olkzSNsyBWTI7zsSCNQHq3bK/1++XVqUzCu35cos7/22I0EdbWatlh92H5OelYtqt27i5gMJjidmw7e8eigpnOKE6hBvQvcqf/78CcQJxyBCkyZNki5duqg3gxsThv/17ZYjRw4VJngSmzdvth8S0+2DFwWD4MADq1WrVoJ03jZMnVmyZElyGx566CGtE10zX7Z37175+uuvE3wgMnaDgN96663qAe3atct+KOD1KlWqaNoxY8aoyI0aNUrgIT7yyCPywAMPBFwOE958AuevXhOM3tkN3brrPRvrJ59rpA4fs226fCY98qIMYwicz911VDpXKKy7OlcoJIfPX1bBMWnedwkSxOnbplXkreql5TuXp2XskCvONNvlgX1Yt5wMuresjG9cUXpVKWoOJ3qZJA/KXksKSWHfDHp9//4b7mrevHl9lnXg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) In summary, layout management is a powerful feature in the Plaza theme. It enables Marketplace Managers to dynamically add components in the Theme Editor if the theme developer has set a `PageOrderableContainer` element in the page. Also, Marketplace Managers can reorder and delete components. --- # Default Component Theme Settings In the `settings.json` file in your Plaza theme, you can set default components with their [schema](/storefront/how-tos/components/storefront-custom-components-layout.md#schema) form setting values to use for every storefront page. Your storefront pages are filled with default components based on which `component` or `PageOrderableContainer` tag elements you provided in your theme. ## Example[​](#example "Direct link to Example") For example, in the `profile.html` file in the `content/pages/profile` folder of your current theme (that is, the profile page), you set up the page with the `ProductBanner` and a `PageOrderableContainer` that will contain `ProductDescription`, `ProductReviews`, and `ProductTopFeatures` components. Please note that a `PageOrderableContainer` tag allows you to define a [layout management](/storefront/how-tos/components/storefront-custom-components-layout.md) container where you can set component(s) that can be managed in the Theme Editor. ``` ``` In the `settings.json` file, you can fill in some schema form setting values for each component. All you have to do is follow this JSON structure: ``` { "pages" : { "profile" : { "components" : { "ProductDescription:orderable:d7254b33-ac88-4945-a248-edf6a87a2b16" : { "isAddonsVisible" : { "value" : true, "type" : "TOGGLE" }, "isPricesVisible:orderable:83a7e00c-b3d5-4d64-8919-a9cb3fa2d5b3" : { "value" : true, "type" : "TOGGLE" }, "layout" : { "value" : "horizontal-thumbnails", "type" : "DROPDOWN" } }, "ProductReviews:orderable:7c059217-1dbc-4b75-a6ee-a7ca740facd6" : { "isAvatarVisible" : { "value" : true, "type" : "TOGGLE" }, "position" : { "value" : "right", "type" : "DROPDOWN" } }, "ProductTopFeatures:orderable:59db9f73-9caa-48b2-9df9-da98413e7de8" : { "numberOfColumns" : { "value" : "two", "type" : "DROPDOWN" }, "withImages" : { "value" : false, "type" : "TOGGLE" } }, "ProductBanner" : { "bannerBackgroundColor" : { "value" : "#ffffff", "type" : "COLORPICKER" }, "descTextSize" : { "value" : "medium", "type" : "DROPDOWN" } } }, "orderableComponents" : [{ "name": "ProductDescription", "id": "ProductDescription:orderable:d7254b33-ac88-4945-a248-edf6a87a2b16" }, { "name": "ProductReviews", "id": "ProductReviews:orderable:7c059217-1dbc-4b75-a6ee-a7ca740facd6" }, { "name": "ProductTopFeatures", "id": "ProductTopFeatures:orderable:59db9f73-9caa-48b2-9df9-da98413e7de8" }] } } } ``` You can also have the ability to specify the children components of a component in the `settings.json` file. For example, the `Header` component which is set in the `global` scope is comprised of multiple bar components. For each child component you can specify their default settings. ``` { "pages" : { "global" : { "components" : { "Header" : { "components": { "AnnoucementBar:orderable:a34bf07d-1553-4e7d-86aa-c9ed2df75685": { "announcementBarMessage": { "value": "Announcement Bar", "type": "TEXTAREA", }, "announcementBarHeight": { "value": 10, "type": "SLIDER" } }, "AuxiliaryBar:orderable:a34bf07d-1553-4e7d-86aa-c9ed2df75686": { "auxBarHeight": { "value": 30, "type": "SLIDER" }, "displayLanguageSwitcher": { "value": true, "type": "TOGGLE" } }, "MainBar:orderable:a34bf07d-1553-4e7d-86aa-c9ed2df75687": { "logoHeight": { "value": 30, "type": "SLIDER" }, "displayCart": { "value": true, "type": "TOGGLE" } }, "PrimaryNavBar:orderable:a34bf07d-1553-4e7d-86aa-c9ed2df75688": { "navBarPadding": { "value": 5, "type": "SLIDER" }, "navBarBackgroundColor": { "value": "#EAEAEA", "type": "COLORPICKER" } } }, "orderableComponents" : [{ "name": "AnnoucementBar", "id": "AnnoucementBar:orderable:a34bf07d-1553-4e7d-86aa-c9ed2df75685" }, { "name": "AuxiliaryBar", "id": "AuxiliaryBar:orderable:a34bf07d-1553-4e7d-86aa-c9ed2df75686" }, { "name": "MainBar", "id": "MainBar:orderable:a34bf07d-1553-4e7d-86aa-c9ed2df75687" }, { "name": "PrimaryNavBar", "id": "PrimaryNavBar:orderable:a34bf07d-1553-4e7d-86aa-c9ed2df75688" }] } } } } } ``` Finally, with the `settings.json` file, you can set the default content of your menus that can be consumed by your component. ``` { "menus": { "FOOTER_MENU": { "menuType": "MENU_LINK", "menu": [ { "uuid": "50b2a008-d1df-42fa-9bdf-17a8446210d6", "title": { "value": "Company", "isLocalized": true, "type": "INPUT" }, "link": { "value": "http://test?locale=en-us", "isLocalized": true, "type": "INPUT" }, "type": "CUSTOM_LINK", "openInNewTab": true, "isVisible": true, "isDisabled": false, "children": [ { "uuid": "89b4d743-b405-43a0-b6ab-9877fcdee455", "title": { "value": "Overview", "isLocalized": true, "type": "INPUT" }, "link": { "value": "http://test?locale=en-us", "isLocalized": true, "type": "INPUT" }, "type": "CUSTOM_LINK", "openInNewTab": false, "isVisible": true, "isDisabled": false }, { "uuid": "e96e3929-2bea-4283-8139-9fee0053487c", "title": { "value": "Careers", "isLocalized": true, "type": "INPUT" }, "link": { "value": "http://test?locale=en-us", "isLocalized": true, "type": "INPUT" }, "type": "CUSTOM_LINK", "openInNewTab": false, "isVisible": true, "isDisabled": false }, { "uuid": "03a90d85-ce76-4ba6-bafb-88abdd8e1bc6", "title": { "value": "Contact", "isLocalized": true, "type": "INPUT" }, "link": { "value": "http://test?locale=en-us", "isLocalized": true, "type": "INPUT" }, "type": "CUSTOM_LINK", "openInNewTab": false, "isVisible": true, "isDisabled": false } ] } ] } } } ``` In the [Layout Management](/storefront/how-tos/components/storefront-custom-components-layout.md#layout-management) section, we will explain to you how you can leverage the `settings.json` file to fill the `PageOrderableContainer` tag element with some default component(s). --- # Styling components We follow the BEM methodology to structure our CSS. Each React component has styles defined in its own .scss file and imported in the component file: `import './styles/MyComponent.scss';` The styles for a component are always namespaced with the component's namespace through use of the `namingTools.js` util: `const n = createNamespace('MyComponent');` You can then use this namespace `n` to attach classes and modifiers to any HTML element that needs it within the component. To do so, prefix the camel-case inflexed namespace to an identifier: `
` results in `
` The SCSS would look like this: ``` .myComponent { &_someElement { margin-bottom: 20px; } } ``` Note that the `n` function always returns an object. Ensure that the `props` property is spread within the element's props to apply. ### Modifiers[​](#modifiers "Direct link to Modifiers") Add different modifiers to an element's classes through the second argument of the naming tools: `
` results in `
` The argument can also be an array of modifiers: `
` results in `
` ### CSS Variables[​](#css-variables "Direct link to CSS Variables") Some values cannot be known at compile time, so you have to make them accessibe to stylesheets at runtime. For example, styling values that come from user settings are only available at runtime and are not known at compile time. To pass these values to the component, you can use CSS variables, built with the help of the namespacing tool's `withVariables` method. `withVariables` takes a single argument that consists of an object of variableName => value props that will be built as CSS variables styles. `
` would result in: `
` In SCSS, the variables can be used like this: ``` .myComponent { &_someElement { margin-bottom: var(--foo); div { color: var(--bar, #000); } } } ``` *We recommend that you only use CSS variables in lowercase to ensure that the tests can capture the variables. If multiple-word variable names are necessary, use kebab-case.* ### Additional classes[​](#additional-classes "Direct link to Additional classes") If it is necessary to add supplemental classes to an element outside of the BEM structure, use the `withClass` method of the naming tools, which takes an array of class names as arguments and adds them to the generated BEM class names: `
` results in: `
` ## Global variables and mixins[​](#global-variables-and-mixins "Direct link to Global variables and mixins") Some of the basic styles of the theme can be modified by global user settings, set through a form available in the admin interface. Therefore, these values cannot be hardcoded in the component's SCSS but come from global CSS variables injected by the system. We recommend that you always use the mixins that use these variables whenever possible in order to benefit from the user settings. Mixins are in the files located in `src/styles/definitions`. ### Text[​](#text "Direct link to Text") Text dimensions and fonts are set through global settings, and you can attach their properties to an item with the appropriate mixins. For example, to make an element look like the level 1 title, you can do something like this: ``` .myComponent { &_title { @include title-1; } } ``` If the user changes the text size through admin settings, this title would follow the correct user-defined styles because the mixin uses the CSS variables that contain these settings. ### Colors[​](#colors "Direct link to Colors") The component's theme is built using a limited set of colors that are centralized in the `src/styles/definitions/_colors.scss` file. Basically, the theme consists of: * **body color**: regular text color * **title color**: regular title color * **link color**: regular link color * **primary color**: the theme's main, most prominent color * **secondary color**: a color that complements the primary color * **emphasis color**: a color that is applied to elements that should stand out, for example calls to action * **emphasis color alt**: a color that is applied to elements that should stand out, but in opposition to emphasis elements SCSS variables are set to hold these values for reuse across the component's SCSS files. These SCSS variables get their values from CSS variables, and default to hardcoded values. We recommend that you not introduce supplemental colors and that you use the ones defined in the theme to ensure consistency, but also to avoid clashes with potential user-defined colors. Some of these colors also have variations: a lighter shade to use as hovers, and a darker shade to use for active elements. These variations are also set in variables, and are precomputed from the original color, whether the default or user-defined. There should not be any hardcoded color values anywhere in the component's SCSS. **All color values should come from variables set in the `_colors.scss` file, or from user-defined values that come from the component's schemas.** Some other hardcoded colors exist in the colors file that can be used in components, but are mostly functional. For example, an error color (red by default) can be used to display errors in a standard way. ## Responsive[​](#responsive "Direct link to Responsive") ### CSS[​](#css "Direct link to CSS") There are predefined breakpoints in the SCSS mixins in the `src/styles/definitions/_breakpoints.scss` file, which you should used whenever responsive is necessary. There are breakpoints for small mobile up to large desktop displays. Generally, design is approached in a responsive way, in that the original integrations are made for desktop and then adapted for mobile. The breakpoints available in CSS are `xxs`, `xs`, `sm`, `md`, `lg`, `xl` and `xxl`. ### JSX[​](#jsx "Direct link to JSX") Sometimes responsiveness cannot be achieved merely by CSS, such as when developing components for use in different containers whose sizes are not entirely dependent on the window size. For example, a component container might be 50% of the grid width in some cases and 100% in others. Because components are encapsulated and should rely as little as possible on their parents or context to be displayed correctly, it is sometimes necessary to respond to a component's rendered dimensions. Several custom hooks exist to measure an element's dimensions, located in `/src/tools`. You can pass the values computed by these hooks to CSS with variables through the namespace's `withVariables` method, or use them to add BEM modifiers to elements. In other cases, it is possible to use these values to completely change a component's rendered output. #### `useResponsive` hook[​](#useresponsive-hook "Direct link to useresponsive-hook") The `useResponsive` hook reproduces the behavior of the SCSS breakpoints, but in JavaScript so that the components can act according to these breakpoints. For example, a component might need to render something else entirely depending on breakpoints. The breakpoints used in JS should be the same ones as, or a subset of, those in CSS for the app to be consistent, and therefore they are centralised in a hook. The hook listens to changes in screen dimensions and responds with booleans for each of the set breakpoints that indicate whether they apply. The breakpoints used in JS are `small`, `medium`, `large`, `xLarge`. The hook outputs an object with each breakpoint, which changes whenever the screen dimensions change: ``` { smallDown: false, smallUp: true, mediumDown: false, mediumUp: true, largeDown: true, largeUp: false, xLargeDown: true, xLargeUp: false } ``` You can use it in a component like this: ``` const { mediumUp } = useResponsive(); const someRender = mediumUp ?
The screen is larger than medium
: null; ``` --- # Uninstall Custom Components ## Uninstall custom components (manual steps)[​](#uninstall-custom-components-manual-steps "Direct link to Uninstall custom components (manual steps)") To stop using custom components and use instead the CDN version of [@appdirect/sfb-theme-components](https://www.npmjs.com/package/@appdirect/sfb-theme-components) (instead of the `npm` module one) please follow these steps: In the base.html file replace: ``` ``` with ``` ``` *** ``` ``` with ``` ``` In the theme folder: * Delete the `customComponents` folder. * Using a terminal execute `npm uninstall @appdirect/sfb-theme-components --save`. ``` npm uninstall @appdirect/sfb-theme-components --save ``` --- # Update UI library caution There is a possibility that some custom components might not be compatible with our latest UI library. Please see **[here](/storefront/reference/custom-components/custom-components-risks.md#manually-updating-the-ui-library)** for more details on the risks. ## Update UI library (manually)[​](#update-ui-library-manually "Direct link to Update UI library (manually)") When `sfb-toolkit components` is executed a **specific version** of `sfb-theme-components` will be installed as part of your theme and will not change. This is done to ensure that the expected behaviour is not changed through future updates. As such, the installed `sfb-theme-components` library version is effectively `fixed`. To update the `sfb-theme-components` library you can simply execute the following command: ``` sfb-toolkit install @appdirect/sfb-theme-components@latest ``` A prompt will be displayed that will need to be accepted before you can proceed with the update. tip * Please write down the @appdirect/sfb-theme-components **version** mentioned in the prompt message in case you encounter any issues and might need to revert the update. * If you do not see a prompt your toolkit version might be outdated. Please update to the latest toolkit version. To revert back to the previous UI library version you can execute the below command where `version` represents the previously written down npm package version number. ``` sfb-toolkit install @appdirect/sfb-theme-components@version ``` --- # Using the Marketplace Data As you create and edit your theme in the text editor, you can view existing page data in the developer tool, in order to populate your page objects with real data and see what your storefront will look like in production. The data can include information about meta tags, locales, products, UI elements, and other items. After you save your changes to your project in the text editor, you can view edits (such as new meta tags) in the browser. Additionally, global information (such as the current user locale) and specific information (such as FAQ information) are available for developers to view. To view data 1. Start the Toolkit and view the page in your browser. 2. Click **Data Viewer** in the toolbar (see Use the developer toolbar). The Data Viewer expands and displays the following sections, which reflect the basic structure of your page. note You can request additional data on a page with a custom `block` tag. See Customized data for details. ## Configuration[​](#configuration "Direct link to Configuration") The `config` section in the Data Viewer includes a list of configurations, such as the available currency, country code, locale, and so on. ``` config: { currency: 'USD', locale: { "current": "English (United States)", "code": "en-US", "available": [ { "value": "en-US", "label": "English (United States)" }, ... ] } raw_channel_settings: {...channel-settings-object}, logo: "http://mymarketplace.com/logo.png" }, ``` Example usage in your template: ``` {{ config.local.code }} ``` ## Global information available (meta)[​](#global-information-available-meta "Direct link to Global information available (meta)") The `meta` section includes information used for meta tags (see Create meta tags), which helps with search engine optimization (SEO). Additionally, you can view global data in the page. ``` { meta: { title: 'Page Title', description: 'Page Description', author: 'Your Company Name', url: [Current URL], image: 'Company logo or product Image', card: 'Recommended twitter card' } } ``` You can target the data available using the double bracket. For example: ``` {{ meta.title }} ``` ## External API calls (external)[​](#external-api-calls-external "Direct link to External API calls (external)") The `external` section integrates external data from any public API with a template, which can be useful if, for example, you need data from your Content Management System (CMS) to be available in your storefront. The following section includes information from external APIs. ``` { external: { external_weather: { temperature: '25C', ...otherDataFromApi } } } ``` For more information see External. ## Product list (productLists)[​](#product-list-productlists "Direct link to Product list (productLists)") You can view a list of products available on the page in `productLists`. ``` "productLists":{5 items "custom_lists":{}0 items "custom_apps":{}0 items "popularapps":[...]10 items "staffpicks":[...]5 items "featuredapps":[...]6 items } ``` This example shows products that are available on the Home page. Different product lists appear depending on the page you are viewing. For example, `productreviews` appears for the product profile pages. ## Localization (i18n)[​](#localization-i18n "Direct link to Localization (i18n)") A list of localized words on the page appears in `i18n`. The list is updated in the Data Viewer when you view a different page. If you change the language of the page, for example to German, the list of words in the Data Viewer appears in that language. ``` "i18n":{ "BillingAndDistribution":"Billing and Distribution" "Home":"Home" "Insights":"Insights" "List.all.apps":"See all my apps" "Manage":"Manage" "Marketplace":"Discover Apps" "My.Apps":"My Apps" "My.Company":"My Company" "My.Profile":"My Profile" "Teams":"Teams" "channel":"Marketplace" "corporate":"Network" "find.applications":"Find Applications" "find.product.line.applications":"Find {0} Applications" "logout":"Logout" "my.settings":"My Settings" "reseller":"Reseller" "sign.in":"Log In" "sign.up":"Sign Up" "Contact":"Contact" "Call.us.toll.free":"Call us toll free:" "Powered.by.AppDirect":"Powered by AppDirect" "help.center":"Help Center" "custom":{...}6 items ``` ## User interface (UI)[​](#user-interface-ui "Direct link to User interface (UI)") The `ui` section includes information related to page elements. For example, developers can include the search bar or a footer that can contain links to technical support or the privacy policy. ``` "ui":{ "faqs":{...} "navigator":{} "searchBar":{...} "footer":{...} "secondaryNav":{...} } ``` --- # Customize Marketplace Data You can configure your theme templates to request additional data. For example, suppose you want a page on your storefront to include a customized slider of four products. You can request the information associated with those products, view the information in the Data Viewer of the developer tool, and then add them to your template using CSS. Currently, the data included in the templates pulls basic information from your marketplace to help you get started on your theme (see Use AppDirect data). This topic includes the following types of custom data that are available for developers to retrieve information, view in the Data Viewer, and add to their template: * [Application](#application)---Returns the data of a specific application. * [List](#list)---Returns a list of applications associated with categories, filters, attributes, and search queries. * [FAQ](#faq)---Returns the Frequently Asked Questions (FAQs) list. * [Navigator](#navigator)---Returns the categories list. ## Application[​](#application "Direct link to Application") Complete the procedures in this section to search for data associated with an application, add the data tag to your theme template, and then view the customized data. To search for data associated with an application 1. Start the Toolkit. 2. Click **Search Data** in the developer toolbar. The Search Data bar appears and Apps is selected by default in the drop-down list. 3. Type a search string. Application names appear. 4. Click the desired application and the following information appears: * Integration---Data tag that you can add to your theme template to view information about the application. * Raw data---Information pulled from the page objects service. To add the data tag to your theme template 1. Copy the data tag in the Integration section in the Data Viewer. For example: ``` ``` 2. Open your project in your text editor and find the template file that you want to include the additional data. 3. Paste the data tag between `{% block data %}` and `{% endblock %}`. The following example shows the application, Dropbox, added to the template. ``` {% block data %} {% endblock %} ``` 4. Save your \*.html file in your text editor and refresh the browser that is running the developer tool. The data now appears in the Data Viewer of the developer tool. To view the customized data 1. Click the **expand icon** in the developer tool. 2. Click **Data Viewer > productLists > custom\_apps**. The product information appears. The following example shows information about the *Dropbox* product. ``` "productList": { custom_apps: { "custom_apps_dropdox": { "href": "https://marketplace.appdirect.com/api/marketplace/v1/products/417", "id": 417, "uuid": "61f2f340-ae52-11e3-ac06-22000a1dd446", "url": "https://marketplace.appdirect.com/apps/417", "name": "Dropbox", "productType": "WEB_APP", ... } } } ``` Developers can view the additional data about the product and add it to their template. For example, a developer can add the *Dropbox* product to a slider in the storefront: ``` {% set dropbox = productList.custom_apps.custom_apps_dropdox %}

{{ dropbox.name }}

{{ dropbox.description | truncate(50) }}

``` ## List[​](#list "Direct link to List") Complete the procedures in this section to search for a list of applications associated with categories or attributes, add the data tag to your theme template, and then view the customized data. To search for a list of applications associated with categories or attributes 1. Start the Toolkit. 2. Click **Search Data** in the developer toolbar. The Search Data bar appears and Apps is selected by default in the drop-down list. 3. Click the drop-down list and select one of the following: * Categories---Organizes products using two organizational levels for grouping products. * Attributes---Organizes products using inherent characteristics of a product. 4. Type a search string. Category or attribute names appear, depending on your selection in the previous step. 5. Select the category or attribute. The following information appears: * Integration---Data tag that you can add to your theme template to view information about the list of applications associated with that category or attribute. * Raw data---Information pulled from the page objects service. To add the data tag to your theme template 1. Copy the data tag in the Integration section in the Data Viewer. For example, ``. 2. Open your project in a text editor and find the .html file in which you want to include the additional data. 3. Paste the data tag between `{% block data %}` and `{% endblock %}`, which are included in your template. The following example shows the `mobility` attribute added to the template. ``` {% block data %} {% endblock %} ``` You can use reductive filtering by combining filters, attributes, and categories. Additionally, you can use multiple IDs in the same option separated by commas. For example: ``` ``` You can sort the lists using the following methods: * `RELEVANCE` The default order of the application. * `ALPHABETICAL` Application names appear in order from A to Z. * `POPULARITY` Applications with the most active subscriptions appear first. * `NEWEST_FIRST` Newest applications appear first. * `RATING` Highest rated applications appear first. 4. Save the .html file and refresh the browser that is running the developer tool. The data appears in the Data Viewer. To view the customized data 1. Click the **expand icon** in the developer tool. 2. Click **Data Viewer > productLists > custom\_lists**. The information for a list of products associated with a category or attribute appears. The following example shows information about the `mobility` attribute. ``` "productLists": { custom_lists: { "custom_lists_mobility": [ { "href": "https://marketplace.appdirect.com/api/marketplace/v1/products/417", "id": 417, "uuid": "61f2f340-ae52-11e3-ac06-22000a1dd446", "url": "https://marketplace.appdirect.com/apps/417", "name": "Yast Time Tracker", "productType": "WEB_APP", ... }, ...Other apps ] } } ``` Developers can view the additional data about categories or attributes and add it to their template. For example, the developer can add products associated with the `mobility` attribute to one of the sliders in the storefront by adding the following snippet of CSS to one of the .html files. ``` {% for app in productLists.custom_lists.custom_lists_mobility %}

{{ app.name }}

{{ app.description | truncate(50) }}

{% else %}
No apps here
{% endfor %} ``` ## FAQ[​](#faq "Direct link to FAQ") You can request the Frequently Asked Questions (FAQ) list by adding the following `block` tag to your one of your .html files: ``` {% block data %} {% endblock %} ``` Information from the FAQ is available in the Data Viewer section of the developer tool. ``` "ui": { "faqs": [ { "name": "Frequently Asked Questions", "faqs": [ { "question": "How do I purchase an application through the AppDirect marketplace?", "answer": "In order to purchase an application, please visit the Application Marketplace and click on the profile of the application you would like to purchase. From the product profile, you can either select a free trial or drill down to the Editions and Pricing to select a subscription level that best suits your needs." }, { "question": "As an ISV, how do I list my product with AppDirect?", "answer": "In order to list your product with AppDirect, please visit the AppDirect Developer Portal to learn about our API and click-on "Integrate Now" to begin your integration. Please reach out to us at developer@appdirect.com should you have any additional questions." } ] } ] } ``` Developers can add information from the FAQ list to their template. The following example shows the FAQ added to the Home page: ``` {% block data %} {% endblock %} {% block content %}
{{ hero() }}
{{ slider("Featured Apps", productLists.featuredapps, i18n) }}
{{ slider("Popular Apps", productLists.popularapps, i18n) }}
{{ homeFaq(ui.faqs.items[0], ui.faqs.l10n) }}
{{ sliderScript() }} {% endblock %} ``` In this example, the `homeFaq` macro (at `themes/themeName/content/macros/home-faq.html`) was imported into the file. ## Navigator[​](#navigator "Direct link to Navigator") You can request the category list (navigator) by adding the following `block` tag to your one of the .html files: ``` {% block data %} {% endblock %} ``` Information from the category list becomes available in the Data Viewer section of the developer tool: ``` "ui": { "navigator": { "attributeGroups": [ { "id": 33, "name": "App Collections", "showOnNavigation": false, "vendorTaggable": true, "attributes": [ { "id": 73, "name": "Bundles", "queryAlias": null, "numTaggedProducts": 11 }, { "id": 74, "name": "Deals", "queryAlias": null, "numTaggedProducts": 15 } ] } ], "categories": [...] } } ``` Developers can add information from the category list to their theme template. The following example shows the category list added to the Home page: ``` {% block data %} {% endblock %} {% block content %}
{{ navigator(ui.navigator) }}
{{ hero() }}
{{ slider("Featured Apps", productLists.featuredapps, i18n) }}
{{ slider("Popular Apps", productLists.popularapps, i18n) }}
{{ sliderScript() }} {% endblock %} ``` --- # Managing Data with Multiple Marketplaces Theme developers sometimes have to work with marketplaces that has different environments, such as one for staging and another for production. In such cases, product IDs for the same products might differ by environment, so if you specify default data in custom templates (see Customized data), you might have to update the template whenever you upload new themes to the marketplace. If you work in a multiple-environment scenario, you can use a JSON file to specify environment-specific values, such as product IDs, and thereby avoid manual updates to custom data. In the *env-data.json* file, located in the theme root folder, specify the following information: * A full or partial marketplace path for each environment. * A list of attribute key/value pairs for each environment. You can retrieve the desired data in the data viewer. See Use the developer tool bar. You must specify the `name` and `type` attributes, as well as the item IDs. The Storefront Toolkit attempts to match the `name` values specified in the file with corresponding attribute names in the `` tag in the theme. If there is no match (for example, the `name` value does not exist or the marketplace path is incorrect), the default marketplace values are used. The following examples demonstrate the correct format to use. ## Example: Two environments[​](#example-two-environments "Direct link to Example: Two environments") In the following example, the product IDs in the hero slider are different for the production environment (at *marketplace.sample.com*) and testing environment (at *testmarketplace.sample.com*). ``` { "https://marketplace.sample.com": [ { "name": "hero", "type": "list", "products": "185242,97079" } ], "https://testmarketplace.sample.com": [ { "name": "hero", "type": "list", "products": "122221,119048" } ] } ``` ## Example: Multiple subdomains[​](#example-multiple-subdomains "Direct link to Example: Multiple subdomains") The following example includes the *sample.com* domain as well as two subdomains. If there are numerous subdomains (for example, test environments), you can specify *part* of a domain to match. In this case, the *sample.com* product IDs would be used for all subdomains *except* the two full domains specified here. ``` { "https://marketplace.sample.com": [ { "name": "hero", "type": "list", "products": "185242,97079" } ], "https://testmarketplace.sample.com": [ { "name": "hero", "type": "list", "products": "122221,119048" } ], "sample.com": [ { "name": "hero", "type": "list", "products": "168,47" } ] } ``` In this example, *beta.sample.com*, *staging.sample.com*, and *test.sample.com* would all use product IDs 168 and 47. important When you specify multiple paths, complete paths take precedence over partial paths. In the example above, `https://marketplace.sample.com` would return the product values `"185242,97079"` instead of the values specified for `sample.com`. --- # Import a theme This guide provides instructions on how to import a theme into your workspace folder using the toolkit. The theme should be in a .zip file format and located in your workspace folder. ## Prerequisites[​](#prerequisites "Direct link to Prerequisites") Before you begin, ensure you have the following: * You have the toolkit installed and accessible in your terminal. If this is not the case, refer to the [toolkit installation](/storefront/storefront-installation.md) guide for instructions on how to install it. * You have an existing workspace folder already setup. If you don't have a workspace folder, refer to the [Set up your workspace](/storefront/storefront-installation.md#set-up-your-workspace) section for instructions on how to set it up. * A theme .zip file in your workspace folder. If you don't have a theme .zip file, refer to the [Downloading a Theme](#downloading-a-theme) section for instructions on how to download one from your marketplace. ## Importing a Theme[​](#importing-a-theme "Direct link to Importing a Theme") Follow these steps to import a theme: 1. Open your terminal. 2. Change your current directory to your workspace folder. This is also the folder where your theme .zip file should be located. 3. Run the `sfb-toolkit` command with the `import` option, followed by the path to the .zip file, the marketplace path, and the theme name: ``` sfb-toolkit import [pathtozip] [marketplacepath] [themename] ``` Replace \[pathtozip], \[marketplacepath], and \[themename] with your specific values. The theme will be imported into the `/themes` directory in your workspace folder after the command executes. ## Example[​](#example "Direct link to Example") For instance, if your theme .zip file is `mytheme.zip`, your marketplace path is `mymarketplace.com`, and you want your theme to be named `mynewtheme`, the command would be: ``` sfb-toolkit import mytheme.zip mymarketplace.com mynewtheme ``` After running this command, you can find the imported theme in the `/themes/mynewtheme` directory. ## Downloading a Theme[​](#downloading-a-theme "Direct link to Downloading a Theme") If you don't have a theme .zip file, you can download one from your marketplace by following these steps: 1. Log in to your marketplace with a user account that has the marketplace manager role. 2. Go to the `/branding/themes` page. 3. Locate the theme you want to download. Click on the menu icon (represented by three vertical dots) in the theme's row and select `Download version`. This action will open a new page. 4. Click on the Download button on the newly opened page once your theme .zip file is ready. Ensure you download the theme into your workspace folder. After downloading the theme, you can proceed with the importing steps. --- # Themes and Localization Your marketplace may be configured to support different languages for localization. If this ability has been enabled, you can prepare and deploy translations for your storefront by creating YAML locale files in the theme */translations* folder. A YAML locale file is a `.yml` file that contains a set of translations for the text strings used in a theme template file. All files must be in [YAML](http://yaml.org/) format and a separate locale file is required for every language. You must ensure that your account representative has configured your marketplace to support different languages. If you add localization files to your theme, it does *not* automatically enable different languages for your marketplace. Additionally, each theme must include its own list of localization files, because they cannot be shared across themes. After you create and test the translations locally with the Storefront Toolkit, you can upload them to the marketplace with . See Manage theme translations for more information. Localization file requirements * Add the files to the `themes/themeName/translations` folder. * The format of the file name must use the language (two-letter ISO 639-1 code) and country (two-letter ISO 3166-1 code) codes with the `.yml` extension (for example, the localization file name for the French language in Canada is `fr-ca.yml`). Localization formatting requirements * `formatMessage`---The utility uses to handle different string states, which are [variable](#usage-with-variable) and [plural](#usage-with-plural). This utility works with ICU-style message syntax for variables and plurals. * `i18n.custom.home.startingat`---This is an example of our string path. All strings that come from the theme start with `i18n.custom`. ## Usage example[​](#usage-example "Direct link to Usage example") The `.yml` file must contain translations in the following format: ``` : : ``` For example, the following translation appears in the `en-us.yml `file: ``` home: welcome: Welcome my friend ``` The following example shows how the string appears in your theme template: ``` {{ t(i18n.custom.home.welcome) }} ``` ## Usage with variable[​](#usage-with-variable "Direct link to Usage with variable") The `.yml` file must contain translations in the following format: ``` : : ``` For example, the following translation appears in the `en-us.yml` file: ``` home: startingat: The product {productName} costs {startingPrice}. ``` You can embed variables in the localized value. After the localized value is used, you can specify the variable value. The following example shows how the string appears in your theme template: ``` {{ formatMessage(t(i18n.custom.home.startingat), {price:price}) }} ``` ## Usage with plural[​](#usage-with-plural "Direct link to Usage with plural") The `.yml` file must contain translations in the following format: ``` : : ``` For example, the following translation appears in the `en-us.yml` file: ``` home: comments: Posted {num, plural, one{# comment} other{# comments}} ``` The following example shows how the string appears in your theme template: ``` {{ formatMessage(t(i18n.custom.home.comments), { num: 2 }) }} ``` The tool uses FormatJS, a message formatting tool. See the [FormatJS documentation](https://formatjs.io/docs/core-concepts/icu-syntax/) for more information. --- # Customize Storefront Themes Labels The YAML locale files are primarily intended for localization, so you can translate the strings and labels of your theme into different languages, as described in the Create theme translations topic. However, you can also use a YAML file to override some labels, as determined by your base theme: * **Plaza**. You can override both "Call to Action" button text (e.g. "Buy now!"), and any i18n object strings. * **Classic**. You can override the text used on "Call to Action" buttons. To do this you must add an "i18n.overrides" section for the overrides to your YAML file, with a line for each item to be overridden. The line for each item to be relabeled must identify the item according to where it fits in the Data scheme (see Use AppDirect data). You can use the Data Viewer in the developer toolbar to find the item. Examples of how to do this are provided below. ## Customize an i18n object string[​](#customize-an-i18n-object-string "Direct link to Customize an i18n object string") To customize an i18n object string in a Plaza based theme, add a new "i18n.overrides" section to your YAML file, and include a line that names the data object to be overridden. For example, suppose you want to change the "Features and Benefits" label for an application in the default US English labels of a Plaza based theme to say "Top features" instead. In the storefront display, you navigate to the page where the label appears, and use the Data Viewer to find the i18n object that corresponds to that label. You would begin at the root, and expand items until you find the object you want under an i18n branch. ![](/assets/images/override_label_1_1790x857-640ea8271edca2f084131023d7bf04cc.png) You then open the YAML file (in this example, en-us.yml) and add a new "i18n.overrides" section with the new label assigned to the "application.overview\.i18n.featuresAndBenefits" object: ![](/assets/images/override_label_2-e2aaaff53bc898a6f5f6c7c07cd9a02c.png) Finally, you save the change. The next time you refresh the browser display, the new label appears. ## Customize a call to action label[​](#customize-a-call-to-action-label "Direct link to Customize a call to action label") Similarly, you can customize the label that appears on a "Call to Action" button. A "Call to Action" button is any button on a product page that can be seen as advancing the end customer's path to a purchase. This includes buttons that lead directly to checkout (e.g. "Buy Now"), or that present a page with more information that could convince the end customer to buy the product (e.g. "More Features"). In the Data Viewer, such buttons appear under a "callToActions" item. These "Call to Action" objects can come from 3 different locations in a product profile: * The "Buy Now" button in the product banner (`application.callToActions.items[*n*].label`) * The "More Features" button in the overview tab (`application.overview.callToActions.tour.label`) * The "Buy Now" button in the editions tab (`application.editions.items[*n*].callToAction.label`) As with i18n objects, you can use the Data Viewer to find the item you want to change. You can then add an entry in the "i18n overrides" section of your file to change the text for that item. * To override the "More Features" button in the overview tab, list the object and the label you want to use. For example: `application.overview.callToActions.tour.label: "See More"` * To override the "Buy Now" button in the product banner or on the editions tab: * Remove the number from the item (remove *n* in the product banner and editions examples above) . * Replace the "label" with the corresponding actionType instead. The actionType is listed within the same item, and appears in all caps (e.g. "BUY" or "CONFIGURE"). For example: application.callToActions.items.BUY: "Purchase" application.editions.items.callToAction.BUY: "Buy this edition" When you save the file and refresh the browser, the new labels appear. --- # Themes and Static Assets Storefront Theme manages all static assets (JavaScript files, fonts, images, and so on). After a theme is uploaded through the Theme Manager, the assets are linked through a content delivery network (CDN). When you create a theme, you can add an asset. For example, you can add an image as a profile banner: ``` ``` This r() function to reference an asset in the theme can be used in regular pages, or in header-footer templates. ## Add JavaScript files globally[​](#add-javascript-files-globally "Direct link to Add JavaScript files globally") You can add scripts to `base.html` to include them in every page (as long as you extend `base.html`): ``` ``` ## Add custom fonts[​](#add-custom-fonts "Direct link to Add custom fonts") To manage fonts, we recommend that you convert the theme fonts to base64 and add them directly in your SASS files. You can include the fonts in your CSS file with the `@font-face` [rule](https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face). You must format the `src data` as a [Data URL](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs). ## Add images in SASS files[​](#add-images-in-sass-files "Direct link to Add images in SASS files") You can add styles directly in HTML templates as a workaround to create an image, such as a background image. It is currently not possible to add assets in CSS files. --- # Themes and Custom Ressources Theme Editor supports custom resources, such as images, which you can use to override default product images in certain situations. For example, you might want to use custom product images for sliders or backgrounds instead of the default product images, which appear on product profile pages. To use custom resources, you must add the desired images to the theme and add some custom code to the appropriate macro HTML file to point to the images. The custom code consists of the `r` function. You can import the macro to other pages to show custom images for different products, as required. You can use variables, such as productID or name, to build dynamic paths to custom resources, and then feed those paths to the `r` function. The examples in this topic demonstrate how to do so. important Follow these guidelines when you use custom resources: * If you are replacing images in a product list (for example, for sliders), you must replace the images of *all* products in the list. * When you import a macro that contains the `r` function, you must add `with context` to the end of the import line to ensure the current context to the macro. ## Using Custom Images[​](#using-custom-images "Direct link to Using Custom Images") 1. Identify the page and page element in which you want to include custom images, for example the hero slider on the home page. 2. Use the Data Viewer to view the IDs of the products whose images you want to replace. 3. Copy the desired images to the `/themeName/assets/images` folder. 4. Rename the images to use a standard naming convention, for example \*`productID-slider-image.jpg`. 5. Open the macro file that corresponds to the page element. Macro files are located in the `/themeName/content/macros/` folder. For example, to customize the slider on the home page, open `/themeName/content/macros/sliders/hero.html`. 6. Replace the image source in the macro file with the r function and an expression to build the image file names. For example: ``` r(["/assets/images/", product.id, "-slider-image.jpg"] | join) ``` In this case, for a product with ID 100, the slider would display `/assets/images/100-slider-image.jpg`. ### Example: Hero slider[​](#example-hero-slider "Direct link to Example: Hero slider") The following example shows how to implement custom images in the hero slider macro file, `/themeName/content/macros/sliders/hero.html`. ``` ``` ### Example: Hero slider on custom pages[​](#examplehero-slider-on-custom-pages "Direct link to Example: Hero slider on custom pages") After you update the macro file, you can import the macro to use custom resources on custom pages. Add `with context` to the import: ``` {% from "/macros/sliders/hero.html" import hero with context %} ``` The following example shows how to use custom resources on a custom Special Offers page. As in the previous example, you would have to add custom images for each product in the `livechat` list. ``` {% extends "/layout/base.html" %} {% from "/macros/sliders/hero.html" import hero with context %} {% from "/macros/sliders/script.html" import sliderScript %} {% block data %} {% endblock %} {% block content %}

Special Offers

{{ hero(productLists.customLists.livechat.products, i18n) }} {{ sliderScript() }} {% endblock %} ``` --- # Theme CSS grid The theme CSS grid is a layout framework that you can use to change the layout of the storefront. The grid provided in the classic theme folder is heavily based on the [Bootstrap 4.0 grid](https://getbootstrap.com/docs/4.0/layout/grid/), modified to accommodate design requirements. If required, you can replace the grid to begin with a new grid. The following sections detail the main bootstrap changes: * There are 16 columns instead of 12. * The column number adjusts depending on the breakpoints. * It is possible to use a fixed column width. ## Columns grid[​](#columns-grid "Direct link to Columns grid") The base theme uses a 16 column grid to manage the user interface (UI). Because the number of columns change depending on the breakpoints, it is important to be careful while you build your UI if you decide to use the base theme as a starting point. Bootstrap grid is mobile first, which means that you design for a small screen and then allow it to scale to a larger screen. ## Minimum dimensions for breakpoints[​](#minimum-dimensions-for-breakpoints "Direct link to Minimum dimensions for breakpoints") Define the minimum dimensions at which your layout changes. The minimum dimensions for the base theme are as follows: * xm: 1px * xs: 641px * sm: 800px * md: 960px * lg: 1120px * xl: 1281px ## Maximum width for breakpoints[​](#maximum-width-for-breakpoints "Direct link to Maximum width for breakpoints") Define the maximum width of `` `.container` `` for different screen sizes, which is as follows for the base theme: * xm: 408px * xs: 552px * sm: 696px * md: 840px * lg: 984px * xl: 1128px ## Number of columns for each breakpoint[​](#number-of-columns-for-each-breakpoint "Direct link to Number of columns for each breakpoint") The base theme uses a different number of columns depending on the breakpoints. Because the ratios do not always work on all breakpoints, you might need to define your column width when working on element responsiveness on multiple breakpoints. The following number of columns are defined for each breakpoint are defined in the base theme: * xm: 6 columns * xs: 8 columns * sm: 10 columns * md: 12 columns * lg: 14 columns * xl: 16 columns ## Fixed columns[​](#fixed-columns "Direct link to Fixed columns") You can use a fixed width column on the grid. For example, a sidebar can have the same width in all breakpoints. The following example shows how to enable the sidebar to have a fixed width of four columns and force the main container to use the remaining space: * On the sidebar, add the class: `col-fix-4` * On the main container, add the class: `col-fix-inv-sm-4` ## Replace the grid[​](#replace-the-grid "Direct link to Replace the grid") Although we provide the grid in the classic theme folder, you can replace it with your grid as described in the following procedure. To replace the grid 1. Open your theme folder in your text editor and go to `/assets/css/theme/layout/_manifest.scss`. 2. Remove the first line, which is `@import '../grid/bootstrap-grid';`. 3. Go to `/assets/css/theme/grid`. 4. Delete all files in this folder and paste your grid-related SASS files. 5. Go to `/assets/css/theme/layout/_manifest.scss` and add your new grid entry point. 6. Save your project. note The platform is open so that you can handle the SASS theme architecture however you want. The only limitation is that the entry point for your theme CSS must be `/assets/theme/theme-index.scss`. --- # Global platform CSS The global platform CSS is exclusively for marketplace owners who want to port their legacy custom themes (see Customize the marketplace user interface) to the Theme Editor. The global CSS stylesheet, `global-index.scss`, that is added to every page on the marketplace. You can find the file in `themes/themeName/assets/css/platform-global`. Any CSS added to this file appears in the storefront *and* the administration pages (such as the Merchandising Options page). note The administration pages have a different architecture than the storefront. While the storefront is managed by Marketplace Managers in the user interface (UI), the administration pages are in constant evolution. As updates the platform, some pages might not be affected by the design properties. --- # Integrate Checkout in your Storefront Theme The checkout pages are not considered part of the theme itself. However, when you build your theme, you must complete some additional tasks to ensure that the checkout process works properly. There are three main parts to the integration process: * [Configure the cart preview](#cart-preview) * [Configure the "add to cart" behavior](#add-to-cart) * [Configure the product configuration tool](#product-configurator) The classic and Plaza base themes provided with the toolkit both integrate all of these features as a reference. ## Cart preview[​](#cart-preview "Direct link to Cart preview") The cart preview consists of a cart icon that appears in your theme header and a preview dialog that appears when a product is added to the cart. provides a cart preview component that you can use in your theme. ### Usage[​](#usage "Direct link to Usage") In the header-footer folders, open the logged-in.html template. You can add the cart icon and preview dialog with the following tag: ``` {{CART-DROPDOWN-COMPONENT}} ``` The cart icon appears after you add the tag. ### Style cart preview components[​](#style-cart-preview-components "Direct link to Style cart preview components") To preview the cart in the toolkit, you need a logged-in header. See Create the header and footer. Hover over the cart to see the default state of the cart. You can style the cart preview through CSS. You cannot change the HTML structure of the cart; however, you can create a custom cart component. The styles for the cart preview are in the /header-footer/css/header-components/cart.scss file. To test elements in your cart, click any **Add To Cart** button or trigger the following function on the window object: ``` window.AD_addToCart("123123") ``` The `AD_addToCart` function uses mocks, so you can use any random IDs when you call the function. ### Create custom cart preview components[​](#create-custom-cart-preview-components "Direct link to Create custom cart preview components") Although we provide a default cart on the storefront through a header component, you can use events to create custom cart experiences. Use the JavaScript `addEventListener()` method with the following events. * Update cart preview `document.addEventListener('universalnav:update:cart');` * Hide cart preview `document.addEventListener('universalnav:hide:cart');` * Add item to cart preview `document.addEventListener('universalnav:add:cart');` ## Add to cart[​](#add-to-cart "Direct link to Add to cart") Theme developers can use a JavaScript window function to support "add to cart" operations. The function requires the plan IDs of the product and add-on editions. It automatically manages the cart preview and user redirection. ### Prerequisites[​](#prerequisites "Direct link to Prerequisites") The checkout flow supports either *Buy Now* or *Add to Cart* buttons. The information in this section is only relevant if your marketplace uses the Add to Cart button. To enable the Add to Cart button 1. Go to \**Manage > Marketplace > Settings >•* Billing Settings | **Billing Functionality**. 2. In the Product Configurator section, select **Add to Cart**. 3. At the bottom of the page, click **Save Settings**. ### Usage[​](#usage-1 "Direct link to Usage") Add the following function to your JavaScript code: ``` window.AD_addToCart(EditionPlanId, [AddonsPlanId, AddonsPlanId]) ``` You can retrieve the pricing plan ID with the Data viewer. On a product page, navigate to the following data: ``` application > editions > items > 0 > plans > 0 > uuid ``` When activated, the `callToActions` list can include an Add To Cart action. You must catch the **ADD\_TO\_CART** `actionType` and trigger the `AD_addToCart` function on click. ## Product configurator[​](#product-configurator "Direct link to Product configurator") The *product configurator* refers to the part of the checkout process in which a customer selects the edition of a product they want to buy, and chooses any available add-ons. Theme developers can customize the configurator to suit their needs. Product configuration customization consists of three parts: * Create the user interface for the edition and add-on listings. * Manage the states of the selected items. * Manage how to add items to the cart. You can view the product configuration page directly in the Storefront Toolkit. Use the following URL pattern: ``` /locale/apps/appId/appName/configure ``` For example: ``` /en-US/apps/577/g-suite/configure ``` ### Build the user interface[​](#build-the-user-interface "Direct link to Build the user interface") You build the edition and add-on listing user interface with the same lists that appear on the product page: the `application > editions` and `application > addonsProducts` page objects. When you have your lists, you can manage the selected states. The selected editions and add-ons are available under the `application > configurator` object. It is important to set them as selected when the page loads. There are many scenarios where they might be selected by default, for example when a customer clicks an edition directly on the product page and goes to the configuration page to select add-ons. The new checkout flow only accepts pricing plan IDs as items to add to carts. As you build the UI, you must maintain a reference to those IDs. You can find them under the edition object (`plans > 0 > uuid`). There are two ways to add items to the cart: * through a Buy button, which sends customers to the cart * through an Add to Cart action, which keeps customers on the storefront (see Add to cart) ### Create the Buy button[​](#create-the-buy-button "Direct link to Create the Buy button") Under `application > callToAction`, the `urlCreator` object contains the necessary parts to construct the URL for your selected items. For example: * `"base": "https://example.com/api/internal/storefront/v1/cta?productId=577&type=BUY"` * `"actionType": "BUY"` * `"editionParam": "eppid"` * `"addonParam": "appid"` You must use JavaScript to construct the URL for the selected items. A product with one edition and two add-ons selected would resemble the following example: ``` https://example.com/api/internal/storefront/v1/cta?productId=577&type=BUY&eppid=123123-123123&appid=1233-123&appid=876-4569 ``` --- # Customize the admin header and footer The header and footer of your theme are *universal* and *encapsulated*, which means that they apply to all the administration pages. Because of this, some special rules apply: * HTML and CSS are encapsulated---Every rule is encapsulated post processing, and you cannot use any styles that come from your base theme. * The header and footer have their own components---You cannot modify these components, but you can style them using CSS classes. * Only use HTML, CSS, or JavaScript---Template utilities (macros, filters, and so on) are *not* available. See the [Manage headers and footers](https://drive.google.com/file/d/1oYDGWNz3OJm4-42p2aGPGCX9p2H1cgkc/view?usp=sharing) video for a quick overview of the unique templating system for headers and footers, and how to customize them. caution Use caution when modifying header or footer position or display properties, because such changes can interact with page elements across the platform beyond the storefront, such as login modals, in unexpected ways. Ensure that you test your changes thoroughly. ## HTML theme files[​](#html-theme-files "Direct link to HTML theme files") The header and footer are a series of HTML files in your theme. After you open your project in a text editor, the following templates are available for the header and footer in `themes/themeName/header-footer`: * `logged-out.html`---The header shown when the user is *not* logged in to the marketplace. * `logged-in.html`---The header shown when the user is logged in to the marketplace. * `checkout.html`---The header shown when the user is in the checkout flow. Note that only the logo of your marketplace appears. * `sso.html`---The header shown when in any authorization flow (for example, logging in or two-factor authentication). Note that only the logo of your marketplace appears. * `footer.html`---The footer shown on all pages in the marketplace. tip You can add a font file (it must be named `header.woff`) to your header-footer directory at `themes/themeName/header-footer` to customize the font of your header and footer. The following code is an example of the `logged-in.html` template, which contains components that use brackets nomenclature, `{{componentName}}`. These components are internal to the platform. For a full list of available components, see Available header and footer tags. ```
{{SEARCH_BOX}}
``` ## CSS theme files[​](#css-theme-files "Direct link to CSS theme files") The CSS for the header and footer are located in `themes/themeName/header-footer/css`. You can either modify the base CSS with the styling in SASS (`header-index.scss`) or you can create a new one. The `header-index.css` file is required for API calls. note If you do not want to style in SASS, ensure that only the `header-index.css` file exists in `themes/themeName/header-footer/css`. Remove the `header-index.scss` file. ## Style HTML components[​](#style-html-components "Direct link to Style HTML components") You can view the HTML structure of the component when it is rendered in the browser. Find each element by inspecting your browser and use your CSS knowledge to style the elements. The following image shows an example of the header structure of the *My Profile* drop-down component. ![](/assets/images/sfb-my-profile-f8dabb2a96ec24e96fe4eed76f1a7571.png) ## Available admin header and footer tags[​](#available-admin-header-and-footer-tags "Direct link to Available admin header and footer tags") You can use the tags listed in this section to customize the storefront header and footer. Because the header and footer are encapsulated and use different components than the rest of the storefront, these tags are *only* available for the header and footer. To use the tags listed in this section, add them to any of the files in the `themeName/header-footer` folder and enclose them in curly braces: ``` {{MPLOGO-COMPONENT}} ``` The rendered output of certain tags depends on user data (roles, permissions, and so on) or marketplace settings. ### Components[​](#components "Direct link to Components") Components are interactive user interface elements, such as drop-down lists. | Component | Description | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `MPLOGO-COMPONENT` | The marketplace logo. | | `MYAPPS-DROPDOWN-COMPONENT` | A drop-down list of the products available on the user's MyApps page. | | `LANGUAGE_DROPDOWN` | A drop-down list of available languages. | | `LANGUAGE_SELECT` | An HTML select drop-down list of available languages. | | `WRAPPED_LANGUAGE_SELECT` | A wrapped HTML select drop-down list of available languages (easier to style than the other language options). | | `MANAGE_DROPDOWN` | A drop-down list of management options available to authenticated users. | | `USER_DROPDOWN` | A drop-down list of user settings available to authenticated users. | | `COMPANY_DROPDOWN` | A drop-down list of companies that the authenticated user can access. | | `CURRENCY_DROPDOWN` | A drop-down list of supported marketplace currencies. | | `MOBILE-MENU` | A mobile menu with a list of accessible links that only appears on mobile screen resolutions, as determined by the CSS. | | `ICON-HOME-COMPONENT` | A *Home* icon that redirects to the feeds page. The marketplace must have enabled and it must be assigned to the authenticated user. | | `ICON-APPWISE-COMPONENT` | A *Teams* icon that redirects to the teams page. | | `ICON-APPINSIGHT-COMPONENT` | An *Insights* icon that redirects to . The marketplace must have enabled and it must be assigned to the authenticated user. | | `ICON-MARKETPLACE-COMPONENT` | A *Marketplace* icon that redirects to the storefront home page. | ### User interface elements[​](#user-interface-elements "Direct link to User interface elements") User interface elements are HTML tags that include links, images, and lists. | Element | Description | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ACCOUNT_LINK` | An *Account* link that opens the App Manager home page at *marketplaceUrl*/account/home. | | `CHANNEL_LINK` | A *Marketplace* link that opens the marketplace setup guide at *marketplaceUrl*/channel/guide. | | `COMPANY_LINK` | A *My Company* link that opens the authenticated user's company page at *marketplaceUrl*/companies/*companyUuid*. | | `CORPORATE_LINK` | A *Network* link that opens the network management page at *marketplaceUrl*/corporate/home when authenticated. The marketplace must have the Network add-on and the user must have the Corporate Administrator role. | | `DEVELOPER_LINK` | A *Billing and Distribution* or *Developer* link (depending on the authenticated user's roles) that opens the Developer Center home page at *marketplaceUrl*/cms/home. The marketplace must have Developer Center enabled and the user must have the Developer role. | | `HOME_LINK` | A *Marketplace* link that opens the marketplace home page at *marketplaceUrl*/home. | | `LOGIN_LINK` | A *Log In* link that opens the login page at *marketplaceUrl*/login. | | `MYAPPS_LINK` | A *My Apps* link that opens the authenticated user's My Apps page at *marketplaceUrl*/myapps. | | `RESELLER_LINK` | A *Reseller* link that opens the home page at *marketplaceUrl*/reseller when authenticated. The marketplace must have enabled and the user must have the Reseller Manager or Reseller role. | | `SETTINGS_LINK` | A *My Settings* link that opens the authenticated user's settings page at *marketplaceUrl*/settings. | | `SIGNUP_LINK` | A *Sign Up* link that opens the marketplace sign-up page at *marketplaceUrl*/signup. | | `ACCOUNT_LI` | An *Account* list item that opens the App Manager home page at *marketplaceUrl*/account/home. | | `CHANNEL_LI` | A *Marketplace* list item that opens the marketplace setup guide at *marketplaceUrl*/channel/guide. | | `CORPORATE_LI` | A *Network* list item that opens the network management page at *marketplaceUrl*/corporate/home when authenticated. The marketplace must have the Network add-on and the user must have the Corporate Administrator role. | | `DEVELOPER_LI` | A *Developer* or *Billing and Distribution* list item (depending on the authenticated user's roles) that opens the Developer Center home page at *marketplaceUrl*/cms/home. The marketplace must have Developer Center enabled and the user must have the Developer role. | | `RESELLER_LI` | A *Reseller* list item that opens the home page at *marketplaceUrl*/reseller when authenticated. The marketplace must have enabled and the user must have the Reseller Manager or Reseller role. | | `HOME_LI` | A *Marketplace* list item that opens the marketplace home page at *marketplaceUrl*/home. | | `LOGIN_LI` | A *Log In* list item that opens the login page at *marketplaceUrl*/login. | | `LOGOUT_LI` | A *Logout* list item that opens the logout page at *marketplaceUrl*/logout. | | `MYAPPS_LI` | to the user's My Apps page at *marketplaceUrl*/myapps. | | `SIGNUP_LI` | A *Sign Up* list item that opens the marketplace sign-up page at *marketplaceUrl*/signup. | | `SUBSCRIPTION_LI` | ??? | | `COMPANY_LI` | A *My Company* list item that opens the authenticated user's company page at *marketplaceUrl*/companies/*companyUuid*. | | `PROFILE_LI` | A *My Profile* list item that opens the authenticated user's profile page at *marketplaceUrl*/profile/*userUuid*. | | `SETTINGS_LI` | A *My Settings* list item that opens the authenticated user's settings page at *marketplaceUrl*/settings. | | `SEARCH_FORM` | A *Search* text box. | | `SEARCH_BOX` | An search box. See Search with AppWise. | | `ICON_USER_IMG` | The authenticated user's profile image. | | `LANGUAGE_LINKS` | A list of supported marketplace languages, which you can click to change the language of the user interface. | | `USER_LIST` | List of user management options, suitable to include in a drop-down element. | | `MANAGE_LINKS` | Links to different management pages available to the authenticated user. | | `COMPANY_LIST` | List of companies of which the authenticated user is a member, suitable to include in a drop-down element. | ### Data elements[​](#data-elements "Direct link to Data elements") Data elements render data without any HTML tags. For example, `ACCOUNT_HREF` renders `http://_marketplaceUrl_/account`. | Element | Description | | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ACCOUNT_HREF` | Hyperlink to the App Manager home page at *marketplaceUrl*/account/home when authenticated. | | `CHANNEL_HREF` | Hyperlink to the marketplace setup guide at *marketplaceUrl*/channel/guide when authenticated. | | `COMPANY_HREF` | Hyperlink to the authenticated user's company page at *marketplaceUrl*/companies/*companyUuid*. | | `COPYRIGHT_YEAR` | A copyright symbol with the current year. | | `CORPORATE_HREF` | Hyperlink to the network management page at *marketplaceUrl*/corporate/home when authenticated. The marketplace must have the Network add-on and the user must have the Corporate Administrator role. | | `CURRENT_LANGUAGE_TAG` | The current marketplace locale in ISO language and country format, for example *en-US* | | `CURRENT_LANGUAGE` | The current marketplace locale in plain text, for example *English (United States)* | | `DEVELOPER_HREF` | Hyperlink to the Developer Center home page at *marketplaceUrl*/cms/home when authenticated. The marketplace must have Developer Center enabled and the user must have the Developer role. | | `HOME_HREF` | Hyperlink to the marketplace home page at *marketplaceUrl*/home. | | `LOGIN_HREF` | Hyperlink to the login page at *marketplaceUrl*/login. | | `LOGOUT_HREF` | Hyperlink to the logout page at *marketplaceUrl*/logout. | | `MARKETPLACE_HREF` | Hyperlink to the marketplace home page at *marketplaceUrl*/*locale*/home. | | `MYAPPS_HREF` | Hyperlink to the user's My Apps page at *marketplaceUrl*/myapps. | | `PRIVACY_POLICY_URL` | URL of the marketplace privacy policy page, if configured. | | `PROFILE_HREF` | Hyperlink to the authenticated user's profile page at *marketplaceUrl*/profile/*userUuid*. | | `RESELLER_HREF` | Hyperlink to the home page at *marketplaceUrl*/reseller when authenticated. The marketplace must have enabled and the user must have the Reseller Manager or Reseller role. | | `SETTINGS_HREF` | Hyperlink to the authenticated user's settings page at *marketplaceUrl*/settings. | | `SIGNUP_HREF` | Hyperlink to the marketplace sign-up page at *marketplaceUrl*/signup. | | `SUPPORT_CONTACT_URL` | URL of the "Contact Support" page, if configured. | | `SUPPORT_EMAIL` | Support email address. | | `SUPPORT_PHONE` | Support phone number, if configured. | | `SUPPORT_URL` | URL of the support page, if configured. | | `TERMS_URL` | URL of the Terms and Conditions page, if configured. | | `USER_FIRSTNAME` | The authenticated user's first name. | | `USER_IMG` | Path to the authenticated user's profile image. | --- # Themes and Metatags Meta tags are snippets of text in the HTML of a page that describe the content on the page. After meta tags are configured, they are used for search engine optimization (SEO) to help potential customers find products or information on the storefront. Open your project in your text editor and find the base.html file in `themes/themeName/content/layout`. The base layout (base.html file) contains the meta tags for your storefront. If you prefer to have specific meta tags for certain pages, you can override meta tags as described later in this topic. The following example of code appears at the top of the `base.html` file: ``` {% block meta_title %}{{ meta.title }}{% endblock %} {% block meta_description %}{% endblock %} {% block meta_keywords %}{% endblock %} {% block meta_author %}{% endblock %} {% block other_meta %} {% endblock %} ``` In the previous example, the meta tag description, keywords, and author are not configured for the storefront. After you save your `base.html` file, default meta tags are provided for every page on the storefront. If you prefer to have different meta tags for certain pages, you can override the `base.html` meta tag and add multiple meta tags as described in the following section. ## Override meta tags[​](#override-meta-tags "Direct link to Override meta tags") To override a tag in `base.html`, open a template file (at `themes/themeName/content/pages`) and add a `block` tag. For example, you can add `meta_title` to the `home.html` file: ``` {% block meta_title %}My Storefront{% endblock %} {% block meta_title %} Override meta tag {% endblock %} ``` To override a tag in `base.html` *and* add multiple tags to a certain page, open a template file (at `themes/`*`themeName`*`/content/pages`) and add a `block` tag. For example, you can add `meta_title `and `other_meta` to the `home.html` file: ``` {% block meta_title %} Override meta tag {% endblock %} {% block other_meta %} {% endblock %} ``` If your custom theme does not have blocks in your base layout (`base.html` file), you must manually add the blocks. ## Open Graph tags for Facebook[​](#open-graph-tags-for-facebook "Direct link to Open Graph tags for Facebook") The Storefront Toolkit supports [Open Graph](https://developers.facebook.com/docs/sharing/webmasters/#markup) tags to control how content appears on Facebook. Additionally, you can override meta tags as described above. For example, you can add the following `block` to the `base.html` file: ``` {% block meta_opengraph %} {% endblock %} ``` ## Cards markup for Twitter[​](#cards-markup-for-twitter "Direct link to Cards markup for Twitter") The developer tool supports [Cards markup](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/getting-started) for Twitter to control how content appears on Twitter. Additionally, you can override meta tags as described above. For example, you can add the following `block` to the `base.html` file: ``` {% block meta_twitter %} {% endblock %} {% block meta_twitter %} {% endblock %} ``` note You have to manually add your Twitter handle to the base layout. --- # Create Custom Pages in your theme You can create custom pages as required and add them to your theme. You can use custom pages to convey any information that is not included in the base theme. For example, you could create pages that only list special offers or new products, or to display information that comes from an external source. This topic explains the basic procedure to add a custom page. The process of page customization follows the same principles as any other HTML page in the theme. ## To create a custom page[​](#to-create-a-custom-page "Direct link to To create a custom page") 1. In the `/themeName/content/pages/custom` folder, create an HTML file named for the custom storefront page. For example, `specialoffers.html`. 2. To access a custom page In a browser, enter the path to the custom page in the following format, without the .html extension: ``` http://localhost:3555/en-US/customPageName ``` For example, for a custom page named specialoffers.html: ``` http://localhost:3555/en-US/specialoffers ``` note For additional details about how to build pages, see the following topics: * [Page structure](/storefront/reference/storefront-page-structure.md) * [Templating language features](/storefront/reference/storefront-engine.md) * [Customized data](/storefront/how-tos/data/storefront-data-customized.md) --- # Upload a theme in Theme Manager note There are 2 steps to upload a theme in Theme Manager, first you will need to package your theme in the toolkit, then you will need to log into your marketplace and upload the theme in Theme Manager. ## Create a theme package in the toolkit[​](#create-a-theme-package-in-the-toolkit "Direct link to Create a theme package in the toolkit") After you customize and view your theme in your development environment, you can package the current theme as a .zip file, then upload it to the . You can use the to view different versions of the theme, manage it, and preview it in your production environment. You can ensure that the theme is stable before you publish it to your production environment. To create the .zip file, you must use the package command. This command operates on the current default theme. If the theme you want to package is not the current default, you must first Switch between themes to the correct theme. To package a theme 1. Open a command-line window. 2. Go to your workspace folder. 3. Type `sfb-toolkit package` and press **Enter**. The tool asks whether you want to include translations in the package. 4. Choose `y` to include translations, or `N` to omit them, and press **Enter**. If your theme is based on Plaza (that is, if it uses components), the tool asks whether to include the Theme Editor layout editor settings. Choose `y` to include them, or `N` to use the defaults, and press **Enter**. Wait for the command to finish. The theme is generated as a .zip file in your `/theme-zips` folder. ## Upload the theme in Theme Manager[​](#upload-the-theme-in-theme-manager "Direct link to Upload the theme in Theme Manager") An uploaded theme is not automatically published. You can use the to view different versions of the theme, manage it, and preview it in your production environment. You can ensure that the theme is stable before you publish it to your production environment. important To upload your theme, you must have the Marketplace Manager role. To upload a theme: 1. Log in to the marketplace in your production environment as . 2. Go to \**Manage > Marketplace >•* . The page opens. 3. In the My Themes section, click **Upload Theme**. The Upload Theme dialog appears. 4. Click **Choose File** in the Upload Theme field. 5. Select the .zip file that was added to your `/theme-zips` folder. The file name includes the theme name, date, and time to identify the theme. For example, `mytheme__2018-09-05_13.39.51.zip`. 6. Enter a name for your theme in the Theme Name field. 7. Click **Upload**. A confirmation message appears, and the theme appears in a new row in the My Themes section. The theme .zip file takes time to process and is not ready to publish immediately. Additionally, the theme is *not* published when it finishes processing. If your theme was not uploaded successfully, a *Processing Failed* message appears in the Actions column. Click **Processing Failed** to view error messages. After the theme has been uploaded, you can use it with other [Theme Manager features](https://help.appdirect.com/platform/Default.htm#StorefrontBuilder/sfb-work-manager.htm%3FTocPath%3DCustomize%2520the%2520storefront%7CWork%2520with%2520the%2520Theme%2520Manager%7C_____0). If it is based on the Plaza theme, you can also launch it in the [Theme Editor](https://help.appdirect.com/platform/Default.htm#StorefrontBuilder/sfb-vis-editor.htm%3FTocPath%3DCustomize%2520the%2520storefront%7CWork%2520with%2520the%2520Storefront%2520Builder%7C_____0) to make further changes (see Work with the Theme Editor). --- # Custom Components --- note This document applies to `sfb-toolkit@5.x.x` and `sfb-theme-components@0.0.352` or newer. For previous versions risks please see **[here](/storefront/reference/custom-components/legacy/legacy-custom-components-risks.md)**. # Introduction While Custom Components allow the creation of new UI elements there are a few important consequences/risks that come with this capability: ### No automatic UI library updates[​](#no-automatic-ui-library-updates "Direct link to No automatic UI library updates") When Custom Components are installed using the `sfb-toolkit components` command a specific version (according to the toolkit version) of our UI library (@appdirect/sfb-theme-components) is being installed. This means that, unlike themes that do not have Custom Components installed, the UI features available are restricted to those of the UI library version installed. As such, unless the version of the UI library is **manually updated** (see below risks), new UI features will not be available. The reasoning behind this flow is to ensure theme stability. If new features/Custom Components are added that reuse/build on top of our UI library, those customizations will not be at risk of breaking due to interdependencies when a new version of our UI library is released. ### Overriding UI library atoms[​](#overriding-ui-library-atoms "Direct link to Overriding UI library atoms") By installing Custom Components our UI library (@appdirect/sfb-theme-components) is automatically installed. This allows you to reuse, extend or override the UI Library elements we provide. When overriding our **atoms** either through JavaScript or CSS it is important to keep in mind that these could cause breaking changes. As such, we strongly suggest to thoroughly test any UI elements which use the overridden atoms. ### Manually updating the UI library[​](#manually-updating-the-ui-library "Direct link to Manually updating the UI library") When Custom Components are installed, manually updating the UI library by executing `sfb-toolkit install @appdirect/sfb-theme-components@version` can cause custom components which reuse UI library **atoms** to break (see above). This occurs because reused atoms are pointing directly to our UI library and updating the UI library will also **update** the atoms. As such, **side effects** might occur due to updated atoms behaving the same as in the previous version. --- # Custom Components (Legacy) --- warning This document is applicable to `custom components` created using toolkit version `@appdirect/sfb-toolkit@4.x.x` or earlier and `@appdirect/sfb-theme-components@0.0.344` or earlier. # Add components to your storefront theme To add a component to a page template, add a component HTML tag like this: ``` ``` ## Components Properties[​](#components-properties "Direct link to Components Properties") * `name` The exported name of the component. * `id` A chosen unique identifier across all pages to identify the component. ## Use the Theme Editor[​](#use-the-theme-editor "Direct link to Use the Theme Editor") To use the Theme Editor, place the component on a supported page template so that the editor can detect it. These are the pages that the editor currently supports: * content/pages/home/home.html * content/pages/listing/listing.html * content/pages/profile/profile.html * content/pages/profile/profile-editions.html You can add components to any theme template file (layout, macros, or pages) and it will be rendered properly, but the Theme Editor capabilities are restricted to the pages above. --- warning This document is applicable to `custom components` created using toolkit version `@appdirect/sfb-toolkit@4.x.x` or earlier and `@appdirect/sfb-theme-components@0.0.344` or earlier. # Custom components warning While custom components allow for great flexibility please check the **[risks](/storefront/reference/custom-components/legacy/legacy-custom-components-risks.md)** associated with using them. The Plaza theme enables you to create themes using our React components library, which is included in the latest sfb-toolkit version. The toolkit includes components that you can use to quickly build and customize your storefront pages through the Theme Editor. For example, you can integrate the `Slider`, `Carousel`, `ProductBanner`, and many more components with your Plaza theme. If none of the components in our library suit your needs, you can create custom components. Custom components are components that you can create and customize through the [schema](/storefront/reference/custom-components/schema.md) object. The `Getting Started` section contains everything you need to know to start building your custom components according to our guidelines and best practices. ## Installation[​](#installation "Direct link to Installation") warning Once custom components are installed there is currently no command to automatically reverse this action! See **[here](/storefront/how-tos/components/storefront-custom-components-uninstall.md)** for instructions on how to manually remove them. To setup your theme to use custom components, execture the following command: ``` sfb-toolkit components ``` For a more in depth explanation on this command please see [here](/storefront/reference/toolkit-commands.md#install-custom-components-to-a-theme). ### sfb-toolkit storybook (DEPRECATED)[​](#sfb-toolkit-storybook-deprecated "Direct link to sfb-toolkit storybook (DEPRECATED)") ``` sfb-toolkit storybook ``` This command enables theme developers to visualize all available component documentation through Storybook UI. The Storybook includes both `sfb-theme-components` and the custom components that you have created. ## Reuse our UI library components[​](#reuse-our-ui-library-components "Direct link to Reuse our UI library components") You can reuse existing components (atoms or components) from our UI library for your custom components. For example, if you want to reuse the `Button` atom in your custom component, add the following import: ``` import Button from '@appdirect/sfb-theme-components/src/atoms/button/Button'; ``` For each component documented in Storybook UI, you can find under `Usage Example` an example of how you can reuse/import one of our components in your custom components. ## Availability[​](#availability "Direct link to Availability") `@appdirect/sfb-toolkit@2.0.5` --- warning These risks are applicable to `custom components` created using toolkit version `@appdirect/sfb-toolkit@4.x.x` or earlier and `@appdirect/sfb-theme-components@0.0.344` or earlier. # Introduction While Custom Components allow the creation of new UI elements there are a few important consequences/risks that come with this capability: ### No automatic UI library updates[​](#no-automatic-ui-library-updates "Direct link to No automatic UI library updates") When Custom Components are installed using the `sfb-toolkit components` command a specific version (according to the toolkit version) of our UI library (@appdirect/sfb-theme-components) is being installed. This means that unlike themes that do not have Custom Components installed, the UI features available are restricted to those of the UI library version installed. As such, unless the version of the UI library is `manually updated` (see below risks), new UI features will not be available. The resoning behind this flow is to ensure theme stability. If new features/Custom Components are added which reuse/build on top of our UI library, those customizations will not be at risk of breaking due to interdependencies when a new version of our UI library is released. ### Overriding UI library components[​](#overriding-ui-library-components "Direct link to Overriding UI library components") By installing Custom Components our UI library (@appdirect/sfb-theme-components) is automatically installed. This allows you to reuse, extend or override the UI components we provide. When overriding our UI components either through JavaScript or CSS it is important to keep in mind that these could cause breaking changes. As such, we strongly suggest to thoroughly test any components which have been overriden. tip The `sfb-toolkit components-info` command could help you identify which custom components could be at risk. Please see **[here](/storefront/reference/toolkit-commands.md#check-a-theme-for-use-of-custom-components)** for more information. ### Manually updating the UI library[​](#manually-updating-the-ui-library "Direct link to Manually updating the UI library") When Custom Components are installed, manually updating the UI library by executing `sfb-toolkit install @appdirect/sfb-theme-components@version` can cause custom components which override UI library components to break (see above). This generally occurs because the overridden custom components will have some dependencies pointing to our UI library while the entry point is localy defined (in the `customComponents` folder). As such, side effects might occur caused by local files not being compatible with dependencies pointing to the new UI library version installed. tip The `sfb-toolkit components-info` command could help you identify which custom components could be at risk. Please see **[here](/storefront/reference/toolkit-commands.md#check-a-theme-for-use-of-custom-components)** for more information. --- warning This document is applicable to `custom components` created using toolkit version `@appdirect/sfb-toolkit@4.x.x` or earlier and `@appdirect/sfb-theme-components@0.0.344` or earlier. note If you have recently upgraded your Toolkit to version **4.0** from an earlier version, you may receive warnings and error messages when you start it. For instructions on how to resolve these warnings and errors, see Upgrading to 4.0 and later. # Storefront Toolkit The Storefront Toolkit consists of a set of tools that developers can use to build storefront themes. In general, the theme customization process includes running commands from the command line, manually updating various storefront HTML and CSS files, and previewing changes on a local server. To create themes using the Storefront Toolkit, you must install third-party programs to run a development environment in which you can develop and preview themes before they are available in the production environment. ## Command-line commands and options[​](#command-line-commands-and-options "Direct link to Command-line commands and options") This section explains how to use the different Storefront Toolkit commands available through the command line. When you work with the developer tool, you typically require two command-line windows. In the first window, you start the tool; in the second, you can run other commands (create new themes, update the theme configuration, and so on). You can use the command line to do the following: | Command | Description | | ------------------------------ | ----------------------------------------------------------------------------- | | `sfb-toolkit setup` | Creates a new project/environment where Developer can store themes | | `sfb-toolkit create [name]` | Creates a new theme | | `sfb-toolkit checkout [name]` | Changes context to the theme \[name] | | `sfb-toolkit about` | Lists existing themes | | `sfb-toolkit status` | Gives information about current configuration | | `sfb-toolkit update` | Update current theme's configuration | | `sfb-toolkit start` | Starts local server with current theme on `https://localhost:3555/en-US/home` | | `sfb-toolkit package` | Creates a .zip file with current theme files | | `sfb-toolkit storybook` | **DEPRECATED** Start storybook for the currently selected theme | | `sfb-toolkit install [module]` | Installs npm module in the currently selected theme | | `sfb-toolkit components` | Setup custom components | | `sfb-toolkit version` | Shows version of sfb-toolkit | For a full list of commands, use the help option: ``` sfb-toolkit --help ``` See the [Toolkit commands overview](https://drive.google.com/file/d/1YEzXbQR6JNiw_q0dM7-KdtnpeQaPIG75/view?usp=sharing) for a video tutorial on how to use commands to improve your workflow. ### Create themes[​](#create-themes "Direct link to Create themes") Use the following procedure to create themes. You can create as many custom themes as required. Each theme appears as a separate folder at the root of the themes folder you created during installation (see Install the Storefront Toolkit). To create a theme 1. Open a command-line window. 2. Go to the themes directory you created during installation. 3. Type `sfb-toolkit create themeName` and press **Enter**. You are prompted to select one of the standard marketplace themes as a starting point. The choices are classic and Plaza. 4. Use the arrow keys to highlight the theme you want, and press **Enter**.A folder with the specified theme name is created, and you are prompted to type the path to your marketplace. 5. Type your full marketplace URL. important Ensure that you include `https://` in the URL. Press **Enter**. Your context changes to the new theme, and you can now import data from the specified marketplace. ### List themes[​](#list-themes "Direct link to List themes") Use the following procedure to list all of the custom themes that you have created, and determine which is currently the default theme used when you start the Storefront Toolkit. To list themes 1. Open a command-line window. 2. Go to the themes directory you created during installation. 3. Type `sfb-toolkit about` and press **Enter**. All available themes are listed. The current theme is highlighted. ### Switch between themes[​](#switch-between-themes "Direct link to Switch between themes") You can switch between your various custom themes at any time. When you switch between themes, you can refresh the browser preview page to view the newly selected theme. To select a theme 1. Open a command-line window. 2. Go to the themes directory you created during installation. 3. Type `sfb-toolkit checkout themeName`, where `themeName` is the name of one of the available themes, and press **Enter**. Your context changes to the specified theme. ### View theme configuration[​](#view-theme-configuration "Direct link to View theme configuration") Use the following procedure to change the configuration of the current theme. The configuration consists of the marketplace URL as well as the path to the `PageObjects`, which control the flow of data between the marketplace and the toolkit. To view theme configuration 1. Open a command-line window. 2. Go to the themes directory you created during installation. 3. Type `sfb-toolkit status` and press **Enter**. The marketplace and `PageObjects` paths are listed. ### Update your marketplace URL[​](#update-your-marketplace-url "Direct link to Update your marketplace URL") Use the following procedure to update the marketplace URL of the current theme. To update the theme configuration 1. Open a command-line window. 2. Go to the themes directory you created during installation. 3. Type `sfb-toolkit update` and press **Enter**. You are prompted for a marketplace path. 4. Type the full marketplace URL. important Ensure that you include `https://` in the URL. Press **Enter**. The configuration is updated. --- warning This document is applicable to `custom components` created using toolkit version `@appdirect/sfb-toolkit@4.x.x` or earlier and `@appdirect/sfb-theme-components@0.0.344` or earlier. # Build components ## Structure[​](#structure "Direct link to Structure") React components are located in the src directory and separated into the `atoms`, `components`, and `composite-demos` subdirectories. Put each component/atom in its own self-titled directory in kebab-case inflection (`src/atoms/my-atom`). Use PascalCase inflection to name the component's files (MyAtom.jsx). Use the following file structure for each component: ``` src +-- my-atom | +-- stories | | +-- MyAtom.story.mdx | +-- styles | | +-- MyAtom.scss | +-- tests | | +-- MyAtom.test.jsx | +-- MyAtom.jsx ``` ## Components[​](#components "Direct link to Components") Components are the core elements that are placed in the theme, and typically linked to the datastore. Therefore, they are exported and available to the theme, and are the entry points inside of which everything cascades in a typical React pattern. Think of components as mini-apps that are placed in different containers, and are therefore isolated from one another. Normally, components should not have other components as their children. Use atoms for that. Components get their props from GraphQL, the global datastore object, and from their settings forms. ### `withListener` higher-order component[​](#withlistener-higher-order-component "Direct link to withlistener-higher-order-component") Components that get their props from the dataStore are wrapped as a higher-order component (HOC) called `withListener`, found in the root folder of the components (`src/components/withListener.jsx`). Export them by default wrapped in the HOC: ``` export default withListener(MyComponent); ``` Components wrapped with `withListener` can only have two props, both of which are objects: * `data` : data that comes from the datastore * `settings` : user-defined settings that come from the settings form Structure everything that the components need in one of these two props. The withListener HOC, as its name implies, listens to changes in the data store and passes the props accordingly to its wrapped component through the `data` and `settings` containers. The description of which data is selected by `withListener` to pass to the component is strucutured in the component's `Schema.marketplaceData` object. [More details](/storefront/how-tos/components/storefront-custom-components-data.md) ### `withGraphQL` higher-order component[​](#withgraphql-higher-order-component "Direct link to withgraphql-higher-order-component") Components that get their props from GraphQL are wrapped as an higher-order component (HOC) called `withGraphQL`, found in the root folder of the components (`src/components/withGraphQL.jsx`). ## Atoms[​](#atoms "Direct link to Atoms") Atoms are not connected to the global datastore and are placed within components or other atoms. They get their props from their parents. Atoms are designed to be usable by different components, for example a `Button` might be used anywhere in any component. Some atoms are less generic than others, in that they might depend on a particular data structure, for example to display a product's details. Still, an atom should always be considered reusable by multiple components. When building components that need some parts to be extracted, for example a sub-component in a loop, and these parts are not reusable by other components, they should be placed inside that component's directory, in an `atoms` directory that is private to that component. ## Composite demos[​](#composite-demos "Direct link to Composite demos") Do not use composite demos within the theme. Their purpose is merely to mock the behavior of the theme from within the Storybook when multiple components are placed on the same page, and to test and develop their interactions with one another. --- # Accessibility Management with Custom Components in Storefront Builder ## 1. Why Accessibility Matters[​](#1-why-accessibility-matters "Direct link to 1. Why Accessibility Matters") AppDirect’s Storefront UI library (sfb-theme-components) is built and maintained to meet **WCAG 2.1 AA**. When you use the vanilla Plaza theme (without custom components), you automatically receive every accessibility fix and enhancement shipped by AppDirect. Once you **install** custom components you will no longer receive automatic updates. It becomes your responsibility to keep both the UI library **and** your custom components code compliant each time the platform evolves. *** ## 2. Scenarios at a Glance[​](#2-scenarios-at-a-glance "Direct link to 2. Scenarios at a Glance") | Scenario | Library Source | Auto‑Updates? | Your Action | | ------------------------------------- | ---------------------- | ------------- | ---------------------------------------------------------------------- | | **1. No custom components** | CDN | ✅ Yes | None – you are always on the latest, fully compliant build. | | **2. Custom components on v0.0.352+** | Copied locally via CLI | ❌ No | Use the CLI to upgrade the library, then audit & fix your custom code. | | **3. Custom components pre‑v0.0.352** | Hand‑rolled / legacy | ❌ No | Upgrade cautiously; expect deep testing and refactors. | *** ## 3. Working With Custom Components v0.0.352+[​](#3-working-with-custom-components-v00352 "Direct link to 3. Working With Custom Components v0.0.352+") note If you created a theme using **custom components** that used toolkit version **4.x.x** or earlier upgrading the UI library to version **0.0.352+** still means the **3rd Scenario** described previously applies to you! Only themes using custom components that were **created** with toolkit version **5.x.x** or newer will fall under the **2nd Scenario**. ### 3.1 Upgrade the UI library[​](#31-upgrade-the-ui-library "Direct link to 3.1 Upgrade the UI library") ``` # inside your theme project sfb-toolkit install @appdirect/sfb-theme-components@latest ``` * The CLI downloads the newest version and updates your `package.json`. * Re‑build and run your theme locally; watch for breaking changes. * If something critical breaks, roll back: ``` sfb-toolkit install @appdirect/sfb-theme-components@ ``` ### 3.2 Audit your custom code[​](#32audit-your-custom-code "Direct link to 3.2 Audit your custom code") After the upgrade **your custom components will not inherit new fixes**. Review: 1. **ARIA roles & labels** – every interactive element must expose a name. 2. **Keyboard navigation** – tab order, focus states, skip links. 3. **Color & contrast** – text, icons, and states meet 4.5 : 1 (AA). 4. **Copied atoms** – if you copied low‑level atoms, re‑diff with the new versions and merge improvements. *** ## 4. Legacy Custom Components (pre‑v0.0.352)[​](#4-legacy-custom-components-prev00352 "Direct link to 4. Legacy Custom Components (pre‑v0.0.352)") Older theme custom components often import internal modules directly from sfb-theme-components. Because those internal APIs aren’t covered by the library’s public semver contract, updating to a newer version can break your code: component names, prop signatures, or default behaviours may have changed, causing runtime errors or visual regressions. **Best practices:** * **Backup & branch** – never upgrade directly on your production branch. * **Incremental steps** – if possible, jump through intermediate versions. * **Full regression testing** – visual, functional, and accessibility. * **Refactor where needed** – sometimes a small rewrite beats endless patching. Need help? Contact your **Customer Success Manager** to coordinate with our Digital team for a guided upgrade plan. *** ## 5. Continuous Accessibility Testing[​](#5-continuous-accessibility-testing "Direct link to 5. Continuous Accessibility Testing") | Tool | When to Use | Quick Start | | ----------------------------- | ------------------------------ | --------------------------------------------------------- | | **Lighthouse** | Automated baseline audits | DevTools → *Lighthouse* → run **Accessibility** report. | | **axe DevTools** | In‑browser issue surfacing | Install extension → scan page. | | **Keyboard‑only walkthrough** | Manual navigation, focus traps | Use `Tab`, `Shift + Tab`, `Enter`, `Space`. | | **Screen reader** | Semantic / ARIA verification | VoiceOver (macOS), NVDA (Windows), or TalkBack (Android). | Run these checks **after every library upgrade and before each release**. *** ## 6. Additional Resources[​](#6-additional-resources "Direct link to 6. Additional Resources") * **Custom Components Guide** – * **WCAG 2.1 AA** – * **Storefront Toolkit CLI** – `sfb-toolkit --help` *** ### Need Assistance?[​](#need-assistance "Direct link to Need Assistance?") Reach out to your **AppDirect Customer Success Manager**. Our Digital team can: * Review upgrade strategies * Pair on accessibility fixes * Validate final compliance before go‑live --- # Components Schema The schema is an important concept within `sfb-theme-components`. It determines whether components are customizable through the Theme Editor. For example, you can define branding properties like `height` or `background-colour` in a component that Marketplace Managers can later customize with the Theme Editor. Therefore, you enable users to enrich existing theme components without the need for coding expertise. The following table lists the properties that you can specify for your component's schema so your Marketplace Manager can customize your components with the Theme Editor. | Property name | Description | Type | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | | name | The name of the component. This name must be unique and identifies the component to use in the theme. | String | | title | The title of the component to display in the Theme Editor. | String | | iconName | The icon that will be displayed in the Theme Editor for this component. | String | | orderableSection | The sections or storefront pages to which users can add this component with the Theme Editor. | Array of *constants/namespaces.js* enum | | menus | The different menu(s) created in the Theme Editor that the component can consume. | Array of *constants/menus.js* enum | | hasChildrenComponents | This property indicates if a component has children components or not. | Boolean | | form | The branding properties that a user can customize in the Theme Editor for this component. Each branding property can be associated with a . | Object | ## How do components consume the schema form?[​](#how-do-components-consume-the-schema-form "Direct link to How do components consume the schema form?") Let's create a custom `Banner` component as an example. This `Banner` component displays some promotional text. ``` import React from 'react'; import PropTypes from 'prop-types'; import { COLORPICKER, INPUT, SLIDER } from '@appdirect/sfb-theme-components/src/constants/schemaComponentTypes'; import withListener from '@appdirect/sfb-theme-components/src/components/withListener'; import './styles/Banner.scss'; const Banner = props => { const { settings = {} } = props; const { title, backgroundColor, textColor, height, } = settings; const bannerStyle = { backgroundColor, color: textColor, height: `${height}px` }; return (
{title}
); }; Banner.schema = () => ({ name: 'Banner', title: 'Banner', iconName: 'carousel', form: { title: { title: 'Banner title', placeholder: 'Banner title', defaultValue: 'My awesome banner title', type: INPUT, required: true, validation: { pattern: /^[a-zA-Z0-9 ]+$/gm, message: 'Invalid text' } }, backgroundColor: { title: 'Banner background color', defaultValue: '#0076ce', type: COLORPICKER }, textColor: { title: 'Banner text color', defaultValue: '#ffffff', type: COLORPICKER }, height: { title: 'Banner height', type: SLIDER, required: true, defaultValue: 35, options: { step: 1, min: 0, max: 100 } } } }); const SETTINGS = Banner.schema().form; export default withListener(Banner); ``` As you can see, in this component the schema specifies `Banner` as the name, `Banner` as the title, and `carousel` as the iconName. The Marketplace Manager can customize these branding properties in the Theme Editor: * Title * Background colour * Text colour * Height A Marketplace Manager can now customize this `Banner` component in the Theme Editor and save the form settings into the database. Every component has a `settings` prop that receives the form setting changes made by the Marketplace Manager in the Theme Editor, so the component can receive and render the form setting customizations. Note that this is done by server-side component rendering: the corresponding settings for each component are automatically injected. This is how the settings props in the component are retrieved and the customizations are applied: ``` const { settings = {} } = props; const { title, backgroundColor, textColor, height, } = settings; ``` ## withListener HOC[​](#withlistener-hoc "Direct link to withListener HOC") Note that the `Banner` code snippet above uses the `withListener` HOC. This HOC enables you to make the component send a custom event in the Theme Editor preview panel on each form setting change. Therefore, you would be able to see your form setting changes live in the Theme Editor preview panel. ## Storybook knobs[​](#storybook-knobs "Direct link to Storybook knobs") After you add a schema form that contains branding properties associated with a [schema component type](/storefront/reference/custom-components/schema-types.md), you can test the prop settings through [Storybook knobs](https://www.npmjs.com/package/@storybook/addon-knobs). The [Storybook knobs](https://www.npmjs.com/package/@storybook/addon-knobs) feature enables you to edit props dynamically using the Storybook UI so that you can preview your schema form setting changes. Each [schema component type](/storefront/reference/custom-components/schema-types.md) is mapped to an appropriate knob. You can edit the value in Storybook UI with knobs for each schema component type. | Schema Component Type | Knobs | | --------------------- | ----------- | | INPUT | text | | TEXTAREA | text | | DROPDOWN | select | | TOGGLE | boolean | | TOGGLE\_CHECK | boolean | | COLORPICKER | color | | RADIO | select | | CHECKBOX | optionsKnob | | IMAGE\_UPLOADER | object | | SLIDER | number | ## Screenshot[​](#screenshot "Direct link to Screenshot") ![Knobs](/assets/images/KNOBS-54b38a1c5b3f55b86583c8b94c3a10f8.png) ## Marketplace data[​](#marketplace-data "Direct link to Marketplace data") If you want to retrieve specific field data from the page object (available in the data viewer in the toolkit's toolbar), you can specify that in the schema object through the `marketplaceData` object. ![DATA\_VIEWER](/assets/images/DATA_VIEWER-3053a9c1f0dfbcbdcd71563c69c5bcf3.png) ### Example[​](#example "Direct link to Example") The `TabsMenu` component needs to get the following data from the page object: * The list of items * The list of call to action buttons * The list of images In the schema object with the `marketplaceData` object, you need to map each attribute to a page object's field: ``` marketplaceData: { summary: 'application.summary', callToActions: 'application.callToActions', items: 'application.navigation.items' } ``` Then you can use the `marketplaceData` properties in your component through the `data` props: ``` TabsMenuComponent.propTypes = { data: PropTypes.shape({ items: PropTypes.arrayOf( PropTypes.shape({ label: PropTypes.string, href: PropTypes.string, value: PropTypes.string, selected: PropTypes.bool }) ), summary: PropTypes.shape({ logoSrc: PropTypes.string, title: PropTypes.string }), callToActions: PropTypes.shape({ items: PropTypes.arrayOf( PropTypes.shape({ label: PropTypes.string, tooltip: PropTypes.string, isPrimary: PropTypes.bool, disabled: PropTypes.bool, url: PropTypes.string, actionType: PropTypes.string }) ) }) }) } ``` --- # Schema Component Types * [INPUT](#input) * [TEXTAREA](#textarea) * [DROPDOWN](#dropdown) * [TOGGLE](#toggle) * [TOGGLE\_CHECK](#toggle_check) * [COLORPICKER](#colorpicker) * [RADIO](#radio) * [CHECKBOX](#checkbox) * [SLIDER](#slider) * [GROUP\_HEADER](#group_header) * [SPACER](#spacer) * [SLIDES](#slides) * [PRODUCTS\_LIST](#product_list) * [IMAGE\_UPLOADER](#image_uploader) * [TABS\_LIST](#tabs_list) * [DRAWER\_LIST](#drawer_list) * [LOGO](#logo) * [Conditional rendering of schema form settings](#conditional-rendering-of-schema-form-settings) ### INPUT[​](#input "Direct link to INPUT") #### Description[​](#description "Direct link to Description") INPUT types display an input field. #### Screenshot[​](#screenshot "Direct link to Screenshot") ![INPUT](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAABMCAYAAABOBlMuAAABSGlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8rAxMDFwMFgyqCZmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsgsmTvsV/Y8rNj37832RB2HTQsx1aMArpTU4mQg/QeI05ILikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whYTUiQM5B9A8gWSM5IBJrB+ALI1klCEk9HYkPtBQEeF1cfH4VQI3NDUw8CziUdlKRWlIBo5/yCyqLM9IwSBUdgKKUqeOYl6+koGBkYGTIwgMIcovpzEDgsGcX2IcTylzAwWHxjYGCeiBBLmsLAsL2NgUHiFkJMZR4DA38LA8O2QwWJRYlwBzB+YylOMzaCsHnsGRhY7/7//1mDgYF9IgPD34n///9e/P//38VA828zMByoBAB39GIyuvaBPwAAAFZlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA5KGAAcAAAASAAAARKACAAQAAAABAAABE6ADAAQAAAABAAAATAAAAABBU0NJSQAAAFNjcmVlbnNob3Qt98ekAAAB1WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNzU8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NzY8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KZKtTUAAAD4pJREFUeAHtnQm0VlMbx5+ETEkRSUUplVSGpQwrLBIqJSwLJaRBA2VIWhnDMqxQhiYLtUqDFaWF1WRsEKVESXNUSgoVMuV+7+/5vvN+533d+95zbvd236v/s9Z7z7D3PmefX+3/efazz9mnVE7CTCYCIiACu0lgn90sr+IiIAIi4AQkJvqPIAIiUCgEJCaFglEHEQERkJjo/4AIiEChENg37lF27txpixcvth9++MEOP/xwq1evnh144IF+mN9//902b95s++23n1WqVMm2bdtm27dvt7Jly9phhx2W66nWrVvn+ytXrmylS5fONU+cnVu3brVff/01zyIHH3ywnydqvY455hjbZx9pbp5AlSAC/yNQKs5ozrvvvmvPPvus7dq1KwkQAejUqZM1b97cPv30U3vwwQftoIMOsnHjxtmLL75ob7zxhp155pnWt2/fZJlghYGk1q1b++aQIUOMhru71r9/f5s/f36eh6lbt66dcMIJKfVC0CZOnOiC1759e7++Nm3a+DGGDx/uwpjnAZUgAiLgBCJ7JuvXr7eBAwd6oXPPPdeqVKliy5cvt3nz5tnQoUOtdu3aVqpUqRSsDRs2tL/++svTUhKKcANP6c8///QzLFu2zH777Tfbf//9DRHB6tSp4/UJ1+vbb7+1GTNmuAeFmMhEQATiE4gsJkuXLk0evW3btsm79bBhw7w78+OPP/6jO0AjXbBggR1wwAFelob99NNP28KFC70rdPnllyePGax8/fXX7v2sXbvWu0+NGjWyrl272r777muLFi2ywYMHe9eqQoUKNmnSJMODoD6BXXHFFcYPw0vCW6pRo4Y99NBDQRabPHlysl5TpkyxESNGeNqOHTusS5cu1q1bt2TeYIU0vCeuByFCnHr27GlHHHFEkEVLEdirCUQWE+7ogXXu3Nlq1apljRs39u5N1apVPYmGFrbvv//eNm7caIgKRuNesmSJr5cpU8ZGjhzp68GfTZs22S233OKbxFmIuUyfPt2IgzzwwAMef+F4/AILvJBgO8oyXC/EID1Wk/4cH906hGPLli3u5bCNsPXo0cOvgWuRicDeTiByZBHB6NixY5LXihUrbPTo0da9e3cXCe7WmWzDhg1JIXnk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) #### Properties[​](#properties "Direct link to Properties") | Property name | Description | | ------------------ | ------------------------------------------------------------------------- | | title | The label text for the input field. | | placeholder | The placeholder text for the input field. | | defaultValue | The default value text for the input field. | | type | The schema component type: **INPUT**. | | required | Specify whether the input field value is required. **true** or **false**. | | validation.pattern | The regex expression to validate the input field value. | | validation.message | The error validation message text. | #### Form Schema Example[​](#form-schema-example "Direct link to Form Schema Example") ``` sliderTitle: { title: 'Slider Title', placeholder: 'Slider title', defaultValue: 'Slider title', type: INPUT, required: true, validation: { pattern: /^[a-zA-Z0-9 ]+$/gm, message: 'This field is invalid' } }, ``` ### TEXTAREA[​](#textarea "Direct link to TEXTAREA") #### Description[​](#description-1 "Direct link to Description") TEXTAREA types display a multi-line plain-text editing control. #### Screenshot[​](#screenshot-1 "Direct link to Screenshot") ![TEXTAREA](data:image/png;base64,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) #### Properties[​](#properties-1 "Direct link to Properties") | Property name | Description | | ------------------ | ----------------------------------------------------------------------------------------- | | title | The label text for the multi-line plain-text field. | | placeholder | The placeholder text for multi-line plain-text field. | | defaultValue | The default value text for multi-line plain-text field. | | type | The schema component type: **TEXTAREA**. | | required | Specify whether the multi-line plain-text field value is required. **true** or **false**. | | validation.pattern | The regex expression to validate the multi-line plain-text field value. | | validation.message | The error validation message text. | #### Form Schema Example[​](#form-schema-example-1 "Direct link to Form Schema Example") ``` description: { title: 'Description', placeholder: 'Description', defaultValue: 'Description', type: TEXTAREA, required: true, validation: { pattern: /^[a-zA-Z0-9 ]+$/gm, message: 'This field is invalid' } } ``` ### DROPDOWN[​](#dropdown "Direct link to DROPDOWN") #### Description[​](#description-2 "Direct link to Description") DROPDOWN types display a control that provides a menu of options through a dropdown list. One option can be selected. #### Screenshot[​](#screenshot-2 "Direct link to Screenshot") ![DROPDOWN](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ8AAABUCAYAAACcEbK+AAABSGlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8rAxMDFwMFgyqCZmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsgsmTvsV/Y8rNj37832RB2HTQsx1aMArpTU4mQg/QeI05ILikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whYTUiQM5B9A8gWSM5IBJrB+ALI1klCEk9HYkPtBQEeF1cfH4VQI3NDUw8CziUdlKRWlIBo5/yCyqLM9IwSBUdgKKUqeOYl6+koGBkYGTIwgMIcovpzEDgsGcX2IcTylzAwWHxjYGCeiBBLmsLAsL2NgUHiFkJMZR4DA38LA8O2QwWJRYlwBzB+YylOMzaCsHnsGRhY7/7//1mDgYF9IgPD34n///9e/P//38VA828zMByoBAB39GIyuvaBPwAAAFZlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA5KGAAcAAAASAAAARKACAAQAAAABAAABD6ADAAQAAAABAAAAVAAAAABBU0NJSQAAAFNjcmVlbnNob3QhGbQiAAAB1WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNzE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+ODQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K6QJ+QwAAD1NJREFUeAHtnXfMFMUbxx+a0lSaAjZeLKgkKNgVFXsNYomJkX8sIKJYiCgKFlARjViwREVsUcCagBqMgl3EqMGGikYFC4gIalBsqL8fn8fMZrn33bvd4/ZtfCe527ndmdnZz+1895lndnea/G9NMAUREAERyEigacb0Si4CIiACTkDioRNBBESgLAISj7KwKZMIiIDEQ+eACIhAWQQkHmVhUyYREAGJh84BERCBsghIPMrCpkwiIAISD50DIiACZRFoXirXP//8Y0uWLPFkm266qbVs2TLK8t1339nff/9t7du3t7Zt20brkyLLli2zP//80wrLSUq/dOlSW716der0SeVovQiIQOUJNBuzJhQrdsWKFTZkyBCbOXOm9e7d2zp37hwlHzx4sM2YMcOaNGliu+yyS7Q+KTJy5EibNm2ai8F2222XlCxaf95559kTTzxhVVVV1q1bt2h9PML22bNnu4B17NgxvklxERCBHAmUtDwque/DDz/csFa22WabihU7a9YsL7Nnz57Wo0ePipWrgkRABIoTqKh4/PvvvzZ16lSjQa9cudKthTPOOMN69erltViwYIF98cUXkZWyePFiu/HGG23hwoXWoUMH69+/vz377LOeb9SoUVHNSTds2DD7+uuvrVOnTjZixAhDLM466ywXDhJOnjzZ5s6da5dffnmUTxEREIH8CGQSj/vvv9+7B6E6v/32W4j6cuLEifbSSy9Zs2bNrEWLFvbll1/a6NGj7aabbjK6KTR+LI+ff/7ZfRnDhw+3P/74w9OvWrXK7rvvvrXKCz8QpBCWL19u48aNsylTppie6QtUtBSB2ieQabTl888/t7fffjv6xKuLczMIx6RJk+zRRx+1fv36eRL8HIVhzpw5kXAgSqRJ8psgPJSHD4Twyy+/2K+//mp33323de3a1dcNGjRIVoeT0JcI1A6BTJZH3759rUuXLlHNpk+fbozGED777LNo/dixYz3+008/+ZLuSmFYtGiRr8IJ265dO4/jE3n//fcLk9q+++5rrVq1sj333DPahqWSZoQnyqCICIhARQlkEo+jjz468l9QC/wToesSlogJ3RYC/gk+bdq08d/xr6ZN/zN6GLoNIQhR+B2WYYSn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) #### Properties[​](#properties-2 "Direct link to Properties") | Property name | Description | | ------------------ | --------------------------------------------------------------------------------- | | title | The label text for the dropdown list field. | | defaultValue | The default option value for the dropdown list field. | | type | The schema component type: **DROPDOWN**. | | required | Specify whether the dropdown list field value is required. **true** or **false**. | | options | The menu of options for the dropdown list. | | validation.default | The default option text to display when no options were selected | #### Form Schema Example[​](#form-schema-example-2 "Direct link to Form Schema Example") ``` const HEIGHT_OPTIONS = [ { value: 400, label: 'Small 400px' }, { value: 555, label: 'Medium 555px' }, { value: 660, label: 'Large 660px' } ]; height: { title: 'Height', type: DROPDOWN, required: false, defaultValue: HEIGHT_OPTIONS[1].value, options: HEIGHT_OPTIONS, validation: { default: 'Select' } } ``` ### TOGGLE[​](#toggle "Direct link to TOGGLE") #### Description[​](#description-3 "Direct link to Description") TOGGLE types display a control that provides a switch between two different options. #### Screenshot[​](#screenshot-3 "Direct link to Screenshot") ![TOGGLE](data:image/png;base64,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) #### Properties[​](#properties-3 "Direct link to Properties") | Property name | Description | | ------------- | ------------------------------------------------- | | labelOn | The label text to display when the switch is on. | | labelOdd | The label text to display when the switch is off. | | defaultValue | The default switch option. **true** or **false**. | | type | The schema component type: **TOGGLE**. | #### Form Schema Example[​](#form-schema-example-3 "Direct link to Form Schema Example") ``` showRatings: { labelOn: 'uieditor.sfbComponent.productBanner.showRatings.labelOn', labelOff: 'uieditor.sfbComponent.productBanner.showRatings.labelOff', defaultValue: true, type: TOGGLE } ``` ### TOGGLE\_CHECK[​](#toggle_check "Direct link to TOGGLE_CHECK") #### Description[​](#description-4 "Direct link to Description") TOGGLE\_CHECK types display a control that provides a checkbox to switch between two different options. #### Screenshot[​](#screenshot-4 "Direct link to Screenshot") ![TOGGLE\_CHECK](data:image/png;base64,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) #### Properties[​](#properties-4 "Direct link to Properties") | Property name | Description | | ------------- | ----------------------------------------------------------------------------------- | | label | The label text for the checkbox field. | | defaultValue | The default option value for the checkbox field. **true** or **false**. | | type | The schema component type: **TOGGLE\_CHECK**. | | marginSize | The margin between the checkbox field in pixel (px). | | indentSize | The left padding for the checkbox field. The value is multiplied by 25 pixels (px). | #### Form Schema Example[​](#form-schema-example-4 "Direct link to Form Schema Example") ``` isDisplayCarets: { label: 'Display carets', defaultValue: true, type: TOGGLE_CHECK, marginSize: 10, indentSize: 0 }, ``` ### COLORPICKER[​](#colorpicker "Direct link to COLORPICKER") #### Description[​](#description-5 "Direct link to Description") COLORPICKER types display a control that provides a color palette to select a specific color. #### Screenshot[​](#screenshot-5 "Direct link to Screenshot") ![COLORPICKER](/assets/images/COLORPICKER-9e37dbf3d9040591b470193625888d9f.png) #### Properties[​](#properties-5 "Direct link to Properties") | Property name | Description | | ------------- | --------------------------------------------------------------- | | title | The label text for the color picker field. | | defaultValue | The default color value in hex code for the color picker field. | | type | The schema component type: **COLORPICKER**. | #### Form Schema Example[​](#form-schema-example-5 "Direct link to Form Schema Example") ``` backgroundColor: { title: 'Backround color', defaultValue: '#474747', type: COLORPICKER }, ``` ### RADIO[​](#radio "Direct link to RADIO") #### Description[​](#description-6 "Direct link to Description") RADIO types display a control that provides a menu of options (also known as radio buttons). One option can be selected. #### Screenshot[​](#screenshot-6 "Direct link to Screenshot") ![RADIO](data:image/png;base64,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) #### Properties[​](#properties-6 "Direct link to Properties") | Property name | Description | | ------------- | -------------------------------------------------------------------------------------- | | title | The label text for the radio button group field. | | required | Specify whether the radio button group field value is required. **true** or **false**. | | defaultValue | The default value the radio button group field. | | type | The schema component type: **RADIO**. | #### Form Schema Example[​](#form-schema-example-6 "Direct link to Form Schema Example") ``` const SLIDE_SIZES = [ { value: 'xsmall', label: 'X-Small' }, { value: 'small', label: 'Small' }, { value: 'medium', label: 'Medium' }, { value: 'large', label: 'Large' }, ]; size: { title: 'Size', required: true, defaultValue: SLIDE_SIZES[0].value, options: SLIDE_SIZES, type: RADIO } ``` ### CHECKBOX[​](#checkbox "Direct link to CHECKBOX") #### Description[​](#description-7 "Direct link to Description") CHECKBOX types display a control that provides a menu of options through checkboxes group. Multiple options can be selected. #### Screenshot[​](#screenshot-7 "Direct link to Screenshot") ![CHECKBOX](data:image/png;base64,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) #### Properties[​](#properties-7 "Direct link to Properties") | Property name | Description | | ------------- | ----------------------------------------------------------------------------------------- | | required | Specify whether the checkbox group field value is required. **true** or **false**. | | defaultValue | The default value the checkbox group field. | | options | The menu of options for the checkbox group field. | | type | The schema component type: **CHECKBOX**. | | marginSize | The margin between the checkbox group field in pixel (px). | | indentSize | The left padding for the checkbox group field. The value is multiplied by 25 pixels (px). | #### Form Schema Example[​](#form-schema-example-7 "Direct link to Form Schema Example") ### SLIDER[​](#slider "Direct link to SLIDER") #### Description[​](#description-8 "Direct link to Description") SLIDER types display a control that provides a slider to specify a numeric value between a specified minimum and maximum value. #### Screenshot[​](#screenshot-8 "Direct link to Screenshot") ![SLIDER](data:image/png;base64,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) #### Properties[​](#properties-8 "Direct link to Properties") | Property name | Description | | ------------- | ---------------------------------------- | | title | The label text for the slider field. | | defaultValue | The default value of the slider field. | | type | The schema component type: **CHECKBOX**. | | options.min | The minimum numeric value | | options.max | The maximum numeric value | | options.step | The step numeric value | #### Form Schema Example[​](#form-schema-example-8 "Direct link to Form Schema Example") ``` borderRadius: { title: 'uieditor.sfbComponent.sliderComponent.borderRadius.title', type: SLIDER, defaultValue: 8, options: { min: 0, max: 35, step: 1 } } ``` ### GROUP\_HEADER[​](#group_header "Direct link to GROUP_HEADER") #### Description[​](#description-9 "Direct link to Description") GROUP\_HEADER types display a group header text. #### Screenshot[​](#screenshot-9 "Direct link to Screenshot") ![GROUP\_HEADER](data:image/png;base64,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FiRAAqERoBCFxo9XkwAJOEAg85HVmdwAixJiDmgELMlsnRQfq15g5sbixYsLpm7NKhw/flyX8vHOx991mHYW083aTe8vH54nARKIDgLXZczlPDaYomA61d69e+u681jrHlOvmoD5n7G6KuaRNktLmzhf22HDhun6aBAWLPWTVcA6Yx9++KHExcX5ndge8ZhLG2Lo1kT9WZWT8SRAAvYIBG0R2cveXqq7775b1w7DMj5OBazaAcsME+JXq1bNqWyZDwmQgAsEwiJEly9flgULFuiSPmfPnlUr5rHHHpOEhAStUlpami4/ZKynQ4cOyZQpU3ShQ0zI37ZtW11BFsv6jBw50oMB6fr37y/79++XUqVKyZAhQ1R4Hn/8cRUhJJw9e7akpqbK008/7bmOOyRAAtFFwBEhmjNnjjaBTNXOnz9vdnWblJQkX375pa70gZVef/nlFxk1apS89NJL2hSDkMB6wVpi8P0MGjRI/vzzT02PxRK9V241mUPcTDh58qSuSTZ//nxdetqc55YESCD6CTjSa/bzzz/riq9Y9RUfa4Bj2YjQrFmzZOHChdKsWTNNkpycbE2q+1hPzIgQBA5pjKXknRj+JORn1qbHMtJ//PGHzJw507NEdI8ePWgNeYPjMQlEGQFHLCKsbx8bG+up2qJFi3SxRZzYvXu35/y4ceN0/8yZM7pFk8w77N27V0/BAV6sWDHdhw9py5Yt3kmlUaNGughi/fr1PXGwoOz01Hku4A4JkEDECTgiRPfee6/H34MapaSkiGmemS26+7EIIwL8OfhgEUPvYBY9xEKHJuBaX8H01PnKx1d6niMBEohOAo4IUWZVq1ixoid68uTJEhMTo8tPr169+goryiRClzwCloVOT0/XNOiKDzZYBS3YPHgdCZCAuwRcF6IaNWqovwbOaKwjn5iYKN999536gbp06XJV7dDMg48H/p6BAwdeFW/3hBlgOW/ePEFzr1+/fnYvZToSIIEwEwjaWY3Biv6CaYIhHukmTJigvWPwDcESQmjTpo106tRJ961/cO306dOlZcuWEh8fL02aNJHu3btrEmu+1mt87bdv316bgnB8b9y40VcSniMBEogSAmGdsxqigC56q2PbmwOaY+jWRzc/xv4UKVJEXnzxRUFvGpzSo0eP9r7E7/G///6rvirklTdvXr/pGEECJBBZAmEVIjtVhWMa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) #### Properties[​](#properties-9 "Direct link to Properties") | Property name | Description | | ------------- | --------------------------------------------- | | title | The label text for the group header. | | type | The schema component type: **GROUP\_HEADER**. | #### Form Schema Example[​](#form-schema-example-9 "Direct link to Form Schema Example") ``` sliderSettings: { title: 'Settings', type: GROUP_HEADER }, ``` ### SPACER[​](#spacer "Direct link to SPACER") #### Description[​](#description-10 "Direct link to Description") SPACER types display a vertical space of 24px. #### Screenshot[​](#screenshot-10 "Direct link to Screenshot") N/A #### Properties[​](#properties-10 "Direct link to Properties") | Property name | Description | | ------------- | -------------------------------------- | | type | The schema component type: **SPACER**. | #### Form Schema Example[​](#form-schema-example-10 "Direct link to Form Schema Example") ### SLIDES[​](#slides "Direct link to SLIDES") #### Description[​](#description-11 "Direct link to Description") SLIDES types display a control that manages slides for the Carousel component. #### Screenshot[​](#screenshot-11 "Direct link to Screenshot") ![SLIDES](/assets/images/SLIDES-0ae569754a22cc14ca3f21dba6d20524.png) #### Properties[​](#properties-11 "Direct link to Properties") | Property name | Description | | ------------- | ----------------------------------------------------------------------------------------- | | required | Specify whether the checkbox group field value is required. **true** or **false**. | | defaultValue | The default value the checkbox group field. | | options | The menu of options for the checkbox group field. | | type | The schema component type: **CHECKBOX**. | | marginSize | The margin between the checkbox group field in pixels (px). | | indentSize | The left padding for the checkbox group field. The value is multiplied by 25 pixels (px). | #### Form Schema Example[​](#form-schema-example-11 "Direct link to Form Schema Example") ### PRODUCTS\_LIST[​](#products_list "Direct link to PRODUCTS_LIST") #### Description[​](#description-12 "Direct link to Description") PRODUCTS\_LIST types display a control that manages the product list of the Slider component for product curation. #### Screenshot[​](#screenshot-12 "Direct link to Screenshot") ![PRODUCTS\_LIST](data:image/png;base64,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) #### Properties[​](#properties-12 "Direct link to Properties") | Property name | Description | | ------------------------ | -------------------------------------------------------------------- | | title | The product list title. | | defaultValue.items | The array of product list. | | defaultValue.contentType | The product list curated type. **manual** or **dynamic**. | | type | The schema component type: **PRODUCT\_LIST**. | | required | Specify whether the product list is required. **true** or **false**. | #### Form Schema Example[​](#form-schema-example-12 "Direct link to Form Schema Example") ``` productsList: { title: 'Products', defaultValue: { items: [], contentType: DYNAMICALLY_CURATED_CONTENT_TYPE }, type: PRODUCTS_LIST, required: true } ``` ### IMAGE\_UPLOADER[​](#image_uploader "Direct link to IMAGE_UPLOADER") #### Description[​](#description-13 "Direct link to Description") IMAGE\_UPLOADER types displays a control that allows image uploading. #### Screenshot[​](#screenshot-13 "Direct link to Screenshot") ![IMAGE\_UPLOADER](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQwAAABbCAYAAACGcLtoAAABSGlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8rAxMDFwMFgyqCZmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsgsmTvsV/Y8rNj37832RB2HTQsx1aMArpTU4mQg/QeI05ILikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whYTUiQM5B9A8gWSM5IBJrB+ALI1klCEk9HYkPtBQEeF1cfH4VQI3NDUw8CziUdlKRWlIBo5/yCyqLM9IwSBUdgKKUqeOYl6+koGBkYGTIwgMIcovpzEDgsGcX2IcTylzAwWHxjYGCeiBBLmsLAsL2NgUHiFkJMZR4DA38LA8O2QwWJRYlwBzB+YylOMzaCsHnsGRhY7/7//1mDgYF9IgPD34n///9e/P//38VA828zMByoBAB39GIyuvaBPwAAAFZlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA5KGAAcAAAASAAAARKACAAQAAAABAAABDKADAAQAAAABAAAAWwAAAABBU0NJSQAAAFNjcmVlbnNob3TcylGzAAAB1WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNjg8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+OTE8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KqfzwzgAAH7pJREFUeAHt3Qm8rtX0B/BdZjJmJhUVJUopUnGbpVGJKEJIw9VApCQzpUT3hga3rmZp1Fy4UaJUIpIhGSpjlDHT/3++u886ds99nve87xnuueeevT6f932ed8977bV+e+39PO9ei/3fEKVKlQOVA5UDfXBg8T7S1CSVA5UDlQOZAxUwqiBUDlQO9M2BChh9s6omrByoHKiAUWWgcqByoG8OVMDom1U1YeVA5UAFjCoDlQOVA31z4P69Uv7nP/9Jt99++3xJHv7wh6dHPepR84WPNqCsZ6mllhptMQtNvrvuuivdfffd6aEPfWhacskl52vXr3/96/Svf/0rPeIRj0iPfOQj54uvAZUDCysHFuv1Hsbvfve7tPPOO7e2naAfeOCBaYUVVmiNHyTwtttuS7vuumvOcs4556TFFltskOwLXdrjjjsunXXWWWmNNdbIPGo2cIcddkh//vOf07bbbpt22mmnZnT9XTmw0HKg7yXJs5/97LTeeuulddZZJz34wQ9OZtGDDz54oe1YbVjlQOXA+HOg55KkrO41r3lNes5znpODTjnllOTz73//ezjJ+eefn84444z0xz/+MYc95SlPyVYDoEH/+Mc/0mc/+9l0zTXXpL/97W/p8Y9/fHr961+f1lprrRxffjHn3//+96e//OUvOV46Vshhhx2Wfvazn6XHPOYxaYsttkgXXnhhWnrppdP++++f01s+7bjjjrltd9xxR57lmf9HHHFE+slPfpL++9//pmc84xlpjz32SJY+f/3rX9M+++yTq/7EJz6RHvawh6Uf/vCH6fDDD891fPSjHx0ud7vttkunn356Uu5jH/vY9I53vCOttNJKOe9VV12Vjj/++PTb3/42Pf3pT09PeMITyu6MeH/IIYekn/70p2nLLbdM+KiOpz3taemAAw5IrBU8W3zxxbNF8qpXvSqXx/o78sgj04033pj++c9/ZhCfMWNG2mWXXdL97ne/zG/9uPbaa9ODHvSgpP0XXXRR8mIvfgj7+c9/nmbNmpVuvfXW9JCHPCStueaaeczuf/++xWLEvtUEixYH+paMefPmZaH+05/+lC644ILMBQKOrrzyynTUUUfle6BCcX7xi1+kgw46KH3xi1/M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) #### Properties[​](#properties-13 "Direct link to Properties") | Property name | Description | | ------------- | -------------------------------------------------------------------------------------------- | | title | The label text for the image upload field. | | caption | The caption text to display below the image upload field. | | placeholder | The placeholder text to display inside the image upload field. | | defaultValue | The default value of the image upload field. An object with **filename**, **type**, **url**. | | type | The schema component type: **IMAGE\_UPLOADER**. | | required | Specify whether the image upload field is required. **true** or **false**. | #### Form Schema Example[​](#form-schema-example-13 "Direct link to Form Schema Example") ``` backgroundImg: { title: 'Background Image', caption: 'Supports JPG and PNG formats up to 2MB.', placeholder: 'Choose File', defaultValue: {}, type: IMAGE_UPLOADER, required: false, } ``` ### TABS\_LIST[​](#tabs_list "Direct link to TABS_LIST") #### Description[​](#description-14 "Direct link to Description") TABS\_LIST types display a control that manages the tab list of the ProductTabMenu component. #### Screenshot[​](#screenshot-14 "Direct link to Screenshot") ![TABS\_LIST](/assets/images/TABS_LIST-3c6c62672f6d1b4e93fdec97d1014030.png) #### Properties[​](#properties-14 "Direct link to Properties") | Property name | Description | | ------------- | ------------------------------------------ | | type | The schema component type: **TABS\_LIST**. | | defaultValue | Specify an array of tab items. | #### Form Schema Example[​](#form-schema-example-14 "Direct link to Form Schema Example") ``` const PROFILE_TABS = { overview: { label: '', defaultLabel: 'uieditor.tabs.overview', href: '/en-US/apps/163915/talech/overview', value: 'overview', selected: true, isEditMode: false, isVisible: true }, features: { label: '', defaultLabel: 'uieditor.tabs.features', href: '/en-US/apps/163915/talech/features', value: 'features', selected: false, isEditMode: false, isVisible: true }, reviews: { label: '', defaultLabel: 'uieditor.tabs.review', href: '/en-US/apps/163915/talech/reviews', value: 'reviews', selected: false, isEditMode: false, isVisible: true } }; pageTabs: { type: TABS_LIST, defaultValue: [ PROFILE_TABS.overview, PROFILE_TABS.features, PROFILE_TABS.reviews ] } ``` ### DRAWER\_LIST[​](#drawer_list "Direct link to DRAWER_LIST") #### Description[​](#description-15 "Direct link to Description") DRAWER\_LIST types display a control that manages a expandable list with custom forms. #### Screenshot[​](#screenshot-15 "Direct link to Screenshot") ![DRAWER\_LIST](/assets/images/DRAWER_LIST-65d8611a7f25c85c577165e36a6a7bc9.png) #### Properties[​](#properties-15 "Direct link to Properties") | Property name | Description | | ------------- | ---------------------------------------------------------------------------------------------- | | type | The schema component type: **DRAWER\_LIST**. | | defaultValue | Specify an array of drawer items, the expandable form object and allowed context menu options. | #### Form Schema Example[​](#form-schema-example-15 "Direct link to Form Schema Example") ``` const DRAWER_LIST_ITEMS = { items: [ { label: 'Facebook', icon: 'facebook', values: { accountLink: { value: 'https://www.facebook.com' } } }, { label: 'Twitter', icon: 'twitter', values: { accountLink: { value: 'https://www.twitter.com' } } } ], form: { accountLink: { title: 'account link', placeholder: 'placeholder', defaultValue: '', type: INPUT, required: false, validation: { pattern: /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([-.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/g, message: 'Invalid field' } }, uploadIcon: { title: 'upload icon', caption: 'caption', placeholder: 'placeholder', buttonText: 'buttonText', defaultValue: '', type: IMAGE_UPLOADER, required: false } }, contextMenuOptions: ['SHOW_HIDE'] }; drawerList: { type: DRAWER_LIST, defaultValue: DRAWER_LIST_ITEMS } ``` #### Description[​](#description-16 "Direct link to Description") LOGO types display a control that manages which logo (light, dark, no logo) is displayed. Logo image urls are saved in the css properties as --logoImage (lightLogo) and --darkLogo. #### Screenshot[​](#screenshot-16 "Direct link to Screenshot") ![LOGO](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAR8AAACFCAYAAABi3fzcAAABRGlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8rAysDHwMmgyqCZmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsist7z18ar5dxRdmvakzXMT+IOpHgVwpaQWJwNpkLrU5IKiEgYGxhQgW7m8pADE7gCyRYqAjgKy54DY6RD2BhA7CcI+AlYTEuQMZN8AsgWSMxKBZjC+ALJ1kpDE05HYUHtBgNvF1cdHIdTIxNCUgGvJACWpFSUg2jm/oLIoMz2jRMERGEqpCp55yXo6CkYGRoYMDKAwh6j+fAMcloxiHAix/I8MDObngIxjCLGEyQwM294Bvf0dIaYWxMAg6MLAsLegILEoEe4Axm8sxWnGRhA293YGBtZp//9/DmdgYNdkYPh7/f//39v///+7jIGB+RYDw4FvAHSnYFfBiQPbAAAAVmVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADkoYABwAAABIAAABEoAIABAAAAAEAAAEfoAMABAAAAAEAAACFAAAAAEFTQ0lJAAAAU2NyZWVuc2hvdPq8t6EAAAHWaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI4NzwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlVzZXJDb21tZW50PlNjcmVlbnNob3Q8L2V4aWY6VXNlckNvbW1lbnQ+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xMzM8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K0kVK5wAAFWJJREFUeAHtnQlsVFXbx59pC4IKVaACUjYhrG3ZikirCKKCBZECEgkigpHlBZWEEGM+lwoYEwRRgciLVgp+gAp+LNFIREWEDwhSQCkB1LK0lkWQRazsnXf+j977zrQznWHonZk78z9JO/ee/fxO79PnPOfceRxXr151xsXFCQMJkAAJhIJASckRSUqqJ3EOhyMU7bENEiABEvAgQOHjgYM3JEACoSLA9VaoSLMdEiABDwIUPh44eEMCJBAqAnFOpzNUbbEdEiABEjAJ0OZjouAFCZBAKAnElZWVhbI9tkUCJEACSoCaD/8QSIAEwkKAwics2NkoCZAADc78GyABEggLAWo+YcHORkmABKj58G+ABEggLASo+YQFOxslARLgCWf+DZAACYSFAIVPWLCzURIgAR4y5N8ACZBAWAi4vkeMyk9YyLNREohxApQ8Mf4HwOGTQLgIUPiEizzbJYEYJ0DhE+N/ABw+CYSLQJzrC+TD1TbbJQESiGECNDjH8ORz6CQQTgI84RxO+mybBGKYAN/tiuHJ59BJIJwEaHAOJ322TQIxTCAhlGP//Een5P5/meQXOuXcnyK1bhbp0sIhT2XGSb80Oi8M5VywLRIIN4GQaT5j/veqPP9/V+X+FIdsfileTs1PkE2uz96ue8QjPZhQXFwsp06dqlD0woULUlRUJMF458AOIMpevny5Qr2MIAESqBoCIRE+ECwn/hIpyEmQf90TJ9uLnDL72zLZUeyUCa57xJ8olaAE0IQJE+Tpp5+Ws2fPehDZtWuXTJw4UX777TeP+EBuIMxQdv/+/YFkZx4SIIEgCFi+24Wl1uZfnLJyTLz8eMQpXV67IqPmlcm0j8pk1Nwyvd/til85Nl7zIf+1Bmgob7311rUWY34SIIEwErDc5gMbz796/61gjVp4VQ4We44W90+64vP/J0HGu/Ihf7+0eM9Mfu7S09Nl+/btsnnzZsnIyPCaG5rR22+/LQUFBZretm1bee6556ROnTpe87tHYhmWm5srGzdulD///FMaN24s48ePF9SBcOXKFXn33Xdl69atulTr3bu3HDt2TLp27SpZWVnir7x7W7wmgVghYPmyC8blh13G5NW7yyoIHgMyBNCagjIZkOpQY7QRH+hnWlqa9OzZU2bNmqXCoXw5+CZ79tlnZefOnTJ06FAZNmyYCqFnnnlGBUP5/OXvIbQ+++wzyczMlHHjxsn58+fl+eefF9ibEGbMmCHr1q2Tvn37yhNPPCHffvut5Ofny5kzZzTdX3nNxF8kEGMELP8+H+xqNU50yIHfKyeL9Ma3OHQXrPKc3lPHjBmjCXPnzq2QARrR6dOn5cUXX5QhQ4ZIdna2vPrqq3Lu3DlZv359hfzuERAgECYDBgxQwdOnTx+ZPXu2xMfHy7Jly7ReaDwjRozQn/79+0tOTo5Zhb/yZkZekECMEbDc5oPt9OKzTrmjXuVk76grUnTGqdvvlef0nnrzzTerdgNBgyWYe/jll19UWHTp0sWMTklJkWrVqklhYaEZ5+3i8OHDGg3Nyghoq0OHDlr20KFDGt2tWzcjWVq3bq3tIcJfebMQL0ggxghYLnxwjmeNy4j8SEqcNG/snW7zJiIDXOlrdjslvWXw533uvfdeadeunS6//vrLtb32T7h06ZJ4+9K06tWrC9IqC8Z2e0KCp3nMKGuU91Y/6vVXvrK2mUYC0UzAcpsPDhC++/Xf/uDzRsVXEEAQPIjHHtf8b8r0wOH1AJ88ebLgjM97771nVpOcnKxCoOTXEjPuxIkTUlpaKkirLDRq1EiT9+zZY2bD2aG9e/dqWSPdMGQjEzQt49sCjHRf5c1KeUECMUbA89+5BYPHyeXVPzoke8FV3W7HrhaMy7DxYKkFjQeCJ/vfVyXDpSVluYzO1xOSkpJk+PDhsnjxYrOaHj16qDCaOm2qGoqhpcycOVOXRtiZqiw0bNhQWrZsKR988IGg7qZNm8rSpUv1XNHAgQNVADVr1kzrT0xMlBo1anhs+/srX1nbTCOBaCYQkhdLFzweL0k3iqTkXJF5G8ukU7JDJt0bp59zXfepr16R224SQb5gQvklz6BBgwQPvRFgo3n99ddVI5o0aZLahrD1Pm3aNKldu7aRzfwsXx8M1S1atJDp06frgcbvvvtOPw0bEozXSEcbU6dOFcTXqlVLbUqo1F95s2FekEAMEXC4lhDXfqovSEA4QPjB5jLZ7jp0aLzbBRsPlmbXq/EE2iWc08HWuzeh46+Oixcv6lLN/WwQ8H311VeSmpqqmpHD4VCtaOTIkTJlyhS55557zGq9lTcTeUECMUKgpOSI61mpJw6XbcJZ/j99jDCosmE+9dRTWhe2+yF88vLy5Pjx47JkyRJdhlVZQ6yIBKKAgCl8XFqAEw8MQ/AE8P4YTjjv27dPK8ESDO+bwT7EQAIk4EnAFD6hXHZ5doF3JEACsUjAED4hMTjHImCOmQRIoHIClh8yrLx5ppIACcQqAWo+sTrzHDcJhJkANZ8wTwCbJ4FYJWD56xWxCpbjJgESqJwAhU/lfJhKAiRgEQHLv8/Hon6zWhIgAZsTcB1upvJj8zlk90nAlgQoeWw5bew0CdifAIWP/eeQIyABWxKg8LHltLHTJGB/AnHGN+7ZfygcAQmQgJ0I0OBsp9liX0kgigjwhHMUTSaHQgJ2IsB3u+w0W+wrCUQRARqco2gyORQSsBMBCh87zRb7SgJRRIDCJ4omk0MhATsRoPCx02yxryQQRQQSQvnl8XBbc+bMGYEr4ytXrghcEN94441yyy23CHxrMZAACcQOgZBpPkeOHFF3MjVr1pQmTZqoF1B84h5uZpAeTDh27Jj60vJWFn6y4BY5kABhiLrg0yuYgHIoj3oYSIAE/BMIifCBYMHD2bhxY/XkabxJj0949kQ80oMRQDNmzJD169d7HemuXbvUi6jXxHKREICoC25wfIXly5fLoUOHvCbDAyrKHz582Gs6I0mABDwJWP59PlhqYZl12223ebZc7g7p58+fF+SvqgD/WY8++mhVVSdbtmyRo0ePVll9rIgEYpmA5Taf06dPy6233hoQY9h+YBOqKvsPlkFwZdy9e3dtH9rJ0qVL5eDBg+pJtE+fPpoOB39G2LFjh2zevFkFZr169eTJJ5+U+Ph4mT9/vmZZvXq1/PDDDzJu3DijiNfPc+fOyUcffSSFhYWa3qxZMxk2bJgkJibqPd6pgyZVUFCgS7WuXbvK77//Lu3bt5fMzEzVBFetWiXQ3iC869evL0OGDJHmzZt7bY+RJGA3Apa/XgFt5qabbgqIC/LhQauqUFpaKhB+CFjWvfHGG1JcXCz9+/dXgfTpp5+qX3XYhowAYZWRkSH9+vVTQQhhBbtUt27dNAvsVGlpaUZ2r5/w3z5z5kzZv3+/PPDAAwIhd+DAAW0f/UBYvHixbNu2TdtCf/Lz89XjKYQWwrJly2TTpk3SoUMHGTx4sKCPc+bMUfuYZuAvErA5gQSr+w8DrGHj8dcW8lllsIW2AsE2adIkNXijL9Bo1q5d69EtCJ3evXtrHPJv2LBBateuLX379pUvv/xSOnXqZGpSHgXdbqCtQIjAd3ubNm00BUJr3rx58v3330vbtm1l9+7dkpWVJffff7+mJycnyzvvvKPXKAth1KNHDxk4cKDGdezYUV566SXtw4gRIzSOv0jAzgQsNzhjO934b+8PFPIhvxUBGg/qhhAwQkpKinFpfrZs2dK8rlu3bsB9Nwu5LkpKSlTgGoIHabA/of1ff/3VtBulpqaaxbAsM4S0YVfq3LmzmQ7tq1WrVqq5mZG8IAEbE7D8xVI8NFj+BBKQD/mtCJcvX65QLZZH5cMNN9xQPuqa7y9dumQKEvfCED7oh9EXX2esjO9Yqlatmntxwb1R1iOBNyRgQwKW23xgbDbsLv74wNhcp04df9mCSofBFks6GHWNsHfvXuOySj+Ntty37cHgwoULajg2dv4MYzQaLyoqMrWspKQk7Q/sREaAoISh3ChrxPOTBOxKIAFLHUPdt2IQ2LmCIRkPYmUPDtKh9QRqnHbvK84H7dmzxz2qggaFJQx2jxYsWCBDhw6VkydPVrD3eFTg5QacIACaNm0qt99+u5ccf0ehrZUrV8r7778vI0eOVL4wMKP8nXfeqWNs2LCh5sEJ7xo1augunFEhdtlw9gk7a9gBRF7YpnAMoVevXkY2fpKArQlYvtUOOnh4YMfAf3doQhAweBAh+IwdKcQhXzBh3759ulPkXhYPsGE4Rjwe8okTJ8qHH36ohl8sge677z7daofh2dcSyL1O2Ii2b98uP//8s7zyyivuSR4CHEIUbS1cuFBmzZql+SCEx48fbwrXsWPHSl5enixatEjLpqen67Y7+oUwevRoTcvNzdV78ILx2d2OpAn8RQI2JeBwqfMVDR8WDQb/ubH8wPY7lkB40PCgQiBV1dkeX13Hkg5b39g1grBB2zt37lRhNG3aNFMo+CofbDx2zIDYXaPDPbbZYdzG2CH4sMOVk5Mj2MnCjpoRYD8CL+N8kBHPTxKwK4GSkiOSlFRPEvAgBPJfvyoGCgFjtZDx1U8InI8//lgPCPbs2VOFIM75YJfJXTD4Kh9sPDSu8gG8sW2Pn+zsbOW/Zs0aFYjt2rXzyF69enXBDwMJRBuBkGo+4Yb3008/yeeff64H9bCr1bp1a3nkkUcsFT6+xnzq1ClZsWKF+a4YzvkMGjRIGjRo4KsI40kgKggYmo/DZXdxhkrziQpyHAQJkMB1ETCEj+Vb7dfVSxYmARKIWgKWn3COWnIcGAmQwHURoPC5LnwsTAIkECwBy7/PJ9iOsRwJkEB0E3CdXaPyE91TzNGRQGQSoOSJzHlhr0gg6glQ+ET9FHOAJBCZBCh8InNe2CsSiHoCccZ3x0T9SDlAEiCBiCJAg3NETQc7QwKxQ4AnnGNnrjlSEogoApZ/jWpEjZadIQESiBgCNDhHzFSwIyQQWwQofGJrvjlaEogYAhQ+ETMV7AgJxBYBCp/Ymm+OlgQihgB3uyJmKtgREogtAtR8Ymu+OVoSiBgCFD4RMxXsCAnEFgHLnQa644TrHLiwgTsZw3UOvDvAMV64vFq494/XJEACoSMQEqeBGA68isL/FAQNHPrhe4QMp4HHjx+XP/74o1IvoL6QHDt2zExCnaj/el3NoF/woIp+Gk78zEa8XMAFM7yOWumCx0uzjCIBWxMIifCB4MEDDRfA7gHColatWvqDhx35KnND7F7WuJ4xY4ZxaX5Cm+rfv79069YtKJ9kZ8+eFdQ7YcIEadGihVmvr4vZs2dLRkaGZGVl+crCeBIggXIE/vbNWy6yKm+x1MIyq0mTJpVWCz/uxcXF6o/8Wpdg8H/+4IMPqmdQeETdu3evfPLJJyrM4AuLgQRIIPIIWC58IAzgEjiQgCUTbELXKnyQv06dOtpE3bp11Q0xfJF988030qtXL21/w4YNsm7dOhWEWEp17dpVhgwZoprR9OnTZfDgwbJ161YVXC+88IJHd7EkXLBggS6txo0bV+lSDBreqlWrZNeuXdpW/fr1tZ3mzZtrnfgKk+XLl6tfdti90A8s29q3by+ZmZmqIVZW3qNjvCEBGxOw/MVS2HkCtYUgH7SkqggpKSlazdGjRwWeSlevXi1NmzaVYcOGqS/0LVu2aDwywXvokiVL1Jd7hw4dPJqHD/VZs2apUIQfdX82oGXLlsmmTZsE9UCgXbx4UebMmaNeUlHx4sWL1U87lmlYGubn58u+ffvUVzvS/ZVHHgYSiAYClh8yxH932HYCCciH/FURateurdXAfgPNAsu+UaNGqaZhLMVOnjxpNgWN5eWXX5bhw4ebcRA8b775pi7npkyZIomJiWaatwvkhzDp0aOHCp7u3bvL5MmTdfzwyw4Navfu3Wobgn3o7rvvljFjxphV+StvZuQFCUQBAcu32qEp4MEORAAhnz/NIlDmsDUhQAhhSdOqVSvZuHGj2pWgCZUPME7DUO0eoKUgdOrUya/gQT5oWQidO3fWT/yqWbOmtg17lpGemppqpjdr1sxkY6T7Km8W4gUJRAEByzUfPHylpaUBoUI+5K+KcPDgQa0GNqAdO3bIa6+9JlhqYWn38MMPV2gC2+rlA2xV6enpsnPnTiksLCyfXOHe+EraatWqeaTh/vLly/qDBNijvAV/5b2VYRwJ2JWA5cIHDzCMzoEEGJsNw3Eg+X3lgd0IxmW03aBBA5fheb00bNhQYEiGHaZjx44VinrTzB577DEZOnSoakTQggzhUKHwPxFJSUl6deDAATOL0+kUCELs5uEHwV2QFRUVqWaIeH/lkYeBBKKFQAIeDl//iatikNiJgraBczzGw+etXqRD6wnUOO1eB84H7dmzR20zJ06ckK+//loN1/+13zh1Cx+GZWggK1eu1OIQihi/rwCBhGXg448/rrtdX3zxhRqJfeWH9oSzTDBuY+cOAm/t2rXaNnbdMH7EoX0s8XAwcenSpWZ1/sqbGXlBAlFAICSHDPHAwZ6B//LQRiBg8GDDxoOlFoQA4pAvmIDdIvwg4KFu1KiRDBw40KzvoYcekoULF+rSC3nS0tI0DVvxd911F6I8QnktqE2bNtKuXTvduodtyNBQPAr9czN69GhZtGiR5ObmagzqQl9QB8LYsWMlLy9P8yANy7qCggLT1uWvvFbCXyQQBQQcLgHgtFLzcWcEIzAEDbbfjXe7oO1AIF3r2R73egO5xpIJu004UW0YwdEfY1cskDquJc+lS5d0nO47ZNCytm3bpueQMGZwxw5XTk6OYBsfhm0jeCtvpPGTBOxMoKTkiOsfuOvVpVAJHsCCgLFayPialPj4eBVyRjq0DqsED9rA+2Xl3zEDa2y54yc7O1uFz5o1a1QYQrNyD97Ku6fzmgTsTsDh+m/s2+hh99FFYP9hd1qxYoUcOnRIe5ecnCw4dwTDOAMJxAIBQ/Oh8ImF2eYYSSCCCBjCJw5GXwYSIAESCDUBl+kjsFcfQt0xtkcCJBDdBCh5ont+OToSiFgCFD4ROzXsGAlENwEKn+ieX46OBCKWQJy/95UitufsGAmQgK0J0OBs6+lj50nAvgQsf6vdvmjYcxIgASsJWP41qlZ2nnWTAAnYlwANzvadO/acBGxNgMLH1tPHzpOAfQlQ+Nh37thzErA1AQofW08fO08C9iXA3S77zh17TgK2JkDNx9bTx86TgH0JUPjYd+7YcxKwNQF+n4+tp4+dJwH7EqDNx75zx56TgK0JUPjYevrYeRKwLwHafOw7d+w5CdiaAIWPraePnScB+xL4D3xPzXxsJ27ZAAAAAElFTkSuQmCC) #### Properties[​](#properties-16 "Direct link to Properties") | Property name | Description | | ------------- | --------------------------------------------------------------------------- | | type | The schema component type: **LOGO**. | | defaultValue | Specify the default selected logo type ('lightLogo', 'darkLogo', 'noLogo'). | #### Form Schema Example[​](#form-schema-example-16 "Direct link to Form Schema Example") ``` footerLogo: { type: LOGO, defaultValue: 'darkLogo' } ``` ### Conditional rendering of schema form settings[​](#conditional-rendering-of-schema-form-settings "Direct link to Conditional rendering of schema form settings") If you want to disable/hide one schema form setting based on the value of another schema form setting, you can use the `conditionalAttributes` property. #### Properties[​](#properties-17 "Direct link to Properties") Right now, the conditional type is `isDisabled` or `isVisible`: | Conditional types | Description | | -------------------------------- | ------------------------------------------------------------------- | | conditionalAttributes.isDisabled | Disable this schema form setting based on the child condition. | | conditionalAttributes.isVisible | Make this schema form setting visible based on the child condition. | The child condition: | Condition properties | Description | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | when | The name of the schema form setting that the condition depends on | | connector | The connector condition can have one of these values: **equals**, **notEquals**, **include** or **notInclude**
Use **equals** or **notEquals** when the field providing the value to be checked returns a single value (Ex a RADIO input field). You can compare against a single value or an array of values
Use **include** or **notInclude** when the field providing the value to be checked returns an array of values (Ex a CHECKBOX input field). | | value | The value to apply | #### Form Schema Example[​](#form-schema-example-17 "Direct link to Form Schema Example") ``` isDisplayCarets: { label: 'Display Carets', defaultValue: true, type: TOGGLE_CHECK, marginSize: 10 }, isDisplayCaretsOnHover: { label: 'Display Carets On Hover', defaultValue: false, type: TOGGLE_CHECK, conditionalAttributes: { isVisible: { when: 'isDisplayCarets', connector: 'equals', value: true } }, indentSize: 1, marginSize: 10 } ``` --- # General page objects The following data is available for use on all storefront pages: * Configuration data * Metadata * Common data * Navigation data * Internationalization data ## Configuration data[​](#configuration-data "Direct link to Configuration data") The `config` object contains various marketplace settings, user data, and storefront configuration. | Property | Definition | | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `currency` | Contains the current marketplace currency in ISO three-letter format, for example `USD` | | `locale` | Contains information about the storefront locale

\* `code`: ISO language-country code pair, for example `en-US`
\* `current`: Plain-language description of the locale, for example `English (United States)`
\* `available`: List of all available locales for the storefront, including code and current values for each | | `user` | Contains information about the current user

\* `isLoggedIn`: Indicates whether the current user is logged in
\* `attributes`: Object that contains user attributes
\* `companyUuid`: Unique identifier of the current company
\* `customUserAttributes`: Object that contains custom user attributes
\* `customerContractEditionUuids`: Array of user contract unique identifiers
\* `email`: User's email address
\* `given_name`: User's first name, for example `John`
\* `family_name`: User's last name, for example `Smith`
\* `name`: User's full name, for example `John Smith`
\* `isLoggedIn`: Indicates whether the current user is logged in
\* `picture`: User picture
\* `roles`: Array of user roles
\* `userUuid`: User unique identifier | | `marketplaceName` | The marketplace name | | `logo` | The marketplace logo | | `googleAnalyticsId` | If your marketplace supports Google Analytics, this property contains the ID | | `channelSettings` | Contains various default marketplace settings, such as URLs for privacy policies and terms and conditions pages, technical support contact information, and marketplace capabilities | | `listingEndpoint` | Relative path to the product listing page, for example `/en-US/listing` | | `pageId` | Page ID, for example `home` | ## Metadata[​](#metadata "Direct link to Metadata") The `meta` object contains page metadata as well as some marketplace settings. | Property | Definition | | ----------- | ---------------------------------- | | title | Automatically generated page title | | description | Defined metadata description | | keywords | Defined metadata keywords | | author | Partner name | | baseUrl | Marketplace base URL | | image | Meta image URL | ## Common data[​](#common-data "Direct link to Common data") The `common` object contains FAQ items, links, and search bar information. | Property | Definition | | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | | `faq` | See Help page objects | | `links` | Array of URLs and labels for custom privacy policy, terms and conditions, and support pages | | `searchBar` | Contains search bar placeholder text | | +-------------+-------------------------------------------------------+ | | ## Navigation data[​](#navigation-data "Direct link to Navigation data") The `nav` object contains page navigation data. | Property | Definition | | ----------- | ---------------------------------------------------------------------------------------------- | | `primary` | See Product browsing page objects | | `secondary` | Array of labels and URLs for the home, product listing, and product line (if applicable) pages | ## Internationalization data[​](#internationalization-data "Direct link to Internationalization data") The `i18n` object contains a list of translation keys that s can use to localize the storefront. See Create and manage translation keys. --- # Storefront Bundle Page Objects The bundle page is accessible on marketplaces that include product bundles (see Bundles) when an end user clicks a bundle on a product listing or browsing page. The bundle page includes the `bundle` object, which contains the following bundle information. | Property | Definition | | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `summary` | Contains summary information that appears in the title bar in the base theme:

• `title`: Bundle name
• `description`: Short bundle description
• `images`: URLs to one or more bundle images | | `items` | List of items in the bundle:

• `id`: Product ID
• `focused`: Indicates whether the bundle item is currently selected in the user interface
• `url`: URL to the individual product profile page
• `name`: Product name
• `image`: Product image
• `card`: Contains information that appears in the item summary card, which appears when the product is selected:

\* `title`: Product name
\* `details`: Brief text summary of product details
\* `logoSrc`: Product logo
\* `productRibbon`: Properties that define the label that appears on the logo image, including text, text color, and ribbon color
\* `merchandisingBadges`: Array of small merchandising images
• `customAttributes`: List of custom product attributes added by the
• `edition`: Edition name
• `overview`: Contains the following product information to include in an overview section:

• `resources`: List of supplementary resources such as videos or PDF documents, with links
• `screenshots`: List of product screenshots, with links
• `support`: List of support resources including links, telephone number, and email address | | `leads` | All data required to create a lead form (when the action is "Contact Us" instead of a direct purchase):

• `collectLeads`: Indicates whether leads are enabled for the product
• `button`: Lead button text, for example `Contact Us`
• `form`: All form fields required to collect a lead, and the endpoint URL to which to post the form | | `pricing` | List of pricing details for all bundle editions:

• `name`: Edition name, for example `Recurring Edition`
• `value`: Price and currency, for example `10.00 USD`
• `frequency`: Payment frequency, if applicable, for example `per Month` | --- # Product comparison page objects The product comparison page is accessible after a user selects two to four products to compare on the listing page (see Listing page objects) and clicks **Compare**. The comparison page includes the `comparableProducts` array, which contains the following information about the selected products. | Property | Definition | | ---------------- | ----------------------------------------------------------------------------------------- | | `id` | Product ID number | | `name` | Product name | | `description` | Product description | | `profileLogoUrl` | Product profile logo URL | | `features` | Array of product features | | `startingPrice` | | | `tags` | Array of product tags such as categories or attributes, for example `Office Productivity` | | `developer` | Name of the product developer | | `rating` | Product rating out of five stars | | `numberOfReview` | Number of product reviews | | `editionNames` | Array of product edition names | | `url` | Product profile page URL | --- # Help page objects The following information appears as a list of `items` in the `common` object, under `faq`. | Property | Definition | | -------- | ------------------------------------------------------- | | `name` | FAQ item name, for example `Frequently Asked Questions` | | `faqs` | List of FAQ questions and answers | --- # Home page objects The home page, found at http\://*mytheme*/home, is a canvas that the theme developer builds with custom content. However, it does expose several specific types of product list, which the system curates automatically. Each of the following lists appears in the `productLists` object on the home page. | Property | Definition | | -------------- | -------------------------------------------------------- | | `popularapps` | Lists popular apps, as determined automatically by the . | | `featuredapps` | Lists products that the has identified as *featured*. | ## List properties[​](#list-properties "Direct link to List properties") Each of the lists returns the same product properties. See the List section in Custom page objects. --- # Listing page objects The listing page, found at http\://*mytheme*/listing, is the place where customers can search for and filter products. It contains two unique objects: a list of products (all products by default), and a list of filters that customers can select to refine the product list. The filters are based on product properties such as categories, attributes, platforms, and so on. ## Listing page product properties[​](#listing-page-product-properties "Direct link to Listing page product properties") The listingProducts object contains a list of products, as well as any selected filters, sorting, and pagination criteria. | Property | Definition | | ------------ | ------------------------------------------------------------------------------------------------------------------------------- | | `items` | Product details. See the List section in Custom page objects. | | `query` | The current search query and/or selected filters | | `pagination` | Current page of search results, total number of pages, and page list (previous, selected, next) | | `compare` | See Product comparison page objects | | `sorting` | Lists the possible page sorting options (relevance, popularity, newest first, alphabetical, and rating) and the selected option | ## Listing page filter properties[​](#listing-page-filter-properties "Direct link to Listing page filter properties") Filters are product categories, subcategories, and attributes that users can select to refine the product list. For more information on categories and attributes, see Groups. All filter items (categories, subcategories, and attributes) are included in the `listingProperties` object and have the same properties. | Property | Definition | | ---------- | ------------------------------------------------------------------------------------------------------- | | `queryKey` | Term used to build query URL, for example `cat` (category), `scat` (subcategory), or `attr` (attribute) | | `id` | Category ID label (for attributes) or number (for categories) | | `text` | Filter label as it appears in the user interface, for example `Featured Apps` | | `selected` | Indicates whether the filter is selected | | `url` | Full query URL that includes all selected filters | --- # Product profile page objects Product profile pages, which users access when they click a product from a home, listing, comparison, or browsing page, contain detailed product information. Product profile pages are found at http\://*mytheme*/apps/*productId*. Product profile pages provide access to the following information, accessible through tabs (sub-pages) in the base theme: * Overview * Features * Reviews * Questions * Resources * Support * Editions Product sub-pages provide access to the same information as profile pages, so theme developers can design a single page for product profiles if desired, with two exceptions: due to technical limitations, the Reviews and Questions sub-pages contain extra information specific to reviews and questions respectively. The `application` object on the profile page contains the following information. | Property | Definition | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `config` | Contains the following product configuration properties:

• `id`: Product ID, the same number that appears in the page URL
• `uuid`: Product unique identifier
• `type`: Product type, for example `WEB_APP` | | `summary` | Contains summary information that appears in the product title bar in the base theme:

• `title`: Product name
• `details`: Short product summary
• `logoSrc`: URL to logo image
• `productRibbon`: Text and text properties of the label that appears on the logo, for example `CORE APP`
• `merchandisingBadges`: Array of small merchandising images | | `categories` | List of associated categories and category URLs | | `startingPrice` | Contains the following product price information:

• `currency`: Three-letter currency ISO currency code, for example `USD`
• `symbol`: Currency symbol, for example `$`
• `frequency`:

• `label`: Payment frequency label text, for example `Month`
• `shortLabel`: Abbreviated label, for example `Mo`
• `id`: Frequency ID, for example `ONE_TIME`, `MONTHLY`, `YEARLY`, and so on
• `price`: Product price without currency symbol, for example `15.99`
• `priceCaption`: Text that accompanies the price, for example `Starting at`
• `formattedPrice`: Product price with currency symbol, for example `$15.99` | | `domains` | Contains data related to the domain product available on | | `editions` | Contains all relevant edition information required to build a list of editions:

• `bullets`: List of features common to all editions
• `items`: List of editions that contains details about each. There are many edition properties. The following data is relevant for theme designers:

• List of costs per unit, for example $5.00 per month per user
• Unit limit, for example 1 per user
• Discount, either fixed price or percentage
• Contract duration, for example 12 months
• Target audience, for example small business or retail chains
• List of edition-specific features
• Action, such as a buy button or Contact Us button
• `footnotes`: Fine-print pricing information | | `addonProducts` | Information about add-on products (see [Manage add-on products](https://help.appdirect.com/products/Default.htm#DevCenter/addonV2Overview.html)). This object contains the same type of information as the `editions` object. | | `addons` | Information about add-on offerings (see [Legacy features](https://help.appdirect.com/products/Default.htm#DevCenter/add-on-v1-intro.htm%3FTocPath%3DLegacy%2520features%7C_____0)). This object contains the same type of information as the `editions` object. | | `resources` | List of supplementary resources such as videos or PDF documents, with links | | `screenshots` | List of product screenshots, with links | | `support` | List of support resources including links, telephone number, and email address | | `features` | List of product features, which appear by default on the Features sub-page at http\://*mytheme*/apps/*productId*/*productName*/features | | `buyButton` | Label, styling, and action of the buy button, for example `Buy Now` | | `leads` | All data required to create a lead form (when the action is "Contact Us" instead of a direct purchase)

• `collectLeads`: Indicates whether leads are enabled for the product
• `button`: Lead button text, for example `Contact Us`
• `form`: All form fields required to collect a lead, and the endpoint URL to which to post the form | | `customAttributes` | List of custom attributes added by the | | `navigation` | List of all sections or sub-pages available for the current product | | `recommendations` | Lists industry recommendations | | `relatedContent` | A subset of product data, including pricing and product rating, used to build the panel on the right of the profile page | | h | `reviews` | | `overview` | Contains the following product overview information | | `questions` | List of user questions. This data is only available on the questions sub-page at http\://*mytheme*/apps/*productId*/*productName*/questions

• `title`: Question title
• `comment`: Full question text
• `author`: Author name and picture
• `answerCount`: Number of answers
• `byDate`: Question creation date
• `isCurrentUserQuestion`: Indicates whether the current user asked the question
• `answers`: List of answers
• `actionEndpoint`: Product question API endpoint, for retrieving, updating, or deleting questions. For more information, see the [Product Questions API documentation](/rest.md#tag/Question). | --- # Templating Language Features The templating engine that the Storefront Toolkit uses provides a set of templating features. This topic highlights the features most relevant for theme customization with the Toolkit. See the HTML templating engine video tutorial for a quick description of the Theme Editor templating engine and the features available for use in your templates. Main Templating Language Features: * [Extends](#extends) * [Macro](#macro) * [Include](#include) * [Filters](#filters) ## Extends[​](#extends "Direct link to Extends") `extends` specifies template inheritance, which is used as the base template as shown in the following example: ``` {% extends "/layout/base.html" %} ``` ## Macro[​](#macro "Direct link to Macro") `macro` defines reusable content. It is similar to a *function* in a programming language. These files are located in `themes/themeName/content/macros`. The following is an example of `macro`: ``` {% macro field(name, value='', type='text') %}
{% endmacro %} ``` The macro, `field` is defined in the previous example. You can now call `field` like a normal function, as shown in the following example: ``` {% from "/macros/form.html" import field %} {{ field('user') }} {{ field('pass', type='password') }} ``` Additionally, you can import macros from other templates and reuse them freely across your project. ## Include[​](#include "Direct link to Include") `include` pulls in other templates in its place, which is useful when you need to share small sections of content across several templates that already inherit other templates. ``` {% include "/includes/item.html" %} ``` Additionally, you can use `include` templates in the middle of loops: ``` {% for item in items %} {% include "item.html" %} {% endfor %} ``` You can use `include` in this way to separate templates into sections so that browsers can render the small sections when it refreshes the page. Included templates can `extend` other templates, which means that you can have a set of related includes that all inherit a common structure. An included template does not participate in the block structure of its including template: it has a separate inheritance tree and block namespace. In other words, an `include` is not a pre-processor that pulls the included template code into the including template before rendering. Instead, it renders the included template separately, and the results of that rendering are included. ## Filters[​](#filters "Direct link to Filters") Filters are functions that can be applied to variables (for example, to transform or format values) before rendering. --- # Theme Page Structure Pages are individual text files that are rendered in a web browser to produce the storefront display. A given theme can contain many different types of pages. At a minimum, your theme must include a Home page, listing page, and profile page template (see Required files) in the appropriate folders within the theme. A page uses HTML and the templating engine features to specify what is to be displayed in the browser. Most pages use the base layout (*theme*/content/layout/base.html) as a foundation, extending it to include blocks for data and for content. A page may refer to different assets such as banner images or CSS stylesheets, import macros and other templates, and use page objects and components. See the [Modify your first page](https://drive.google.com/file/d/1yM9Vgjag7kMhSMcbU-e4vVh0Owcey70y/view?usp=sharing) video tutorial for a quick demonstration how to customize your theme, using the home page as an example, and [Custom pages and profile page overrides](https://drive.google.com/file/d/1ibX6U2VI8GIft8yqSvvaehj4UbcI12SR/view?usp=sharing) for a demonstration of how to create custom pages and use custom data. ## About the Home page[​](#about-the-home-page "Direct link to About the Home page") Your Home page is the first page that opens when customers visit your marketplace. It is the `home.html` file in the `themes/`*`themeName`*`/content/pages/home/` folder of your theme. In the marketplace, the Home page displays the Featured Applications tab by default, and can also include the All Applications tab. Your Home page can include banners, featured and popular applications, a list of categories that organize your products, and so on. ## Basic structure of a Plaza Home page[​](#basic-structure-of-a-plaza-home-page "Direct link to Basic structure of a Plaza Home page") The following example shows the basic structure of a sample Home page based on the Plaza theme: ``` {% extends "/layout/base.html" %} {% block data %} {% endblock %} {% block content %} {% endblock %} ``` The simple data block and content block demonstrate the power of the Plaza theme's component-based approach. ## Basic structure of a classic Home page[​](#basic-structure-of-a-classic-home-page "Direct link to Basic structure of a classic Home page") The following example shows the basic structure of a sample Home page based on the classic theme: ``` {% extends "/layout/base.html" %} {% from "/macros/slider.html" import slider %} {% block content %} {% include "/includes/search.html" %}
{% endblock %} ``` The following line of code structures the main layout for this page: ``` {% extends "/layout/base.html" %} ``` The Home page has a small number of block sections that extend the main layout. To change the layout of the Home page, change the HTML structure of `/layout/base.html`. If you do not plan to reuse the Home page layout, move it into `home.html`. See Template engine features for details. The following line of code is an imported macro (or component) that is used later in the template: ``` {% from "/macros/slider.html" import slider %} ``` Your main content appears after `block content` and before `endblock`: ``` {% block content %} ... {% endblock %} ``` The content in this section overrides the content block in `/layout/base.html`. A static section is included to provide a search widget: ``` {% include "/includes/search.html" %} ``` The slider macro links to the data (or content) that you want to appear on your Home page. For example, the Popular Apps section appears on this marketplace's Home page: ``` {{ slider("Popular Apps", productLists.popularapps) }} ``` See Create the header and footer to continue building your theme. --- # Structure and contents of a storefront theme A theme is composed of CSS, Javascript, HTML, components, and graphics files. When working on files, you must store them in the appropriate subfolders within the main theme folder. Certain files are required as the minimum for any theme. After you have created them, you can add other files to expand the theme. The Storefront Toolkit supports a setup command that creates a file structure with a sample theme. You can use this as the basis for your own theme. See the [base theme overview](https://drive.google.com/file/d/1qtfDwjmgEogd9_aCbcGYUkEzgDE-dUBw/view?usp=sharing) video for a tour of this file structure. ## Top-level folders[​](#top-level-folders "Direct link to Top-level folders") There are four top-level folders in a theme, each of which may contain several subfolders for different types of files: * **/Assets** Contains subfolders for CSS files, fonts, images, and JavaScript files. * **/Content** Contains subfolders for layouts (page layouts that you can extend), macros (components), and pages (storefront pages, such as Home, Listing, and others). * **/Header-footer** Contains HTML templates and CSS files specific to the header and footer. * **/Translations** Contains YAML localization files for mapping translated text to items on the pages. If you have enabled custom component creation, your theme may also include the following top-level folders: * **/customComponents** Contains subfolders for custom components. * **/node\_modules** Contains subfolders for Storybook documentation. This folder also contains all the npm libraries that you can install (that is, the @appdirect/sfb-theme-components library). All the files in your theme should either be saved to the main theme folder, or to a subfolder within one of these top-level folders. ## Required files[​](#required-files "Direct link to Required files") There are certain files that the marketplace requires as the minimum in any theme in order to present the storefront correctly. These include the following files: * The `theme-index.css` file in `themes/themeName/assets/css/theme/` * The `global-index.css` file in `themes/themeName/assets/css/platform-global/` * The `home.html` file in `themes/themeName/content/pages/home/` * The `listing.html` file in `themes/themeName/content/pages/listing/` * The `profile.html` file in `themes/themeName/content/pages/profile/` * The `header-index.css` file in `themes/themeName/header-footer/css` * The `design-properties.json` file in `themes/themeName/` These files appear in both base themes (classic and Plaza). The CSS files are generated automatically from the SASS files (see below) when you start the Storefront Toolkit with the theme. The other files are created along with the theme. important When you want to modify a theme, make changes in the SASS files. Do not make changes directly in the CSS files, as they are overwritten when the toolkit is activated or when the theme is packaged for export. ## Required stylesheets[​](#required-stylesheets "Direct link to Required stylesheets") There are three main cascading style sheet (CSS) files available that you can use to style your theme. provides [SASS](https://sass-lang.com/) support with the developer tool, which can make a stylesheet easy to read and update. SASS offers features such as functions, variables, and imports. The SASS files are automatically compiled each time the style sheet is updated when the developer tool is running, or each time the theme is packaged. The following three main SASS files are required: * The `header-index.scss` file (in `themes/themeName/header-footer/css`)---This file provides completely encapsulated CSS for the header and footer. * The `theme-index.scss` file (in `themes/themeName/assets/css/theme/`)---This is the main theme stylesheet. * The `global-index.scss` file (in `themes/themeName/assets/css/platform-global/`)---This CSS overrides the administration pages (MyApps page and Dashboard). Note that this file does not affect the storefront display. These files appear in both base themes (classic and Plaza). When you want to modify a theme, you make changes in these SASS files. These changes are then written to the corresponding CSS files when the toolkit is activated, or when the theme is packaged for export. ## Page objects[​](#page-objects "Direct link to Page objects") The marketplace supports a number of page objects that you can add to your storefront pages to represent variable content, such as the overview text for a product or its starting price. For a list of the page objects available for the different pages in a theme, see Use page objects and its related subtopics. While working with the Toolkit, you can use the Data Viewer feature of the developer toolbar to import real data (see Use AppDirect data), and then use the data to populate these objects for your storefront display. This feature provides a better idea of what your storefront will look like in production. Now that you know the required folders, files, and CSS for your themes, see Create the Home page to start building a theme for your storefront. --- # Toolkit Commands ## Introduction[​](#introduction "Direct link to Introduction") This section contains details on the various toolkit commands that can be executed. ### Install custom components to a theme[​](#install-custom-components-to-a-theme "Direct link to Install custom components to a theme") ``` sfb-toolkit components ``` The above command will setup the `current` theme such that you can create your own custom components. When you run the command, the toolkit: * Installs a version of [@appdirect/sfb-theme-components](https://www.npmjs.com/package/@appdirect/sfb-theme-components) in your current theme. **The version installed depends on the toolkit version**. Older toolkit versions will install older versions of [@appdirect/sfb-theme-components](https://www.npmjs.com/package/@appdirect/sfb-theme-components). * Creates a **customComponents** folder in your current theme with two **AtomsShowcase** components as examples. * Bundles both **sfb-theme-components** and custom components into one package in the current theme assets folder. By default, the `sfb-theme-components` library is bundled and deployed in a CDN (Content Delivery Network) and referenced in your theme. To use custom components, `sfb-theme-components` is bundled together with the user-defined custom components into a single package. Therefore, when you run `sfb-toolkit components`, the toolkit creates a `customComponents` folder in your current theme where you can start building custom components. Then, when you start your sfb-toolkit server with the `sfb-toolkit start` command and you make a change inside your `customComponents` folder, the toolkit bundles your components into a single package and puts it in your theme assets folder so you can preview the changes in your browser using hot module replacement. ### Check a theme for use of custom components[​](#check-a-theme-for-use-of-custom-components "Direct link to Check a theme for use of custom components") note This command is only available starting from `@appdirect/sfb-toolkit@4.0.13`. ``` sfb-toolkit components-info ``` This command will help you identify which custom components / customizations override our UI library and should be tested before uploading a new theme. This command will display a (**none-exhaustive**) list of components grouped into three sections: * **Overrides Components JS** will show a list of custom components defined in the current theme which override the components in our UI library. When components are identified that potentially override JavaScript, please thoroughly test their functionality to ensure there are no unexpected behaviours. * **Overrides Components SCSS** will show a list of custom components defined in the current theme which override our UI library. When components are identified that override scss/css (styling), it is important to thoroughly test the UI to ensure that those components continue to display correctly. * **User Defined Components/Atoms** will show a list of custom components that are defined by the user and should not override our UI library. caution Currently `Atoms` are not added to `Overrides Components SCSS` although they might override the `SCSS` (styling) of our UI library leading to display issues. Improving this behavior is on our feature roadmap. --- # Install the UI Toolkit You can install the Storefront Toolkit on either MacOS or on Windows 10. The Toolkit has certain prerequisite programs that must be in place before you can install it. The Toolkit installation itself is performed from the command line. A video tutorial of an installation is available [here](https://drive.google.com/file/d/17dzkvmpUoXWe1Sz_t6Dxy1eQ1kJ1iV6N/view?usp=sharing). ## Prerequisites[​](#prerequisites "Direct link to Prerequisites") Before you can install and use the Storefront Toolkit, you must install certain third-party programs as prerequisites. These include the Node.js environment and the node-sass library. info For Node.js installation, we recommend that you use the nvm application. This application is a version manager for node.js, designed to be installed per-user, and invoked per-shell. The nvm application works on any POSIX-compliant shell (sh, dash, ksh, zsh, bash), in particular on Unix, MacOS, and Windows WSL. To install nvm, run this command at the command line:  ``` curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash ``` After nvm is installed, you can continue with the prerequisites listed in the table below: | For MacOS | For Windows 10 | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 1. [Node.js 16+ (v.18 is recommended)](https://nodejs.org/en/). Cross-platform JavaScript runtime environment for servers and applications.
2. [Node-sass](https://www.npmjs.com/package/node-sass). This is a library that provides binding for Node.js to LibSass and it must be installed as a global dependency. To install it, run `npm -g install node-sass` from the command line.
3. Text editor—For code, markup, and prose, such as [Sublime Text](https://www.sublimetext.com/).
4. [Xcode](https://itunes.apple.com/us/app/xcode/id497799835?mt=12)—Development environment for macOS containing a suite of software development tools.
5.[Command line tools](#Xcode). Specifically for Xcode, it includes a package that enables UNIX-style development through Terminal by installing command-line tools and macOS SDK frameworks and headers.To download command line tools for Xcode1) Click **Xcode** in the top menu bar, then click **Open Developer Tool > More Developer Tools**. 2) Enter your Apple ID password. The Downloads for Apple Developers page opens. 3) Select and download the Command Line Tools that is compatible with your computer. You must download the package that is compatible with *both* your macOS and Xcode versions. 4) Open the Command Line Tools folder and download the file. | 1.[Node-sass](https://www.npmjs.com/package/node-sass). This is a library that provides binding for Node.js to LibSass and it must be installed as a global dependency. To install it, run `npm -g install node-sass` from the command line.
2. Text editor—For code, markup, and prose, such as [Sublime Text](https://www.sublimetext.com/). | ## Install the Toolkit[​](#install-the-toolkit "Direct link to Install the Toolkit") After you install the necessary third-party programs, you can install the Storefront Toolkit through the command line. To install the Toolkit 1. Open a command-line window. 2. Type `npm install -g @appdirect/sfb-toolkit` and press **Enter**. Wait for the command to finish. note If you are upgrading your Toolkit to version **4.0** from an earlier version, you may receive warnings and error messages when you start it. For instructions on how to resolve these warnings and errors, see Upgrading to 4.0 and later. ## Set up your workspace[​](#set-up-your-workspace "Direct link to Set up your workspace") After the Toolkit has been installed, you can use its setup command to create the workspace. This folder structure will contain a sample theme, which you can use as a starting point for your own theme. During this setup you must specify the marketplace to which the theme is linked. This enables you to draw on that marketplace for data during theme development. To set up a theme 1. Go to the directory to where you want to store your theme content. 2. Type `sfb-toolkit setup themeFolderName` and press **Enter**. You are prompted to agree to the terms of [the license agreement](https://help.appdirect.com/sfb-eula.pdf), The *`themeFolderName`* is the top-level folder for your workspace. It contains a *themes* folder where your themes are stored. 3. Type `agree` and press **Enter**. You are prompted to select one of the standard marketplace themes as a starting point for your first theme. The choices are *classic* and *Plaza*. 4. Use the arrow keys to highlight the base theme you want, and press **Enter**. 5. Type a theme name and press **Enter**. A folder with the specified name is created on your computer. It includes all of the files required to create a custom theme. You are prompted to type the marketplace path. 6. Type your full marketplace URL. important Ensure that you include `https://` in the URL. Press **Enter**. You can now import data from the specified marketplace when you Use the developer toolbar in your browser. Congratulations! You have successfully installed the Storefront Toolkit, [continue on to the next section](/storefront/getting-started.md) to learn how to use the Toolkit. --- # User Guides Knowledge is power. Power up with a veritable feast of information ready for consumption. [REST API Reference](/rest.md)[GraphQL API Reference](/graphql-docs/docs) # Our most popular guides ### Billing and Subscriptions Manage subscriptions, payment method information and discounts using REST APIs. [Read the guide](/user-guides/billing-and-subscription/.md) ### Products Manage products in the catalog by defining product information, editions and pricing plans using GraphQL APIs. [Learn more](/user-guides/product-information/.md) ### Users, Accounts & Memberships Manage users, companies, and memberships in your marketplace including user roles and permissions. [Explore](/user-guides/user-companies/.md) ### API Authentication Our APIs use an OAuth-authenticated interface that facilitates secure data access by partners and developers. [Read the guide](/user-guides/api-usage/api-auth/.md) # Explore further Read guides on inventory, custom pricing, webhooks, and more. #### Identity and Access Management ### API Authentication Our APIs use an OAuth-authenticated interface that facilitates secure data access by partners and developers. [Read the guide](/user-guides/api-usage/api-auth/.md) ### Users, Accounts & Memberships Manage users, companies, and memberships in your marketplace including user roles and permissions. [Read the guide](/user-guides/user-companies/.md) #### Product Catalog ### Products Manage products in the catalog by defining product information, editions and pricing plans using GraphQL APIs. [Read the guide](/user-guides/product-information/.md) ### Custom Pricing Override default product list pricing to increase or decrease your revenue share with other stakeholders. [Read the guide](/user-guides/custom-pricing/.md) #### Physical Products ### Shipping Integration Manage physical commerce and fulfillment operations, and use custom shipping connectors to set up communication channels. [Read the guide](/user-guides/shipping-integration/.md) ### Inventory Enable product providers to push inventory information about physical product editions to track stock of product editions. [Read the guide](/user-guides/inventory/.md) ### Product Variants Create and manage product variants based on attributes like color and size. [Read the guide](/user-guides/product-variants/.md) #### Billing, Pricing & Subscription ### Billing & Subscription Manage subscriptions, payment method information and discounts using REST APIs. [Read the guide](/user-guides/billing-and-subscription/.md) ### Subscription Price Change Change prices of existing active subscriptions with or without affecting base product price. [Read the guide](/user-guides/subscription-price-change/.md) #### Data and Events ### Product Integration Use our SDK libraries to build your own connectors and synchronize your information with the AppDirect platform. [Read the guide](/user-guides/product-integration/.md) ### Notifications Use standard or customized notification templates to send event-based messaging to users. [Read the guide](/user-guides/notifications/.md) ### Search APIs Consolidate information from different sources into a single database and use APIs to query that database. [Read the guide](/user-guides/search/.md) #### Developer Tools and Services ### GraphQL Overview Learn fundamental GraphQL concepts including terminologies, queries, mutations, and variables. [Read the guide](/user-guides/api-usage/graphql/overview.md) ### GraphQL Explorer Quickly write, validate, and test GraphQL queries for AppDirect APIs. [Read the guide](/user-guides/graphql-dev-tools/graphql-explorer.md) ### REST Overview Learn about versioning policy, rate limits, and how to create custom attributes for AppDirect core services. [Read the guide](/user-guides/api-usage/rest/versioning.md) --- # Add-On Store The AppDirect Add-On Store offers almost 40 complementary partner solutions and integrations that enhance the capabilities of your marketplace, and connectors to leading SaaS solutions across CRM, marketing automation and more. Businesses can combine add-on services to solve specific business problems related to accepting payments online, supporting self-serve sales and support, and expanding their product portfolio. To browse through all of the available solutions, go to the [Add-On Store](https://addons.appdirect.com/en-US/home). How each service is deployed depends on the service that you choose. Some services can be configured in the AppDirect user interface. Others might require professional services support from AppDirect or the partner. You can find deployment details in each solution's profile.. The following procedure describes how to start the process of deploying an add-on by providing your contact details. ### To contact AppDirect to discuss an add-on for your business[​](#to-contact-appdirect-to-discuss-an-add-on-for-your-business "Direct link to To contact AppDirect to discuss an add-on for your business") 1. Go to the [AppDirect Add-On Store](https://addons.appdirect.com/en-US/home). The Add-On Store page opens. 2. Click the **All Products** tab. The Browse Products page opens. 3. Browse through the solution tiles or through the product categories and solution areas in the left pane to find an add-on that meets your needs. You can also use search to find an application. 4. Click an add-on icon. The overview page for your selected add-on opens. 5. Click **Contact Us**. The Let's Connect page opens. 6. Enter your contact information and a message, then click **Send**. After you send your contact request, AppDirect will contact you. Alternatively, you can contact your AppDirect account team directly to discuss your needs. For more information, see the [Add-On Store FAQs](https://addons.appdirect.com/en-US/pages/help) on the Contact Us page. --- # API authentication AppDirect REST and GraphQL APIs use an OAuth-authenticated interface that facilitates secure data access by partners and developers. We recommend that you use [OAuth 2.0](https://tools.ietf.org/html/rfc6749) whenever possible, because OAuth 1.0 was deprecated on 1 December 2020. When authenticated, API users can read, create, edit, or delete marketplace data. All API requests must be made over HTTPS. Any calls made over HTTP will fail. API requests without authentication will also fail. Any authenticated API call requires an API client so that AppDirect and your product can exchange keys and secrets. Marketplace Managers can create API clients. For more information, see [API clients](https://help.appdirect.com/platform/MarketplaceConfiguration/IntegrateExtrnalSyswithMrktplc/APIClients/). Store API keys as securely as possible to protect your data. After they are generated, do not share your API keys in publicly accessible areas such as client-side code or code-sharing platforms. ## OAuth 2.0 authentication[​](#oauth-20-authentication "Direct link to OAuth 2.0 authentication") OAuth 2.0 authentication uses access tokens to determine which APIs a client can successfully call. Access tokens are opaque strings, generated by AppDirect, that represent an API client's permissions. Access tokens must be included in every API request that you make. The process of obtaining and using access tokens follows a generic pattern, with variations depending on the needs of your application and API client configuration: 1. The client requests an access token from AppDirect. 2. AppDirect authenticates the client and user (if one exists), then returns an access token to the client. 3. The client makes API requests to AppDirect using the access token. OAuth 2.0 client authentication uses two main building blocks: grant types and scopes. *Scopes* define the permissions that the client requests from AppDirect. The access token that AppDirect returns includes the requested scopes, which in turn determine which API calls the client can make on behalf of the user. In the context of AppDirect, scopes often correspond to AppDirect user roles. *Grant types* define the type of access the client requires (user-level or system-level), and determine how the client obtains the access token (for example, by using a user password, authorization code, and so on). AppDirect supports several grant types, each of which serves a different purpose. Different APIs support different grant types. When you integrate with AppDirect, ensure that you use the appropriate scopes and grant types for your use cases. The following sections describe scopes and grant types in more detail: * [Grant types](/user-guides/api-usage/api-auth/grant-type/.md) * [Scopes](/user-guides/api-usage/api-auth/scopes.md) To create and edit API clients, see [API clients](https://help.appdirect.com/platform/MarketplaceConfiguration/IntegrateExtrnalSyswithMrktplc/APIClients/). --- # Grant types The OAuth 2.0 specification defines five methods (known as grant types) that an API client can use to request an access token.  The method your application will use largely depends on the following three factors: * Required access level. * User-level: API authorization is delegated to your application by a marketplace end user so that your application can make API requests as if they were the user. * System-level: API authorization is delegated to your application directly, not on behalf of an end user. * Ability to keep a client secret secure. * Access to an end user's login credentials (username and password). Use the following table to determine which type of grant type is appropriate for your client. | Grant type | Access level required | Client can secure client secret | Access to user credentials | Supports refresh token | Sample use case | | ------------------ | --------------------- | ------------------------------- | -------------------------- | ---------------------- | --------------------------------------------------------- | | Authorization Code | user | yes | no | yes | Web server application, Native application (with PKCE) | | Implicit | user | no | no | no | JavaScript application | | Password | user | yes | yes | yes | Trusted web server applications that require direct login | | Client credentials | system | no | no | no | System-to-system integrations | For some end-user flows (Authorization Code and Password), you can use the optional Refresh Token grant type to automatically obtain a new access token after the current token expires. If you do not use a Refresh Token, the user has to re-authenticate for the API client to acquire a new access token to replace the expired one. --- # Authorization code for native applications In the Authorization Code flow, API clients authenticate an end user and obtain an authorization code (a one-time use token). The code is then exchanged for an access token, and optionally, a refresh token. Special security considerations apply to native applications, such as mobile apps, when using the authorization code flow. [RFC 8252 - OAuth 2.0 for Native Apps](https://tools.ietf.org/html/rfc8252) was created to define best practices for such cases. These best practices include [RFC 7636 - Proof Key for Code Exchange by OAuth Public Clients (PKCE)](https://tools.ietf.org/html/rfc7636), an extension to the core OAuth 2.0 specification that secures the authorization code flow when used in native applications. AppDirect conforms to both RFC 8252 and RFC 7636. tip We recommend that you use the [AppAuth client SDK](https://appauth.io/) to simplify integration with native applications and ensure that you follow best practices. The following diagram illustrates the authorization code flow for native applications: ![SSO flow native applications](/assets/images/API-SSO-Native-App-d86a634c0f82e2ca4e92fc6cd91834e5.png) 1. The Developer generates a cryptographically random code\_verifier and associated code\_challenge: ``` code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier))) ``` Next, the application initiates authorization by sending a request to the authorization endpoint and including the code\_challenge\_method and code\_challenge query parameters (required for PKCE). Sample request: ``` https://marketplace.example.com/oauth2/authorize?response_type=code&client_id=appdirect-49&scope=ROLE_USER%20ROLE_BILLING_ADMIN&state=bf0jksdldqj&code_challenge_method=S256&code_challenge=FULBvRhW7stRYdJC2WQ1Tar4QtmoKtArNR6H-cnAGXg&redirect_uri=https%3A%2F%2Fwww.example.com%2Foauth2%2Freturn ``` | Parameter | Description | | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | response\_type | Must be code, which indicates that this is the Authorization Code grant type. | | client\_id | Your API client ID. | | scope | A space-separated list of requested scopes. | | redirect\_uri | Endpoint where the marketplace will redirect the user to with the authorization code. It must match the return URL registered with your API client. | | state (optional) | An opaque value used by your application to maintain state. The marketplace includes this value when redirecting to the redirect\_uri. See the OAuth 2.0 specification for details on how to use this to prevent cross-site request forgery. | | code\_challenge\_method | Transformation method used when generating the code\_challenge. This is always set to S256 | | .code\_challenge | The string value that’s transformed from the cryptographically random code\_verifier and SHA 256 transformation method. | 2. The user is authenticated with the marketplace. 3. An authorization code is returned to the redirect\_uri passed in step 1. note This URI must also be registered within the product configuration. The state parameter is also returned. Sample request: ``` https://www.example.com/oauth2/return?code=Ib08m7&state=bf0jksdldqj ``` 4. The application sends a POST request to the token endpoint to exchange the code for an access token and optionally the refresh token. The request includes the code\_verifier generated in step 1. Sample request: ``` curl -X POST "https://marketplace.example.com/oauth2/token?grant_type=authorization_code&code=Ib08m7&code_verifier=rtDJlZb3hnHD0P65DYiUF0Xmplzg_anBoflHNGq0yCM&redirect_uri=https%3A%2F%2Fwww.example.com%2Foauth2%2Freturn" ``` | Parameter | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | grant\_type | Must be authorization\_code, indicating that this is the Authorization Code grant type. | | code | The authorization code returned to your API client. A space-separated list of requested scopes. | | redirect\_uri | The return URL registered with your API client. It must match the redirect\_uri used in the authorization code request. Endpoint where the marketplace will redirect the user to with the authorization code. Must match the return URL registered with your API client. | | .code\_verifier | The cryptographically random string generated in step 1. Used to verify this request came from the same client that code was returned to. | 5. The AppDirect authorization server transforms the code\_verifier using the following method: ``` BASE64URL-ENCODE(SHA256(ASCII(code_verifier))) = transformed_code_verifier ``` The authorization server then authenticates the request by ensuring that the transformed\_code\_verifier matches the code\_challenge passed in step 1. If the request is verified then the access and refresh tokens are returned.​ Sample response: ``` { "access_token": "7iVGxe84f1ew6QENpCD3", "refresh_token": "qsdfbasfsa1bjbfdjbfs", "token_type": "bearer", "expires_in": 43199, "scope": "ROLE_USER ROLE_BILLING_ADMIN" } ``` 6. Call an AppDirect API and include the access token in the Authorization header as a bearer token. Sample request: ``` curl -H 'Authorization: Bearer 7iVGxe84f1ew6QENpCD3' "http://marketplace.example.com/api/account/v2/subscriptions/6c31d072-8480-11e3-b2f4-22000ae812a4/assignments" ``` 7. Receive the API response. --- # Authorization code for web applications The Authorization Code grant type is the most common way for API clients to acquire access tokens that can be used to act on behalf of a marketplace user.  When used by web server applications, the client secret is required when requesting the access token pin.  Given this, the developer is responsible for securing the secret in their system.   In the Authorization Code flow, API clients authenticate an end user and obtain an authorization code (a one-time use token). The code is then exchanged for an access token, and optionally a refresh token. The following diagram illustrates this flow: ![OAuth 2.0 Authorization Code flow](/assets/images/marketplace-oauth-20-auth-code-fd8ee8cdc8cfddc9e00fea5797a153e7.png) 1. The application initiates authorization by sending a request to the marketplace's authorization endpoint. Sample request: ``` https://marketplace.example.com/oauth2/authorize?response_type=code&client_id=appdirect-49&scope=ROLE_USER%20ROLE_BILLING_ADMIN&state=bf0jksdldqj&redirect_uri=https%3A%2F%2Fwww.example.com%2Foauth2%2Freturn ``` | Parameter | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | response\_type | Must be code, which indicates that this is the Authorization Code grant type. | | client\_id | Your API client ID. | | scope | A space-separated list of requested scopes. | | redirect\_uri | Endpoint where the marketplace will redirect the user to with the authorization code. It must match the return URL registered with your API client. | | state (optional) | An opaque value used by your application to maintain state. The marketplace includes this value when redirecting to the redirect\_uri. See the OAuth 2.0 specification for details on how to use this to prevent cross-site request forgery. | 2. The user is authenticated with the marketplace. 3. An authorization code is returned to the redirect\_uri passed in step 1. note This URI must also be registered within the product configuration. The state parameter is also returned untouched. Sample request: ``` https://www.example.com/oauth2/return?code=Ib08m7&state=bf0jksdldqj ``` 4. The application sends a POST request to the token endpoint to exchange the code for an access token and optionally the refresh token. This request must be authenticated (basic authentication) using the client ID and secret. Sample request: ``` curl -X POST -u appdirect-49:9vY0s4yb2pbnP7Vz "https://marketplace.example.com/oauth2/token?grant_type=authorization_code&code=Ib08m7&redirect_uri=https%3A%2F%2Fwww.example.com%2Foauth2%2Freturn" ``` | Parameter | Description | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | grant\_type | Must be authorization\_code, indicating that this is the Authorization Code grant type. | | code | The authorization code returned to your API client. A space-separated list of requested scopes. | | redirect\_uri | The return URL registered with your API client. It must match the redirect\_uri used in the authorization code request. Endpoint where the marketplace will redirect the user to with the authorization code. Must match the return URL registered with your API client. | 5. The access token and, optionally, the refresh token are returned.   ​ Sample response: ``` { "access_token": "7iVGxe84f1ew6QENpCD3", "refresh_token": "qsdfbasfsa1bjbfdjbfs", "token_type": "bearer", "expires_in": 43199, "scope": "ROLE_USER ROLE_BILLING_ADMIN" } ``` 6. Call an AppDirect API and include the access token in the Authorization header as a bearer token. Sample request: ``` curl -H 'Authorization: Bearer 7iVGxe84f1ew6QENpCD3' "http://marketplace.example.com/api/account/v2/subscriptions/6c31d072-8480-11e3-b2f4-22000ae812a4/assignments" ``` 7. Receive the API response. --- # Client credentials The `client_credentials` grant type consists of a secret and a key, similar to OAuth 1.0. It is appropriate for authentication that does not require specific user credentials, such as authentication between machines for scheduled tasks. This grant type does not generate a refresh\_token (see [The OAuth 2.0 Authorization Framework](http://tools.ietf.org/html/rfc6749#section-4.4.3)). note ROLE\_PARTNER and ROLE\_PARTNER\_READ are the only scopes allowed for this grant type. The following diagram illustrates this flow: ![OAuth 2.0 Client Credentials flow](data:image/png;base64,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) 1. The application initiates authorization by sending a POST request to the token endpoint to exchange the client's credentials for an access token and optionally the refresh token. This request must be authenticated (basic authentication) using the client ID and secret. Sample request: ``` curl -X POST -u appdirect-49:9vY0s4yb2pbnP7Vz -H 'Content-Type: application/x-www-form-urlencoded' "https://marketplace.example.com/oauth2/token" -d "grant_type=client_credentials&scope=ROLE_PARTNER_READ" ``` | Parameter | Description | | ----------- | -------------------------------------------------------------------------------------------- | | grant\_type | Must be client\_credentials, which indicates that this is the Client Credentials grant type. | | scope | A space-separated list of requested scopes. | 2. The access token and, optionally, the refresh token are returned. Sample response: ``` { "access_token": "7iVGxe84f1ew6QENpCD3", "refresh_token": "qsdfbasfsa1bjbfdjbfs", "token_type": "bearer", "expires_in": 43199, "scope": "ROLE_PARTNER_READ" } ``` 3. Call an AppDirect API and include the access token in the Authorization header as a bearer token. Sample request: ``` curl -H 'Authorization: Bearer 7iVGxe84f1ew6QENpCD3' "http://marketplace.example.com/api/account/v2/subscriptions/6c31d072-8480-11e3-b2f4-22000ae812a4/assignments" ``` 4. Receive the API response. --- # Implicit The Implicit grant type is an alternative to the Authorization Code grant.  It is similar to Authorization Code with a couple of notable differences: * It is intended for browser or mobile apps that cannot keep client secrets because all of the application code and storage is easily accessible (for example, single-page web apps). * The authorization server returns the access token directly, instead of a code that is exchanged for a token. * Refresh tokens are not supported. The following diagram illustrates this flow: ![OAuth 2.0 Implicit flow](/assets/images/marketplace-oauth-20-implicit-829c547d8cc1f2da1a798b2dbd069784.png) 1. The application initiates authorization by sending a request to the marketplace's authorization endpoint. Sample request: ``` https://marketplace.example.com/oauth2/authorize?response_type=token&client_id=appdirect-49&scope=ROLE_USER%20ROLE_BILLING_ADMIN&state=bf0jksdldqj&redirect_uri=https%3A%2F%2Fwww.example.com%2Foauth2%2Freturn ``` | Parameter | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | response\_type | Must be token, which indicates that this is the Implicit grant type. | | client\_id | Your API client ID. | | scope | A space-separated list of requested scopes. | | redirect\_uri | Endpoint where the marketplace will redirect the user to with the authorization code. It must match the return URL registered with your API client. | | state (optional) | An opaque value used by your application to maintain state. The marketplace includes this value when redirecting to the redirect\_uri. See the OAuth 2.0 specification for details on how to use this to prevent cross-site request forgery. | 2. The user is authenticated with the marketplace. 3. An access token is returned in a URI fragment to the redirect\_uri passed in step 1. note This URI must also be registered within your client configuration. The state parameter is also returned untouched.  Sample request: ``` https://www.example.com/oauth2/return#access_token=7iVGxe84f1ew6QENpCD3 ``` 4. Call an AppDirect API and include the access token in the Authorization header as a bearer token. Sample request: ``` curl -H 'Authorization: Bearer 7iVGxe84f1ew6QENpCD3' "http://marketplace.example.com/api/account/v2/subscriptions/6c31d072-8480-11e3-b2f4-22000ae812a4/assignments" ``` 5. Receive the API response. --- # Password Trusted API clients that can prompt users for their AppDirect credentials can use the Password grant type to exchange a username and password for an access token.  Similar to the Authorization Code grant type, this should only be used by API client that are able to keep the client secret secure.   The following diagram illustrates the this flow: ![OAuth 2.0 Password flow](data:image/png;base64,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) 1. The application initiates authorization by sending a POST request to the token endpoint to exchange the user's password for an access token and optionally the refresh token. This request must be authenticated (basic authentication) using the client ID and secret. Sample request:  ``` curl -X POST -u appdirect-49:9vY0s4yb2pbnP7Vz -H 'Content-Type: application/x-www-form-urlencoded' "https://marketplace.example.com/oauth2/token" -d "grant_type=password&username=tom.jones%40example.com&password=origo2017&scope=ROLE_USER%20ROLE_BILLING_ADMIN" ``` | Parameter | Description | | ----------- | -------------------------------------------------------------------------------------------------- | | grant\_type | Must be password, which indicates that this is the Resource Owner Password Credentials grant type. | | username | Username of the marketplace user your application is requesting the access token from. | | password | Marketplace password for the user. | | scope | A space-separated list of requested scopes. | 2. The access token and, optionally, the refresh token are returned.   Sample response: ``` { "access_token": "7iVGxe84f1ew6QENpCD3", "refresh_token": "qsdfbasfsa1bjbfdjbfs", "token_type": "bearer", "expires_in": 43199, "scope": "ROLE_USER ROLE_BILLING_ADMIN" } ``` 3. Call an AppDirect API and include the access token in the Authorization header as a bearer token. Sample request: ​ ``` curl -H 'Authorization: Bearer 7iVGxe84f1ew6QENpCD3' "http://marketplace.example.com/api/account/v2/subscriptions/6c31d072-8480-11e3-b2f4-22000ae812a4/assignments" ``` 4. Receive the API response. --- # Refresh token Access tokens expire, but some grant types generate refresh tokens, which clients can use to obtain new access tokens without redirecting the user. 1. The application initiates a token refresh by sending a POST request to the token endpoint to exchange the user's refresh token for an access token. This request must be authenticated (basic authentication) using the client ID and secret. Sample request: ``` curl -X POST -u appdirect-49:9vY0s4yb2pbnP7Vz -H 'Content-Type: application/x-www-form-urlencoded' "https://marketplace.example.com/oauth2/token" -d "grant_type=refresh_token&refresh_token=qsdfbasfsa1bjbfdjbfs&scope=ROLE_USER%20ROLE_BILLING_ADMIN" ``` | Parameter | Description | | -------------- | ---------------------------------------------------------------------------------- | | grant\_type | Must be refresh\_token, which indicates that this is the Refresh Token grant type. | | refresh\_token | The user's refresh token. | | scope | A space-separated list of requested scopes. | 2. The access token is returned. Sample response: ``` { "access_token": "EgLvB5pQZMkWl6diDYfg", "token_type": "bearer", "expires_in": 43199, "scope": "ROLE_USER ROLE_BILLING_ADMIN" ​}​ ``` --- # API and user interface role mapping Each user role is associated with one of two system records: the *membership record*, which is bound to a company, or the *user record*, which is bound to a user. In the user interface, the distinction is not apparent; in API requests and responses, the roles associated with the different records appear in different objects. In the user interface, Company Administrators manage roles associated with the membership record through App Manager, but only AppDirect employees can manage user record roles. See the following topics and sections for more information on roles: * [Manage users](https://help.appdirect.com/platform/Default.htm#AppManager/am-users-users.htm%3FTocPath%3DInformation%2520for%2520your%2520Company%2520Administrators%7CManage%2520users%7C_____0) * [Manage roles](https://help.appdirect.com/platform/Default.htm#AppManager/AM-Users-Roles-Overview.html%3FTocPath%3DInformation%2520for%2520your%2520Company%2520Administrators%7CManage%2520roles%7C_____0) * [Set a default user role](https://help.appdirect.com/platform/Default.htm#AppManager/AM-CoStgs-SetDefaultUsrRole.html%3FTocPath%3DInformation%2520for%2520your%2520Company%2520Administrators%7CEdit%2520account%2520settings%7C_____5) Role names in the AppMarket user interface differ slightly from the role values that appear in API requests and responses. In API requests and responses, membership record roles are included in the `"roles"` array in the [`UserCompanyMembershipAccountV2`](https://developer.appdirect.com/rest#tag/CompanyMemberships) object. User record roles are included in the `"roles"` array in the [`UserAccountV2`](https://developer.appdirect.com/rest#tag/UserAccounts) object. Various API calls use or return one or both of the `UserCompanyMembershipAccountV2` and `UserAccountV2` objects either explicitly or contained within other objects. You might therefore see two `"roles"` arrays in a single request or response, although the arrays contain different role information. The following table maps the role names as they appear in API requests and responses to the role names as they appear in the user interface, and lists the associated record. | API role | Role in user interface | Associated Record | | ------------------------------- | ---------------------- | ----------------- | | ROLE\_USER | User | User | | ROLE\_CORPORATE\_ADMIN | Network Manager | User | | ROLE\_CHANNEL\_PRODUCT\_SUPPORT | Product Support | Membership | | ROLE\_SALES\_SUPPORT | Sales Support | Membership | | ROLE\_RESELLER | Reseller | Membership | | ROLE\_RESELLER\_MANAGER | Reseller Manager | Membership | | ROLE\_CHANNEL\_SUPPORT | Customer Support | Membership | | ROLE\_SYS\_ADMIN | Company Admin | Membership | | ROLE\_BILLING\_ADMIN | Billing Admin | Membership | | ROLE\_DEVELOPER | Developer | Membership | | ROLE\_CHANNEL\_ADMIN | Marketplace Manager | Membership | note All users have the User role and it cannot be removed. --- # Scopes When the client requests an OAuth 2.0 access token, the requests must specify the desired scopes (that is, the permissions) of the access token. Many of AppDirect's scopes correspond to roles associated with marketplace users.  When requesting user-level access tokens, ensure that the user's AppDirect user role(s) correspond to the scope specified in the request. The table below describes all AppDirect scopes and which grant types the scopes are valid for. | Scope name | Description | Supported grant types | | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | | ROLE\_USER | Allows access as an end user in the company associated with an API call. | Authorization Code, Implicit, Password | | ROLE\_BILLING\_ADMIN | Allows access as a Billing Admin for the company associated with an API call. | Authorization Code, Implicit, Password | | ROLE\_SYS\_ADMIN | Allows access as a Company Admin for the company associated with an API call. | Authorization Code, Implicit, Password | | ROLE\_RESELLER | Allows access as a Reseller for the company associated with an API call. | Authorization Code, Implicit, Password | | ROLE\_SALES\_SUPPORT | Allows access as a Sales Support agent for the marketplace. | Authorization Code, Implicit, Password | | ROLE\_CHANNEL\_SUPPORT | Allows access as a Customer Support agent for the marketplace. | Authorization Code, Implicit, Password | | ROLE\_CHANNEL\_PRODUCT\_SUPPORT | Allows access as a Product Support agent for the marketplace. | Authorization Code, Implicit, Password | | ROLE\_CHANNEL\_ADMIN | Allows access as a Marketplace Manager for the marketplace. | Authorization Code, Implicit, Password | | ROLE\_CORPORATE\_ADMIN | Allows access as a Network Manager for the marketplace. | Authorization Code, Implicit, Password | | ROLE\_DEVELOPER | Allows access as a Developer for the user associated with an API call. | Authorization Code, Implicit, Password | | ROLE\_PARTNER\_READ | Allows access to read all marketplace data. | Client Credentials | | ROLE\_PARTNER | Allows access to read and write all marketplace data. | Client Credentials | | openid | Requests that the ID token be returned from the token endpoint for SSO. Used in OpenID Connect SSO flow. | Authorization Code, Implicit, Password | | profile | API client can retrieve profile data about the user such as first name and last name. Used in OpenID Connect SSO flow. | Authorization Code, Implicit, Password | | email | API client can retrieve a user’s email address. Used in OpenID Connect SSO flow. | Authorization Code, Implicit, Password | --- # Token timeouts Tokens expire after a certain amount of time elapses. The expiration or timeout value varies by token: | Token | Timeout value | | ------------- | ------------- | | Access token | 12 hours | | ID token | 1 hour | | Refresh token | 30 days | --- # Changelog The GraphQL schema changelog is a list of all upcoming and previous updates to the GA and Preview GraphQL schemas. It also includes announcements for deprecated, retired, and decommissioned (breaking) functionality. ### Schema Changes on July 31, 2025[​](#schema-changes-on-july-31-2025 "Direct link to Schema Changes on July 31, 2025") * The following changes were made: * The below mutations were added: * createAttestationID * sendAttestationReminder * The query **attestationStatusByCompany** was added. * The below objects were added: * AttestationResponse * AttestationReminderResponse * PublishSearchSettingsPayload * CustomizeProductSearchSettingsPayload * PublishProductSearchSettingsPayload * ResetProductSearchSettingsPayload * The below enums were added: * attestationStatus * AlgorithmVersion * The object **ProductSearchSettings** and input object **CustomizeProductSearchFieldsInput** were updated with the field **algorithmVersion**. * The below input objects were added: * ProductSearchableSettingInput * CustomizeProductSearchSettingsInput * The union **CustomizeProductSearchSettingsError** was added. * The object **PublishedProductSearchHit** was updated with the field **productUuid**. ### Schema Changes on July 29, 2025[​](#schema-changes-on-july-29-2025 "Direct link to Schema Changes on July 29, 2025") * The following changes were made: * The field **hidden** was added to the below items: * Object **ProductEdition** * Input objects **CreateProductEditionInput** and **UpdateProductEditionInput** * The unions **CreateProductEditionError** and **UpdateProductEditionErrors** were updated with the error type **ProductMustHaveAtLeastOneVisibleEditionError**. * The object **Product** was updated with the field **source**. * The below objects were added: * ProductMustHaveAtLeastOneVisibleEditionError * FutureRange * CreateCustomPriceDefinitionPayload * PriceDefinitionAlreadyExistsError * PriceDefinitionCreationError * PriceDefinitionMigrationPricesResponse * OrderHistory * OrderHistoryPrice * The object **ProductSource** and input object **ProductSourceInput** were updated with the field **sourceId**. * The object **MarkupPrice** was updated with the fields **uuid** and **partner**. * The input object **DynamicPriceRangesInput** was updated with the below fields: * buyerCompanyId * buyerUserId * ownerUserId * The input object **UnitQuantityInput** was updated with the below fields: * previousQuantity * currentQuantity * The object **UnitRanges** was updated with the below fields: * previousQuantityRanges * futureRanges * The object **Range** was updated with the field **price**. * The input object **ExternalSourceFutureRangesInput** was updated with the field **applicationUuid**. * The object **ExternalSourceRange** was updated with the below fields: * idx * quantity * messageType * The object **PriceBookMatchRule** was updated with the below fields: * startDate * endDate * The enum **MessageType** was added. * The below input objects were added: * CreateCustomPriceDefinitionInput * PricingDetailInput * PriceRangeInput * PriceInput * OrderHistoryInput * The union **CreateCustomPriceDefinitionError** was added. ### Schema Changes on July 28, 2025[​](#schema-changes-on-july-28-2025 "Direct link to Schema Changes on July 28, 2025") * The following changes were made: * The query **billingChargeAllocations** was added. * The below input objects were added: * BillingChargeAllocation * BillingChargeAllocationInput * The object **SubscriptionAllocation** was updated with the field **chargeId**. ### Schema Changes on July 25, 2025[​](#schema-changes-on-july-25-2025 "Direct link to Schema Changes on July 25, 2025") * The following changes were made: * The input object **TriggerCreateAdhocCreditMemoProcessInput** and object **CreateAdhocCreditMemoProcess** were updated with the field **autoApplyEnabled**. * The enum **CreditMemoStatus** was updated with the field **PENDING\_APPROVAL**. * The input objects **CreateAccountMembershipInput** and **CreateAccountMembershipWithPasswordInput** were updated with the field **locale**. ### Schema Changes on July 24, 2025[​](#schema-changes-on-july-24-2025 "Direct link to Schema Changes on July 24, 2025") * The following changes were made: * The object **Query** was updated with the field **productRecommendations**. * The input object **ProductRecommendationsInput** was added. * The below objects were added: * ProductRecommendation * ProductRecommendationSourceMetadata * ProductRecommendationPricing * RecommendationStartingPrice * RecommendationAmount * The below enums were added: * RecommendationCategory * RecommendationSource * RecommendationContext ### Schema Changes on July 14, 2025[​](#schema-changes-on-july-14-2025 "Direct link to Schema Changes on July 14, 2025") * The following changes were made: * The below objects were added: * LinkedMembershipDiscount * LinkedMembershipGroup * LinkedMembershipGroupRequest * LinkedMembershipGroupResponse * EnrollToLinkedMembershipResponse * The input object **EnrollToLinkedMembershipRequest** was added. * The mutation **enrollToLinkedMembership** was added. ### Schema Changes on July 2, 2025[​](#schema-changes-on-july-2-2025 "Direct link to Schema Changes on July 2, 2025") * The following changes were made: * The object **SubscriptionCancellationReasonLabelError** was added. * The union **SubscriptionCancellationReasonErrors** was updated with the error type **SubscriptionCancellationReasonLabelError**. ### Schema Changes on July 1, 2025[​](#schema-changes-on-july-1-2025 "Direct link to Schema Changes on July 1, 2025") * The following changes were made: * The field **id** was renamed as **connectorId** in the input object **UpdatePsaConnectorConfigurationInput**. * The object **PsaConnectorConfigurationResult** was added. ### Schema Changes on June 23, 2025[​](#schema-changes-on-june-23-2025 "Direct link to Schema Changes on June 23, 2025") * The following changes were made: * The below objects were added: * PricingPlanNotFoundError * PriceDefinitionNotFoundError * PriceBookResellerPricesForFeesNotProvidedError * DeletePricingCacheCollectionDataPayload * CreatePreviousQuantityRangesPayload * PreviousQuantityRanges * QuantityRangesByUnit * QuantityRange * PreviousQuantityRangesCreationError * PreviousQuantityRangesAlreadyExistsError * MetadataEntry * DynamicPriceRangesResponse * DynamicPriceRanges * UnitRanges * Range * InputValidationError * ExternalServiceError * The below mutations were added: * deletePricingCacheCollectionData * createPreviousQuantityRanges * The below input objects were added: * DeletePricingCacheCollectionDataInput * CreatePreviousQuantityRangesInput * QuantityRangesByUnitInput * QuantityRangeInput * MetadataEntryInput * DynamicPriceRangesInput * PricingPlanInput * UnitQuantityInput * ExternalSourceFutureRangesInput * ExternalSourcePricingPlanInput * ExternalSourceFutureRangesResponse * ExternalSourceFutureRanges * ExternalSourceUnitRanges * ExternalSourceRange * PriceBookMatchRule * OfferDetails * The below enums were added: * PricingCacheCollectionType * MetadataKey * AccountAssociationStatus * The union **SetResellerCompanyPriceError** was updated with the error type **PriceBookResellerPricesForFeesNotProvidedError**. * The below unions were added: * CreatePreviousQuantityRangesError * DynamicPriceRangesError * FutureRangesError * The enum **AccountMembershipRole** was updated with the field **THEME\_MANAGER**. * The input objects **AccountMembershipDetailsFilter**, **UserMembershipDetailsFilter**, and **AccountAssociationFilter** were updated with the field **status**. ### Schema Changes on June 19, 2025[​](#schema-changes-on-june-19-2025 "Direct link to Schema Changes on June 19, 2025") * The following changes were made: * The object **SubscriptionDefinition** was updated with the field **owner**. * The object **RoleBasedSubscriptionCancellationReason** was updated with the field **label**. ### Schema Changes on June 11, 2025[​](#schema-changes-on-june-11-2025 "Direct link to Schema Changes on June 11, 2025") * The following changes were made: * The object **DeleteFunctionPayload** was updated with the field **userErrors**. * The union **DeleteFunctionError** was added. * The object **ReferencedFunctionError** was added. * The object **Function** was updated with the field **runtime**. * The input object **skipSiblingInvoiceRetry** was updated with the field **skipSiblingInvoiceRetry**. ### Schema Changes on June 5, 2025[​](#schema-changes-on-june-5-2025 "Direct link to Schema Changes on June 5, 2025") * The following changes were made: * The query **relationshipRequestByCompany** was added. * The enum **PublishedProductSearchDistributedAppsVisibility** was added. ### Schema Changes on June 2, 2025[​](#schema-changes-on-june-2-2025 "Direct link to Schema Changes on June 2, 2025") The enum **CartFieldValidationType** was upated with the field **ALPHANUMERIC**. ### Schema Changes on June 1, 2025[​](#schema-changes-on-june-1-2025 "Direct link to Schema Changes on June 1, 2025") The enum **EventStatus** was updated with the field **IMPORTING**. ### Schema Changes on May 30, 2025[​](#schema-changes-on-may-30-2025 "Direct link to Schema Changes on May 30, 2025") * The following changes were made * The object **CustomerDetails** was updated with the fields **domain** and **iaasProvider**. * The object **IAASStatusData** was updated with the field **totalEstimatedCost**. * The below objects were added: * JobScheduleResponse * IAASJobDetailsWithJobRunParametersResponse * IAASJobDetailsWithJobRunParameters * The below queries were added: * reprocessByJobRunId * iaasJobDetailsWithJobRunParameters ### Schema Changes on May 29, 2025[​](#schema-changes-on-may-29-2025 "Direct link to Schema Changes on May 29, 2025") * The following changes were made: * The query **salesAgentPublishedProductsSearch** was added. * The below objects were added: * SalesAgentPublishedProductSearchResult * ResellerPublishedProductSearchResult * The below input objects were added: * SalesAgentPublishedProductSearchFilters * ResellerPublishedProductSearchFilters * The enum **EventType** was updated with the fields **UNIT\_TRANSFER** and **EDITION\_ELIGIBILITY**. ### Schema Changes on May 28, 2025[​](#schema-changes-on-may-28-2025 "Direct link to Schema Changes on May 28, 2025") * The following changes were made: * The mutations **addSubscriptionCancellationReasons**, **updateSubscriptionCancellationReasons**, and **deleteSubscriptionCancellationReasons** were updated with the scope **billing.subscription-cancellation.write.tenant**. * The enum **SubscriptionCancellationReasonAllowedRoles** was updated with the fields **SUPER\_SUPPORT** and **PARTNER**. * The object **SubscriptionCancellationReason** was updated with the field **label**. * The below objects were added: * SubscriptionCancellationIdInvalidError * SubscriptionCancellationServerError * SubscriptionCancellationReasonIdValidationError * The union **TriggerSubscriptionCancellationProcessError** was udpated with the following types: * SubscriptionCancellationRequestDateRequiredError * SubscriptionCancellationIdInvalidError * SubscriptionCancellationServerError * The union **SubscriptionCancellationReasonErrors** was updated with the following types: * SubscriptionCancellationReasonIdValidationError * SubscriptionCancellationReasonDoesNotExist ### Schema Changes on May 21, 2025[​](#schema-changes-on-may-21-2025 "Direct link to Schema Changes on May 21, 2025") * The following changes were made: * The objects **InvoiceLine** and **CreditMemoLine** were updated with the fields **balance** and **billToType**. * The enum **BillToType** was added. * The input object **AccountDetailsInput** was updated with the field **firstbaseAccountDetailsInput**. * The input object **FirstbaseRegistrationInput** was added. ### Schema Changes on May 16, 2025[​](#schema-changes-on-may-16-2025 "Direct link to Schema Changes on May 16, 2025") The input object **HighGrowthOfferInput** was updated with the field **locale**. ### Schema Changes on May 15, 2025[​](#schema-changes-on-may-15-2025 "Direct link to Schema Changes on May 15, 2025") * The following changes were made: * The mutation **cancelResellerRelationship** was added. * The object **RelationshipResponse** was updated with the field **requestStatus**. ### Schema Changes on May 14, 2025[​](#schema-changes-on-may-14-2025 "Direct link to Schema Changes on May 14, 2025") * The following changes were made: * The below input objects were added: * DisableWebhookConfigurationInput * EnableWebhookConfigurationInput * The below objects were added: * DisableWebhookConfigurationPayload * EnableWebhookConfigurationPayload * WebhookConfigurationAuditLogConnection * WebhookConfigurationAuditLog * WebhookConfigurationChange * ExternalSourcePriceFeeItem * ExternalSourcePriceRangeFeeItem * The below mutations wered added: * enableWebhookConfiguration * disableWebhookConfiguration * The object **WebhookConfiguration** was updated with the field **auditLog**. * The below enums were added: * WebhookConfigurationAuditAction * WebhookConfigurationEditableField * The input object **WebhookConfigurationFilter** was updated with the field **statuses**. * The objects **ExternalSourcePriceFee** and **ExternalSourcePriceRangeFee** were updated with the fields **priceType** and **externalSourcePriceFeeItem**. * The enum **PriceType** was updated with the field **MARKETPLACE\_RETAIL\_PRICE**. ### Schema Changes on May 13, 2025[​](#schema-changes-on-may-13-2025 "Direct link to Schema Changes on May 13, 2025") * The following changes were made: * The query **findPaginatedSubscriptionSyncRequests** was added. * The object **MicrosoftSubscriptionSyncResponse** was updated with the field **syncDate**. * The below objects were added: * MicrosoftSubscriptionSyncResponsePage * PageMeta ### Schema Changes on May 12, 2025[​](#schema-changes-on-may-12-2025 "Direct link to Schema Changes on May 12, 2025") The object **InvoiceLine** was updated with the field **msrp**. ### Schema Changes on April 30, 2025[​](#schema-changes-on-april-30-2025 "Direct link to Schema Changes on April 30, 2025") * The following changes were made: * The object **CustomAttribute** was renamed to **UserCustomAttribute**. * The object **AccountCustomAttribute** was added. * The input object **CustomAttributeInput** was renamed to **UserCustomAttributeInput**. * The input object **AccountCustomAttributeInput** was added. ### Schema Changes on April 29, 2025[​](#schema-changes-on-april-29-2025 "Direct link to Schema Changes on April 29, 2025") * The following changes were made: * The below enums were added: * CustomAttributeExternalValidationAuthType * CustomAttributeValidationType * The below objects were added: * CustomAttributeDefinition * CustomAttributeTextType * CustomAttributeSelectType * CustomAttributeDefaultTextValidation * CustomAttributeDefaultSelectValidation * CustomAttributeExternalValidation * StatusCodeErrorMessage * CustomAttributeRegexValidation * CustomAttributeContext * CustomAttributePermission * CustomAttributeValueOption * CustomAttribute * FilterCriteria * SubscriptionUpdatePreviewResponse * SubscriptionUpdatePreviewValidationError * SubscriptionUpdatePreviewTaxDetail * SubscriptionUpdatePreviewPricingCalculationTotalCost * SubscriptionUpdatePreviewTotalRecurring * SubscriptionUpdatePreviewBillingCycle * SubscriptionUpdatePreviewProrationDetail * SubscriptionUpdatePreviewPeriod * SubscriptionUpdatePreviewItem * SubscriptionUpdatePreviewDiscount * InvalidResellerMarkupPricingTypeInputError * InvalidPriceBookIdInputError * InvalidPriceBookVersionIdInputError * ResellerCompanyPriceFromPriceBookVersion * SetResellerPriceInPriceBookPayload * RemoveResellerPriceFromPriceBookPayload * ResellerMarkupPricesFromPriceBookPayload * ResellerMarkupPricesFromPriceBookVersionPayload * The below unions were added: * CustomAttributeType * CustomAttributeTextValidation * CustomAttributeSelectValidation * RemoveResellerPriceFromPriceBookError * ResellerMarkupPricesFromPriceBookError * ResellerMarkupPricesFromPriceBookVersionError * The interface **CustomAttributeDefaultValidation** was added. * The input object **TriggerProductDownloadProcessInput** and object **UserActivity** were updated with the field **filterCriteria**. * The below input objects were added: * FilterCriteriaInput * SetResellerPriceInPriceBookInput * RemoveResellerPriceFromPriceBookInput * ResellerMarkupPriceFromPriceBookInput * The enum **DownloadEntityType** was updated with the field **PRODUCT\_SETTING\_ATTRIBUTE**. * The query **transferUnitEligibleSubscriptions** was updated with the scope **ROLE\_PARTNER**. * The below queries were added: * previewSubscriptionUpdateRequest * creditMemo * resellerMarkupPriceFromPriceBook * resellerMarkupPricesFromPriceBook * resellerMarkupPricesFromPriceBookVersion * The scalar **SubscriptionCancellationReasonCode** was added. * The mutation **triggerCreateAdhocCreditMemoProcess** was updated with the below scopes: * ROLE\_SALES\_SUPPORT * ROLE\_CHANNEL\_ADMIN * ROLE\_CHANNEL\_SUPPORT * ROLE\_CORPORATE\_ADMIN * ROLE\_PARTNER * In the input object **CreditMemoFilter**, the field **creditMemoStatus** was depreacted and replaced with **creditMemoStatuses**. * The below mutations were added: * setResellerPriceInPriceBook * removeResellerPriceFromPriceBook * The input object **MarkupPriceInput** was updated with the field **markupSourceType**. * The object **ResellerCompanyPrice** was updated with the fields **productId** and **editionId**. * The union **SetResellerCompanyPriceError** was updated with the below error types: * InvalidResellerMarkupPricingTypeInputError * InvalidPricingPlanIdError * InvalidPriceBookIdInputError ### Schema Changes on April 28, 2025[​](#schema-changes-on-april-28-2025 "Direct link to Schema Changes on April 28, 2025") * The following changes were made: * The object **ScheduledAdobeOrderResponse** was updated with the field **scheduledOrderId**. * The below mutations were added: * cancelHighGrowthOrder * createHighGrowthOffer * The query **fetchEligibleOffersForCustomer** was added. * The below objects were added: * HighGrowthOffer * CreateHighGrowthOfferPayload * CancelHighGrowthOrderPayload * HighGrowthOfferQuantityError * AdobeRestrictionError * SubscriptionRenewalProximityError * MarketplaceProduct * EligibleOfferResponse * EligibleOfferProductEntitlementDetails * EditionLevelDetails * RenewalOfferData * HighGrowthRequestDetails * The below input objects were added: * HighGrowthOfferInput * CancelHighGrowthOrderInput * The union **CreateHighGrowthOfferError** was added. * The below mutations were added: * HighGrowthRequestType * HighGrowthRequestStatus ### Schema Changes on April 24, 2025[​](#schema-changes-on-april-24-2025 "Direct link to Schema Changes on April 24, 2025") * The following changes were made: * The query **activeCart** and the input object **ActiveCartOfUserInput** were updated with the field **isPreviewCheckout**. * The enum **Mode** was added. * The query **domainAvailability** was added. * The mutation **resellerRelationship** was added. * The below objects were added: * DomainAvailabilityResponse * RelationshipResponse ### Schema Changes on April 22, 2025[​](#schema-changes-on-april-22-2025 "Direct link to Schema Changes on April 22, 2025") * The following changes were made: * The mutation **createSubscriptionSyncRequests** was added. * The input object **GraphQLSubscriptionSyncRequest** was added. ### Schema Changes on April 9, 2025[​](#schema-changes-on-april-9-2025 "Direct link to Schema Changes on April 9, 2025") * The following changes were made: * The field **status** was added to the below items: * Input objects **CreateTenantWebhookConfigurationInput**, **UpdateWebhookConfigurationInput**, and **CreateAccountWebhookConfigurationInput**. * Objects **WebhookConfiguration** and **WebhookTenantScope**. * The enum **WebhookConfigurationStatus** was added. * The enum **DistributorId** was updated with the field **FIRSTBASE**. ### Schema Changes on April 8, 2025[​](#schema-changes-on-april-8-2025 "Direct link to Schema Changes on April 8, 2025") The object **ProductIntegrationTest** was updated with the below fields: * editionEligibilityPingHealth * editionEligibilityPingStatus * unitTransferPingHealth * unitTransferPingStatus ### Schema Changes on April 7, 2025[​](#schema-changes-on-april-7-2025 "Direct link to Schema Changes on April 7, 2025") * The following changes were made: * The mutation **createRefundPayment** was added. * The below input objects were added: * CreateRefundPaymentInput * MerchantOfRecordInput * PayerInput * UserInput * AccountInput * CustomerInput * InvoiceInput * BalanceTransactionInput * CustomerBalanceLedgerInput * RefundIntent * PaymentSource * The enum **IntentTypeInput** was added. ### Schema Changes on April 3, 2025[​](#schema-changes-on-april-3-2025 "Direct link to Schema Changes on April 3, 2025") * The following changes were made: * The union **ProductUnpublicationProcessError** was updated with the below error types: * InternalServerUnpublicationError * InvalidUnpublicationError * The object **MonolithUnpublicationError** was renamed as **InternalServerUnpublicationError**. * The object **InvalidUnpublicationError** was added. ### Schema Changes on March 27, 2025[​](#schema-changes-on-march-27-2025 "Direct link to Schema Changes on March 27, 2025") * The following changes were made: * The below objects were added: * AccountMembershipNotFoundError * AccountMembershipByAccountId * Adobe3YCCommitmentsResponse * AddressOutput * ContactOutput * CompanyProfileOutput * MinimumQuantityOutput * CommitmentOutput * AdobeBenefitOutput * DiscountOutput * CustomerResponseOutput * AdobeSubscriptionDataOutput * AdobeBenefitDetailsOutput * ScheduledAdobeOrderResponse * AdobeCustomerResponse * AdobeCustomerAccountResponse * PageInfo * LocalizedString * LocalizedURL * LocalizedPhoneNumber * LocalizedEmailAddress * SubscriptionDiscrepancy * SubscriptionDiscrepancyAttribute * MicrosoftSubscriptionSyncResponse * The below input objects were added: * AccountUserIdPair * Adobe3YCCommitmentsRequest * AdobeBenefitsInput * MinimumQuantityInput * CommitmentInput * ScheduledAdobeOrderRequest * UpdateCustomerRequest * AdobeCustomerAccountRequest * LocalizedStringInput * LocalizedURLInput * LocalizedPhoneNumberInput * LocalizedEmailAddressInput * MicrosoftSubscriptionSyncRequestInput * The below queries were added: * accountMembershipsByAccountIdAndUserIdPairs * subscriptionDiscrepancyDetail * microsoftSubscriptionSyncStatus * The below unions were added: * AccountMembershipError * BalanceTransactionSource * BalanceTransactionTarget * The below mutations were added: * createOrUpdateAdobe3YCCommitments * createOrUpdateAdobeCustomerAccount * scheduledAdobeOrder * updateCustomer * microsoftSubscriptionSyncRequest * The below enums were added: * Adobe3YCCommitmentAction * OperationType * AdobeCustomerAccountAction * OrderDirection * The below interfaces were added: * UserError * AsynchronousProcess * AsynchronousProcessExecutionError * Node * The fields **editionEligibilityUrl** and **unitTransferUrl** were added to the following: * The object **ProductIntegration** * The input objects **CreateProductIntegrationInput** and **UpdateProductIntegrationInput** * The object **BalanceTransaction** was updated with the fields **target** and **source**. * The enum **CreditMemoBalanceStatus** was updated with the below fields: * AWAITING\_PAY\_OUT * PENDING\_PAYMENT * PAID\_OUT ### Schema Changes on March 26, 2025[​](#schema-changes-on-march-26-2025 "Direct link to Schema Changes on March 26, 2025") The following changes were made: * The enum **ValidationPageSource** was added. * The field **productUuid** was deprecated from the input object **UnlistProductFromStorefrontInput**. * The below input objects were added: * ListProductOnStorefrontInput * TriggerCreditMemoRetryProcessInput * The union **ListProductOnStorefrontError** was added. * The below objects were added: * ListProductOnStorefrontPayload * TriggerCreditMemoRetryProcessPayload * The below mutations were added: * listProductOnStorefront * triggerCreditMemoRetryProcess * The object **CreditMemo** was updated with the field **taxReport**. * The enum **CreditMemoStatus** was updated with the below fields: * AWAITING\_PAY\_OUT * PENDING\_PAYMENT * PAID\_OUT * The object **Invoice** was updated with the field **billToCompany**. ### Schema Changes on March 25, 2025[​](#schema-changes-on-march-25-2025 "Direct link to Schema Changes on March 25, 2025") * The following changes were made: * The query **subscriptionUpdateRequestStatus** was updated with the scopes **ROLE\_PARTNER** and **ROLE\_CHANNEL\_ADMIN**. * The below queries were added: * transferUnitEligibleEditions * freeTrialExtensionRequests * freeTrialExtensionRequest * pendingFreeTrialExtensionRequestForSubscription * The below mutations were added: * submitFreeTrialExtensionRequest * approveFreeTrialExtensionRequest * The below input objects were added: * FreeTrialExtensionRequestInput * FreeTrialExtensionRequestApprovalInput * FreeTrialExtensionRequestFilter * FreeTrialExtensionRequestOrderBy * The enum **FreeTrialExtensionRequestIneligibilityReasonCode** was updated with fields **EXTENSION\_PRODUCT\_SETTING\_NOT\_ENABLED** and **SUBSCRIPTION\_NOT\_FOUND**. * The below enums were added: * FreeTrialExtensionRequestOrderField * FreeTrialExtensionRequestStatus * FreeTrialExtensionRequestActorType * FreeTrialExtensionRequestValidationErrorCode * The below objects were added: * FreeTrialExtensionRequestConnection * FreeTrialExtensionRequest * FreeTrialExtensionRequestSubmitter * FreeTrialExtensionRequestApprover * FreeTrialExtensionRequestPayload * FreeTrialExtensionRequestValidationError ### Schema Changes on March 24, 2025[​](#schema-changes-on-march-24-2025 "Direct link to Schema Changes on March 24, 2025") * The following changes were made: * The object **IAASJobDetailsByJobRunId** was added. * The query **jobDetailsByJobRunId** was added. ### Schema Changes on March 18, 2025[​](#schema-changes-on-march-18-2025 "Direct link to Schema Changes on March 18, 2025") * The following changes were made: * The enum **resellerPublishedProductsSearchInternal** was added. * The object **ResellerPublishedProductSearchResultInternal** was added. * The enum **PublishedProductSearchProductType** was updated with the below fields: * APPDIRECT\_SERVICE * DOWNLOAD\_WITH\_FULL\_PROFILE * EMBEDDED\_VIDEO * BUNDLE * EXTERNAL * DOMAIN\_RESELLER * CLOUD\_SERVICES * PHYSICAL\_PRODUCT * HARDWARE\_SERVICE ### Schema Changes on March 17, 2025[​](#schema-changes-on-march-17-2025 "Direct link to Schema Changes on March 17, 2025") * The following changes were made: * The below objects were added: * MarkupOnWorkingVersionAfterProductPublishNotAllowedError * DeletePricingPlanPayload * PriceBookCompaniesConnection * PriceBookCompany * The mutation **deletePricingPlan** was added. * The scope **ROLE\_PARTNER** was added to the below mutations: * createPriceBook * updatePriceBook * deletePriceBook * clonePriceBook * deactivatePriceBook * createPriceBookCondition * updatePriceBookConditionMetadata * addOrUpdateConditionProperties * removeConditionProperties * deletePriceBookCondition * createPriceBookEntry * addOrUpdatePriceBookEntryPrices * removePriceBookEntryPrices * deletePriceBookEntry * The scope **ROLE\_PARTNER** was added to the below queries: * priceBook * priceBooksByPricingPlanId * priceBookByName * PriceBookCondition * priceBookEntry * PriceDefinition * rateCard * rateCardByProductId * The query **priceBookCompanies** was added. * The below input objects were added: * PriceBookCompaniesFilter * PriceBookCompaniesOrderBy * The enum **PriceBookCompaniesOrderField** was added. * The input object **PriceDefinitionItemInput** was updated with the field **ISV\_COST**. * The unions **SetResellerCompanyPriceError** and **SetMarketplacePriceError** were updated with the error type **MarkupOnWorkingVersionAfterProductPublishNotAllowedError**. ### Schema Changes on March 14, 2025[​](#schema-changes-on-march-14-2025 "Direct link to Schema Changes on March 14, 2025") * The following changes were made: * The unions **CreateProductError** and **UpdateProductErrors** were updated with the type **ExternalResourceLocalizedFieldsNonConsistentError**. * The object **ExternalResourceLocalizedFieldsNonConsistentError** was added. ### Schema Changes on March 10, 2025[​](#schema-changes-on-march-10-2025 "Direct link to Schema Changes on March 10, 2025") The input object **UpdateProgramApplicantStatusInput** was updated with the field **activateAccount**. ### Schema Changes on February 28, 2025[​](#schema-changes-on-february-28-2025 "Direct link to Schema Changes on February 28, 2025") * The following changes were made * The input object **UnlistProductFromStorefrontInput** was added. * The union **UnlistProductFromStorefrontError** was added. * The below objects were added: * InvalidIdError * ProductNotFoundError * UnlistProductFromStorefrontPayload * The mutation **unlistProductFromStorefront** was added. ### Schema Changes on February 27, 2025[​](#schema-changes-on-february-27-2025 "Direct link to Schema Changes on February 27, 2025") The object **RecordedDiscount** was updated with the field **id**. ### Schema Changes on February 26, 2025[​](#schema-changes-on-february-26-2025 "Direct link to Schema Changes on February 26, 2025") The input object **ProgramApplicantFilter** was updated with the field **lastModifiedOn**. ### Schema Changes on February 25, 2025[​](#schema-changes-on-february-25-2025 "Direct link to Schema Changes on February 25, 2025") * The following changes were made: * The queries **transferUnitEligibleSubscriptions** and **transferUnitEligibleEditions** were updated with the scope **billing.subscription.read.instance**. * The object **SubscriptionDefinition** was updated with the field **endDate**. * The mutation **freeTrialExtensionRequestEligibility** was added. * The below objects were added: * FreeTrialExtensionRequestEligibility * FreeTrialExtensionRequestIneligibilityReason * The mutation **FreeTrialExtensionRequestIneligibilityReasonCode** was added. ### Schema Changes on February 24, 2025[​](#schema-changes-on-february-24-2025 "Direct link to Schema Changes on February 24, 2025") * The following changes were made: * The mutation **updateCart** was removed. * The object **CartItem** was updated with the field **unitsAllocationsForAccounts**. * The below objects were added: * UnitsAllocationsForAccount * CartItemVendorSpecialPricingOffer * The object **CartItemDiscount** was updated with the field **discountAmountExceedsProductPrice**. * The object **CartItemVendorSpecialPricingDetails** was updated with the field **vendorOfferDetails**. * The objects **CartItemPriceDefinition** and **CartItemPriceRange** were updated with the field **originalPrice**. * The object **CartFieldValidation** was updated with the fields **minValue** and **maxValue**. * The input object **UpdateCartInput** was updated as **UpdateCartItemsInput**. * The object **UpdateCartPayload** was removed. * The input object **UpdateCartItemsInput** was removed. * The input object **UnitsAllocationForAccountInput** was added. * The input object **UpdateCartItemInput** was updated with the field **unitsAllocationsForAccounts**. ### Schema Changes on February 19, 2025[​](#schema-changes-on-february-19-2025 "Direct link to Schema Changes on February 19, 2025") * The following changes were made: * The below objects were added: * ReleaseInvoiceBalancePayload * PaymentBalanceReservedError * The union **ReleaseInvoiceBalanceError** was added. * The mutation **releaseInvoiceBalance** was added. * The input object **ReleaseInvoiceBalanceInput** was added. * The enum **InvoiceBalanceStatus** was updated with the field **AWAITING\_REFUND**. ### Schema Changes on February 14, 2025[​](#schema-changes-on-february-14-2025 "Direct link to Schema Changes on February 14, 2025") * The following changes were made: * The unions UpdateProductErrors and CreateProductError union were updated with the below error types: * ProductExternalResourcesPDFLinksMoreThanAllowedError * URLNotSecureError * ProductExternalResourcesPDFLinksAndFilesMoreThanAllowedError * IsNotPDFFileURLError * IsNotValidVideoURLError * The below objects were added: * ProductExternalResourcesPDFLinksMoreThanAllowedError * ProductExternalResourcesPDFLinksAndFilesMoreThanAllowedError * URLNotSecureError * IsNotPDFFileURLError * IsNotValidVideoURLError * ScribdDocument * VideoLink * PdfLink * LocalizedScribdDocument * LocalizedPdfLink * LocalizedVideoLink * ProductLocalizedScribdDocumentResource * ProductLocalizedVideoLinkResource * ProductLocalizedPdfLinkResource * ProductExternalResources * The below input objects were added: * ScribdDocumentInput * VideoLinkInput * PdfLinkInput * UpdateScribdDocumentInput * UpdateVideoLinkInput * UpdatePdfLinkInput * ProductExternalResourcesInput * UpdateProductExternalResourcesInput ### Schema Changes on February 13, 2025[​](#schema-changes-on-february-13-2025 "Direct link to Schema Changes on February 13, 2025") * The following changes were made: * The query **analyzeIndexDeltaStatus** was added. * The below objects were added: * ProductSearchIndexMigrationDeltaResponsePayload * SearchIndexDeltaStatus * SearchIndexDeltaResult * SearchIndexDeltaWarning * The object **ProductSearchIndexMigrationResponsePayload** was updated with the below changes: * The field **mappings** was removed. * The field **success** was added. * The input objects **PublishedProductSearchFiltersTesting** and **PublishedProductSearchFiltersInternal** were updated with the below changes: * The field **attributeIds** was removed. * The fields **attributes** and **attributeOptionIds** were added. * The input object **PublishedProductSearchAttributeFilter** was added. ### Schema Changes on February 12, 2025[​](#schema-changes-on-february-12-2025 "Direct link to Schema Changes on February 12, 2025") * The following changes were made: * The below objects were added: * ProductIntegration * ProductIntegrationSingleSignOnConfigurationSetupForm * ProductIntegrationSetupFormPlaceholderParameter * ProductIntegrationBookmarkConfiguration * ProductIntegrationOpenIdConfiguration * ProductIntegrationSamlConfiguration * ProductIntegrationSamlAttribute * ProductIntegrationOpenIdConnectConfiguration * AddProductIntegrationSingleSignOnConfigurationSetupFormPayload * UpdateProductIntegrationSingleSignOnConfigurationSetupFormPayload * AddProductIntegrationBookmarkConfigurationPayload * UpdateProductIntegrationBookmarkConfigurationPayload * UpdateProductIntegrationOpenIdConfigurationPayload * AddProductIntegrationSamlConfigurationPayload * UpdateProductIntegrationSamlConfigurationPayload * AddProductIntegrationOpenIdConnectConfigurationPayload * UpdateProductIntegrationOpenIdConnectConfigurationPayload * DeleteProductIntegrationSingleSignOnConfigurationSetupFormPayload * SingleSignOnConfigurationForbiddenError * SingleSignOnConfigurationNotFoundError * SingleSignOnConfigurationInvalidArgumentError * SingleSignOnConfigurationInvalidTypeError * SingleSignOnConfigurationUnknownError * SingleSignOnConfigurationInvalidConfigurationError * SingleSignOnConfigurationPublicationError * PageInfo * LocalizedString * LocalizedURL * LocalizedPhoneNumber * LocalizedEmailAddress * The below enums were added: * ProductIntegrationType * OpenIdConfigurationHttpMethod * ProductIntegrationSamlSigningSource * ProductIntegrationSamlSigningAlgorithm * ProductIntegrationOpenIdConnectCredentialMethod * ProductIntegrationOpenIdConnectGrantType * ProductIntegrationOpenIdConnectAllowedScopes * OpenIdConfigurationLoginMethod * ProductIntegrationSamlCertificateUsage * OrderDirection * The below interfaces were added: * ProductIntegrationSingleSignOnConfiguration * UserError * AsynchronousProcess * AsynchronousProcessExecutionError * The below input objects were added: * AddProductIntegrationSingleSignOnConfigurationSetupFormInput * AddSetupFormPlaceholderParameterInput * UpdateProductIntegrationSingleSignOnConfigurationSetupFormInput * UpdateSetupFormPlaceholderParameterInput * AddProductIntegrationBookmarkConfigurationInput * UpdateProductIntegrationBookmarkConfigurationInput * UpdateProductIntegrationOpenIdConfigurationInput * AddProductIntegrationSamlConfigurationInput * AddProductIntegrationSamlAssertionAttributeInput * UpdateProductIntegrationSamlConfigurationInput * UpdateProductIntegrationSamlAssertionAttributeInput * AddProductIntegrationOpenIdConnectConfigurationInput * UpdateProductIntegrationOpenIdConnectConfigurationInput * DeleteProductIntegrationSingleSignOnConfigurationSetupFormInput * LocalizedStringInput * LocalizedURLInput * LocalizedPhoneNumberInput * LocalizedEmailAddressInput * The below unions were added: * AddProductIntegrationSamlConfigurationError * AddProductIntegrationOpenIdConnectConfigurationError * AddProductIntegrationBookmarkConfigurationError * AddProductIntegrationSingleSignOnConfigurationSetupFormError * UpdateProductIntegrationSamlConfigurationError * UpdateProductIntegrationOpenIdConnectConfigurationError * UpdateProductIntegrationBookmarkConfigurationError * UpdateProductIntegrationOpenIdConfigurationError * UpdateProductIntegrationSingleSignOnConfigurationSetupFormError * DeleteProductIntegrationSingleSignOnConfigurationSetupFormError * The below mutations were added: * addProductIntegrationSamlConfiguration * addProductIntegrationOpenIdConnectConfiguration * addProductIntegrationBookmarkConfiguration * addProductIntegrationSingleSignOnConfigurationSetupForm * updateProductIntegrationSamlConfiguration * updateProductIntegrationOpenIdConnectConfiguration * updateProductIntegrationBookmarkConfiguration * updateProductIntegrationOpenIdConfiguration * updateProductIntegrationSingleSignOnConfigurationSetupForm * deleteProductIntegrationSingleSignOnConfigurationSetupForm ### Schema Changes on January 28, 2025[​](#schema-changes-on-january-28-2025 "Direct link to Schema Changes on January 28, 2025") * The following fields were removed from the enum **ImportStatus**: * IMPORT\_IN\_PROGRESS * IMPORTED\_ERRORS * IMPORTED\_SUCCESS * INTEGRATION\_LINKED\_SUCCESS * INTEGRATION\_LINKED\_ERRORS ### Schema Changes on January 24, 2025[​](#schema-changes-on-january-24-2025 "Direct link to Schema Changes on January 24, 2025") * The input objects **PublishedProductSearchFilters** and **PublishedProductSearchFiltersInternal** were updated with the following fields: * distributedAppsAttributeFilters * productTypes ### Schema Changes on January 22, 2025[​](#schema-changes-on-january-22-2025 "Direct link to Schema Changes on January 22, 2025") * The following changes were made: * The below queries were added: * transferUnitEligibleEditions * transferUnitEligibleSubscriptions * The object **TransferUnitsResponse** was updated with the fields **subscriptionId** and **idempotencyKey**. * The below objects were added: * TransferUnitEligibleEditionsResponse * TransferUnitEligibleEdition ### Schema Changes on January 14, 2025[​](#schema-changes-on-january-14-2025 "Direct link to Schema Changes on January 14, 2025") * The enum **CartItemPriceType** was updated with the field **FEE\_DISCOUNT**. ### Schema Changes on January 10, 2025[​](#schema-changes-on-january-10-2025 "Direct link to Schema Changes on January 10, 2025") * The following changes were made: * The query **commissionCyclesByYear** was updated with the field **partner**. * The object **CommissionCycle** was updated with the fields **status** and **lastUpdatedOn**. * The below enums were added: * CommissionCycleStatus * triggerRefreshCycleSummaryDataProcess * The input object **TriggerCycleSummaryRefreshProcessInput** was added. * The object **TriggerCycleSummaryRefreshProcessPayload** was added. ### Schema Changes on January 9, 2025[​](#schema-changes-on-january-9-2025 "Direct link to Schema Changes on January 9, 2025") * The following changes were made: * The below mutations were added: * bootstrapAccountByPartner * bootstrapMembershipByPartner * The below input objects were added: * BootstrapAccountInput * BootstrapMembershipInput * The below objects were added: * BootstrapAccountPayload * BootstrapMembershipPayload ### Schema Changes on January 7, 2025[​](#schema-changes-on-january-7-2025 "Direct link to Schema Changes on January 7, 2025") * The following changes were made: * The enum **PriceBookConditionProperty** was updated with the field **BILLING\_RELATIONSHIP\_ID**. * The enum **Capability** was updated with the field **SUPPORT\_MULTIPLE\_PLANS\_PER\_REQUEST**. ### Schema Changes on January 3, 2025[​](#schema-changes-on-january-3-2025 "Direct link to Schema Changes on January 3, 2025") * The following changes were made: * The query **gmvBalance** was added. * The below objects were added: * GmvBalanceResponse * PageInformation * LocalizedString * LocalizedURL * LocalizedPhoneNumber * LocalizedEmailAddress * The below enums were added: * OrderDirection * ProductVersion * The below interfaces were added: * UserError * AsynchronousProcess * AsynchronousProcessExecutionError * The below input objects were added: * LocalizedStringInput * LocalizedURLInput * LocalizedPhoneNumberInput * LocalizedEmailAddressInput * The input object **TriggerProductDownloadProcessInput** and object **UserActivity** were updated with the field **version**. * The enum **DownloadEntityType** was updated with the field **PRODUCT\_SETTING\_PRODUCT\_LINE**. ### Schema Changes on December 20, 2024[​](#schema-changes-on-december-20-2024 "Direct link to Schema Changes on December 20, 2024") * The following changes were made: * The query **exportSearchIndexDocuments** was added. * The object **ProductSearchIndexMigrationResponsePayload** was updated with the field **success**. * The mutation **migrateDeltaSearchIndexes** was added. * The enum **SegmentFilterMode** was added. * The input object **PublishedProductSearchChannelSettingsInternal** was updated with the field **segmentFilterMode**. * The object **ExportSearchIndexDocumentsResult** was added. ### Schema Changes on December 18, 2024[​](#schema-changes-on-december-18-2024 "Direct link to Schema Changes on December 18, 2024") The query **customerTotalBalanceByAccountAndMerchant** was added. ### Schema Changes on December 16, 2024[​](#schema-changes-on-december-16-2024 "Direct link to Schema Changes on December 16, 2024") * The following objects were added: * UnitsTransferSubscriptionUpdateRequest * UnitsTransferTargetSubscriptionUpdateRequest ### Schema Changes on December 13, 2024[​](#schema-changes-on-december-13-2024 "Direct link to Schema Changes on December 13, 2024") * The following changes were made: * The query **getSubscriptionAndSkuDetails** was added. * The below objects were added: * SubscriptionRenewalDetailsResponse * RenewalPricingEdition * Subscription * Seats * RenewalSettings * GoogleRenewalResponse * PageInformation * LocalizedString * LocalizedURL * LocalizedPhoneNumber * LocalizedEmailAddress * The mutation **setRenewalSettingResponse** was added. * The below input objects were added: * GoogleRenewalRequest * LocalizedStringInput * LocalizedURLInput * LocalizedPhoneNumberInput * LocalizedEmailAddressInput * The enum **OrderDirectionBy** was added. * The below interfaces were added: * UserError * AsynchronousProcess * AsynchronousProcessExecutionError ### Schema Changes on December 11, 2024[​](#schema-changes-on-december-11-2024 "Direct link to Schema Changes on December 11, 2024") * The following changes were made: * The mutation **bootstrapUserByPartner** was added. * The input object **BootstrapUserInput** was added. * The below objects were added: * BootstrapUserPayload * ContentAvailability * The object **ProductEnrichedContent** was updated with the fields **status** and **availability**. * The enum **EnrichedStatus** was added. * The enum **OutOfSyncField** was updated with the field **PRODUCT\_EDITION\_PRICING**. ### Schema Changes on December 10, 2024[​](#schema-changes-on-december-10-2024 "Direct link to Schema Changes on December 10, 2024") * The following changes were made: * The query **billingRelationships** was updated with the field **orderBy**. * The input object **BillingRelationshipOrderBy** was added. * The enum **BillingRelationshipOrderField** was added. ### Schema Changes on December 5, 2024[​](#schema-changes-on-december-5-2024 "Direct link to Schema Changes on December 5, 2024") * The following changes were made: * The below objects were added: * IAASStatusDataResponse * CustomerDetails * IAASStatusData * JobRunDetails * IAASJobRunDetailsResponse * IAASJobDetailsResponse * StatusCount * FileTypeCount * BatchJobDetails * IAASJobDetails * RawUsageCountData * RawUsagesCountDataResponse * CustomerDetailsResponse * FilteredUsageDetailsResponse * The below queries were added: * jobStatusByJobId * jobDetailsByJobIdStatusPartner * jobDetailsResponseByJobExecutionId * rawUsageCountByJobId * customerDetailsByJobRunId * filteredUsageDetailsByJobRunId ### Schema Changes on November 27, 2024[​](#schema-changes-on-november-27-2024 "Direct link to Schema Changes on November 27, 2024") * The following changes were made: * The below objects were added: * ProductSearchIndexMigrationResponsePayload * ProductSearchIndexOperationResponse * PublishedProductSearchResultTesting * The mutation **customizeProductSearchFields** was added. * The object **PublishedProductSearchFieldHighlight** was updated with the field **highlightedTexts**. * The object **PublishedProductSearchHit** was updated with the field **rank**. ### Schema Changes on November 26, 2024[​](#schema-changes-on-november-26-2024 "Direct link to Schema Changes on November 26, 2024") * The following changes were made: * The query **invoice** was added. * The input oject **InvoiceFilter** was added. * The unions **SetResellerCompanyPriceError** and **SetMarketplacePriceError** were updated with the type **InvalidApplicationStatusInPublishedVersionError**. * The object **InvalidApplicationStatusInPublishedVersionError** was added. ### Schema Changes on November 25, 2024[​](#schema-changes-on-november-25-2024 "Direct link to Schema Changes on November 25, 2024") * The following changes were made: * The below objects were added: * BootstrapMarketplaceProductSearchIndexesStatusByLocale * BootstrapMarketplaceProductSearchIndexesErrorStatusByLocale * BootstrapMarketplaceProductSearchIndexesStatus * DistributorProductBenefit * DistributorProductSpecification * The query **bootstrapMarketplaceProductSearchIndexesStatus** was added. * The objects **DistributorAccount** and **DistributorProduct** were updated with the field **distributorMarket**. * The query **distributorProductImports** was updated with the field **distributorMarket**. * The object **ProductEnrichedContent** was updated with the below fields: * description * shortDescription * benefits * specifications * The input object **DistributorDetails** was updated as **DistributorDetailsAccountInput**. ### Schema Changes on November 22, 2024[​](#schema-changes-on-november-22-2024 "Direct link to Schema Changes on November 22, 2024") * The following changes were made: * The below queries were added: * billingRelationship * defaultBillingRelationship * The mutation **deleteBillingRelationship** was added. * The enum **BillingRelationshipPayerType** was updated with the below changes: * The field **PARTNER** was removed. * The field **RESELLER** was added. * The input oject **DeleteBillingRelationshipInput** was added. * The object **DeleteBillingRelationshipPayload** was added. ### Schema Changes on November 14, 2024[​](#schema-changes-on-november-14-2024 "Direct link to Schema Changes on November 14, 2024") The input object **FirstUserInput** was updated to include the field **emailAddress**. ### Schema Changes on November 13, 2024[​](#schema-changes-on-november-13-2024 "Direct link to Schema Changes on November 13, 2024") * The following changes were made: * The object **BalanceApplicationRequest** was updated to include the field **userId**. * The mutation **createBalanceApplicationRequest** was updated with the below scopes: * ROLE\_BILLING\_ADMIN * ROLE\_SALES\_SUPPORT * ROLE\_SYS\_ADMIN * The input object **CreateBalanceApplicationRequestInput** was updated to include the field **userId**. ### Schema Changes on October 31, 2024[​](#schema-changes-on-october-31-2024 "Direct link to Schema Changes on October 31, 2024") * The following changes were made: * The enum **CreditMemoStatus** was updated to include the field **DRAFT**. * The object **Invoice** was updated to inlcude the below fields: * amountDue * amountPaid * billingRelationshipOwnerInvoiceNumber * carriedBalance * carriedInvoices * creditNote * currency * customer * displayTaxBreakdown * invoiceDate * invoiceNumber * lines * locale * localized * paymentTerms * merchantOfRecord * status * subtotal * tenant * taxReport * taxDetails * total * totalTax * sourceType * payments * delegatedToInvoice * The object **InvoiceLine** was updated to inlcude the below fields: * billingCharge * buyer * cost * costPeriod * description * discount * edition * period * pricingPlan * product * provider * quantity * subscription * total * type * unitPrice * orderRef * orderLineId * The below objects were added: * InvoicePaymentTerms * InvoiceBillingCharge * InvoiceRecordedBillingCharge * InvoiceConnection * TaxReport * TaxReportDetail * TaxReportSummary * InvoiceListItem * The enum **InvoiceLineType** was added. ### Schema Changes on October 30, 2024[​](#schema-changes-on-october-30-2024 "Direct link to Schema Changes on October 30, 2024") The mutation **ProductSearchManagement** was removed. ### Schema Changes on October 29, 2024[​](#schema-changes-on-october-29-2024 "Direct link to Schema Changes on October 29, 2024") * The following changes were made: * The data types of the below fields were changed in the **Invoice** object: * customer * amountDue * amountPaid * subtotal * totalTax * carriedBalance * total * taxDetails * The data types of the below fields were changed in the **InvoiceLine** object: * quantity * unitPrice * total * buyer * provider * cost * subscription * product * edition * pricingPlan * discount * costPeriod * The data types of the below fields were changed in the **TaxDetail** object: * taxType * taxableAmount * taxAmount * The below objects were added: * Party * UserInfo * RecordedUser * RecordedAddressPair * RecordedAddress * AccountInfo * RecordedAccount * SubscriptionInfo * EditionInfo * Edition * PricingPlan * PaymentIntent * The below objects were renamed: * **InvoiceRecordedEdition** as **RecordedEdition**. * **InvoicePricingPlan** as **PricingPlanInfo**. * **InvoiceRecordedPricingPlan** as **RecordedPricingPlan**. * **InvoiceTaxType** as **TaxType**. * **InvoiceDiscount** as **DiscountInfo**. * **InvoiceRecordedDiscount** as **RecordedDiscount**. * **InvoiceRecordedDiscountUnit** as **RecordedDiscountUnit**. * The object **Payment** was updated to include the below fields: * currency * intents * The object **PaymentMethod** was updated to include the below fields: * status * account * user ### Schema Changes on October 28, 2024[​](#schema-changes-on-october-28-2024 "Direct link to Schema Changes on October 28, 2024") * The following changes were made: * The object **DistributorProduct** was updated to include the below fields: * vendorId * isMultiplePurchasesAllowed * usageType * distributorMarket * The object **DistributorProductPrice** was updated with the below changes: * The field **amount** was removed. * The field **priceRanges** was added. * The below objects were added: * DistributorProductPriceRange * DistributorVendorConfigurations * DistributorVendorResellerFieldConfiguration * DistributorFieldPossibleValue * DistributorFieldValidation * BillingRelationship * BillingRelationshipDetail * BillingRelationshipConnection * CreateBillingRelationshipPayload * UpdateBillingRelationshipPayload * BillingRelationshipValidationError * FreeBillingCharge * OneTimeBillingCharge * RecurringBillingCharge * SubscriptionUpdateResponse * SubscriptionUpdateValidationError * SubscriptionUpdateRequestStatusResponse * BasicSubscriptionUpdateRequest * SubscriptionUpdateRequestItem * SubscriptionUpdateRequestItemUnit * SubscriptionUpdateRequestDiscountCode * SubscriptionUpdateRequestCustomAttribute * The below enums were added: * DistributorProductUsageType * DistributorMarket * DistributorFieldType * OutOfSyncField * BillingRelationshipStatus * BillingRelationshipBuyerType * BillingRelationshipMerchantOfRecordType * BillingRelationshipPayerType * BillingRelationshipOwnerType * The below input objects were added: * DistributorDetailsInput * VendorConfigurationInput * VendorResellerFieldConfigurationInput * CreateBillingRelationshipInput * CreateBillingRelationshipDetailInput * UpdateBillingRelationshipInput * The object **Distributor** was updated to include the below fields: * market * vendors * vendorConfigurations * The object **DistributorAccount** was updated to include the below fields: * subscriptionKey * isCredsUpdatedInConnectorDb * The object **PublishDetails** was updated to include the new field **isPublishedAfterSync**. * The object **SyncDetails** was updated with the below changes: * The field **isOutOfSync** was removed. * The field **outOfSyncFields** was added. * The enum **ImportStatus** was updated to include the below fields: * SUCCESS * ERROR * IN\_PROGRESS * The input object **RegisterDistributorAccountInput** was updated to include the field **distributorDetails**. * The input object **DistributorAccountSettingsInput** was updated to include the field **vendorConfigurations**. * The input objects **DistributorsProductsFilter** and **DistributorProductImportsFilter** were updated to include the field **distributorDetails**. * The query **billingRelationships** was added. * The mutation **createBillingRelationship** was added. * The below interfaces were added: * MainBillingCharge * SubscriptionUpdateRequest * SubscriptionUpdateRequestStatus * The below objects were removed: * SubscriptionUpdateResponse * SubscriptionUpdateValidationError * SubscriptionUpdateRequestStatusResponse * SubscriptionUpdateRequest * The enum **RequestStatus** was removed. ### Schema Changes on October 25, 2024[​](#schema-changes-on-october-25-2024 "Direct link to Schema Changes on October 25, 2024") * The following changes were made: * The object **CostPriceNotAllowedError** was added. * The union **SetMarketplacePriceError** was updated to include the error type **CostPriceNotAllowedError**. * The union **RemoveMarketplacePriceError** was updated to include the error types **CostPriceNotAllowedError** and **FeesMissingOnPricingPlanError**. ### Schema Changes on October 24, 2024[​](#schema-changes-on-october-24-2024 "Direct link to Schema Changes on October 24, 2024") * The following changes were made: * The enum \***BalanceSourceType** was updated to include a new field **CREDIT\_MEMO**. * The object **PaymentIntent** was removed. * The below fields were removed from the object **Payment**: * currency * intents ### Schema Changes on October 17, 2024[​](#schema-changes-on-october-17-2024 "Direct link to Schema Changes on October 17, 2024") * The following changes were made: * The enum **DownloadEntityType** was updated with the below changes: * The fields **PRODUCT**, **PRODUCT\_CONSOLIDATE**, and **CATEGORY** were deprecated. * The fields **PRODUCT\_SETTING\_GENERAL**, **CATALOG\_CONSOLIDATED**, and **PRODUCT\_SETTING\_CATEGORY** were added. * The input object **UserActivityFilterInput** was added. ### Schema Changes on September 30, 2024[​](#schema-changes-on-september-30-2024 "Direct link to Schema Changes on September 30, 2024") * The following changes were made: * The below fields were added to the object **ProductPricing**: * revenueModel * billingFrequency * The below objects were added. * DistributorProductPrice * InvalidAccountNumberError * The below enums were added: * RevenueModel * BillingFrequency * DistributorProductPriceType * DistributorProductPriceStrategy * The object **LastImportedProductData** was updated to include the new field **manufacturerPartNumber**. * The unions **UpdateDistributorAccountError** and **RegisterDistributorAccountError** were updated to include the new field **InvalidAccountNumberError**. ### Schema Changes on September 28, 2024[​](#schema-changes-on-september-28-2024 "Direct link to Schema Changes on September 28, 2024") A new field **sourceType** was added to the object **Invoice**. ### Schema Changes on September 27, 2024[​](#schema-changes-on-september-27-2024 "Direct link to Schema Changes on September 27, 2024") * The following changes were made: * The below objects were updated: * **UserMembershipDetailsFilter** was updated to include a new field **roles**. * **UpdateUserInput** was updated to include two new fields **idpId** and **username**. ### Schema Changes on September 24, 2024[​](#schema-changes-on-september-24-2024 "Direct link to Schema Changes on September 24, 2024") * The following changes were made: * The below ojects were added: * DeleteInvoicePayload * InvoiceHasInvalidStatusError * The union **DeleteInvoiceError** was added. * The mutation **deleteInvoice** was added. * The following inut objects were added: * DeleteInvoiceInput * CloseCreditMemoInput ### Schema Changes on September 23, 2024[​](#schema-changes-on-september-23-2024 "Direct link to Schema Changes on September 23, 2024") * The following objects were added: * InvoiceAlreadyRefundedError * TaxCalculationError * InvalidStatusError ### Schema Changes on September 12, 2024[​](#schema-changes-on-september-12-2024 "Direct link to Schema Changes on September 12, 2024") * The following changes were made: * The below input objects were added: * FunctionVariableInput * CreateFunctionInput * DeleteFunctionInput * UpdateFunctionInput * RetryFunctionProvisioningInput * FunctionsFilter * FunctionsOrderBy * LocalizedStringInput * LocalizedURLInput * LocalizedPhoneNumberInput * LocalizedEmailAddressInput * The below objects were added: * CreateFunctionPayload * DeleteFunctionPayload * UpdateFunctionPayload * RetryFunctionProvisioningPayload * InvalidFunctionNameError * InvalidCodeFileNameError * InvalidFunctionVariableKeyError * InvalidFunctionVariableValueError * DuplicateFunctionVariableKeyError * DuplicateFunctionNameError * InvalidFunctionProvisioningStatusError * Function * FunctionVariable * FunctionInvocation * FunctionInvocationLogLine * FunctionConnection * PageInformation * LocalizedString * LocalizedURL * LocalizedPhoneNumber * LocalizedEmailAddress * The below unions were added: * CreateFunctionError * UpdateFunctionError * RetryFunctionProvisioningError * The below enums were added: * FunctionProvisioningStatus * FunctionsOrderByField * OrderDirection * The below new interfaces were added: * UserError * AsynchronousProcess * AsynchronousProcessExecutionError ### Schema Changes on September 3, 2024[​](#schema-changes-on-september-3-2024 "Direct link to Schema Changes on September 3, 2024") The object **CartItemProduct** was updated to include the new field **linkToProductWebsite**. ### Schema Changes on August 30, 2024[​](#schema-changes-on-august-30-2024 "Direct link to Schema Changes on August 30, 2024") * The following changes were made: * The object **Account** was updated to include the below new fields: * website * contactAddress * contactPhoneNumber * contactEmail * accountMemberships * The below new objects were added: * AccountContactAddress * AccountMembershipDetails * UserMembershipDetails * The object **User** was updated to include the below new fields: * status * userMemberships * A new query **accountMembershipsByAccessType** was added. ### Schema Changes on August 29, 2024[​](#schema-changes-on-august-29-2024 "Direct link to Schema Changes on August 29, 2024") * The following changes were made: * The query **publishedProductsSearchInternal** was updated to include the below new fields: * useProductionVersion * companyAdminIsCuratingCatalog * The below new queries were added: * publishedProductsSearchTesting * publishedProductsSearch * The below enums were added: * SegmentedProductVisibilityType * DistributorProductType * DistributorId * MarkupStatus * The below input objects were added: * PublishedProductSearchChannelSettingsTesting * PublishedProductSearchCompanySettingsInternal * PublishedProductSearchFiltersTesting * CustomAccountDetailsInput * The object **DistributorProduct** was updated to include the below new fields: * type * manufacturerPartNumber * price * productEnrichedContent * The below new objects were added: * ProductEnrichedContent * GraphqlImage * ProductPrice * MarkupDetails * The below objects were updated: * **Distributor** was updated to include a new field **defaultPriceType**. * **DistributorProductImport** was updated to include a new field **markupDetails**. * The below input objects were updated: * **IngramRegistrationInput** was updated to include the below new fields: * accountNumber * subscriptionKey * **UpdateDistributorAccountInput** was updated to include the new field **customAccountDetails**. ### Schema Changes on August 28, 2024[​](#schema-changes-on-august-28-2024 "Direct link to Schema Changes on August 28, 2024") * The following changes were made: * The input objects **CreateAccountWebhookConfigurationInput**, **UpdateWebhookConfigurationInput**, and **CreateTenantWebhookConfigurationInput** were updated to include a new field **destination**. * The below new objects were added: * WebhookDestinationInput * WebhookEndpoint * The object **WebhookConfiguration** was updated to include a new field **destination**. * A new union **WebhookDestination** was added. ### Schema Changes on August 27, 2024[​](#schema-changes-on-august-27-2024 "Direct link to Schema Changes on August 27, 2024") * The following changes were made: * The below objects were updated: * **Account** was updated to include a new field **programApplicant**. * **ProgramStep** and **ProgramStepInput** were updated to include a new field **props**. * **ProgramApplicant** was updated to include new fields **companyId** and **isValidated**. * The enum **ProgramApplicantStatus** was updated to include a new field **DELETED**. * A new object **ValidateProgramApplicantPayload** was added. * The below input objects were updated: * **ProgramApplicantFilter** was updated to include a new field **isValidated**. * **UpdateProgramApplicantInput** was updated to include a new field **companyId**. * A new input object **ValidateProgramApplicantInput** was added. ### Schema Changes on August 26, 2024[​](#schema-changes-on-august-26-2024 "Direct link to Schema Changes on August 26, 2024") * The following changes were made: * The below new objects were added: * InvalidAmountForIncludedItemsError * InvalidKeepBillDateOnPricingPlanChangeConfigurationError * The below unions were updated: * **CreatePricingPlanError** was updated to include a new error type **InvalidKeepBillDateOnPricingPlanChangeConfigurationError**. * **UpdatePricingPlanError** was updated to include a new error type **InvalidKeepBillDateOnPricingPlanChangeConfigurationError**. * **UpdateEditionPricingError** was updated to include a new error type **InvalidAmountForIncludedItemsError**. * **SetMarketplacePriceError** was updated to include a new error type **ApplicationStatusLaunchedInWorkingVersionNotAllowedError**. * **SetResellerCompanyPriceError** was updated to include a new error type **ApplicationStatusLaunchedInWorkingVersionNotAllowedError**. * A new enum **ApplicationStatus** was added. ### Schema Changes on August 14, 2024[​](#schema-changes-on-august-14-2024 "Direct link to Schema Changes on August 14, 2024") * The following changes were made: * A new object **NumberOutOfBoundsError** was added. * A new field **position** was added to: * Input objects - CreateProductEditionInput, UpdateProductEditionInput. * Objects - ProductEdition. * A new error type **NumberOutOfBoundsError** was added to unions CreateProductEditionError and UpdateProductEditionErrors. ### Schema Changes on August 8, 2024[​](#schema-changes-on-august-8-2024 "Direct link to Schema Changes on August 8, 2024") * The following changes were made: * The below new objects were added: * Product * ReadPsaCompanyPayload * PsaCompanyMappingsConnection * PsaCompanyMappingReadError * ReadPsaProductMappingPayload * PsaProductMappingReadError * CreatePsaAdditionForSubscriptionPayload * CreatePsaAdditionForSubscriptionAndAgreementPayload * CreatePsaAdditionForSubscriptionError * CreatePsaAdditionForSubscriptionAndAgreementError * PsaSyncedSubscriptionsFilter * PsaSyncedSubscriptionsOrderBy * PsaSyncedSubscriptionsConnection * PsaSyncedSubscription * PsaSyncedSubscriptionOrder * PsaSyncedSubscriptionOrderLine * PsaSyncedSubscriptionOriginalOrderLine * SyncedPsaAgreement * The below input objects were updated: * **CreatePsaConnectorInput** and **UpdatePsaConnectorInput** were updated to include the below new fields: * configuration * credentials * **PsaProductMappingsFilter** was updated to include the below new fields: * psaProductName * productName * The below objects were updated: * **PsaConnector** was updated to include the below new fields: * configuration * credentials * **PsaConnectorConfiguration** was updated to include a new field **credentials**. * **PsaCompanyMapping** was updated to include the below new fields: * companyName * createdDate * updatedDate * createdBy * updatedBy * **PsaProductMapping** was updated to include the below new fields: * product * productName * productId * createdOn * updatedOn * The query **psaCompanyMappings** was updated to include the below: * New fields: * first * after * last * before * filter * orderBy * Return field **PsaCompanyMappingsConnection**. * The below new queries were added. * readCompanyMappingByAccountIdAndOrPsaAccountId * readPsaProductMappingByItemIdsOrPsaProductId * psaSyncedSubscriptions * The following new mutations were added: * removeCompanyMapping * createPsaAdditionForSubscription * createPsaAdditionForSubscriptionAndAgreement * The following input objects were added: * RemoveCompanyMappingInput * PsaCompanyMappingsFilter * PsaCompanyMappingsOrderBy * CreatePsaAdditionForSubscriptionInput * CreatePsaAdditionForSubscriptionAndAgreementInput * The below new enums were added: * PsaCompanyMappingsOrderField * PsaProductMappingOrderField * PsaSyncedSubscriptionStatus * SyncPsaSubscriptionOrderField ### Schema Changes on August 6, 2024[​](#schema-changes-on-august-6-2024 "Direct link to Schema Changes on August 6, 2024") * The following changes were made: * Below queries were added: * commissionEvent * commissionCyclesByYear * commissionCycleExecutions * commissionEventReport * eventsMissingByCycle * Below input objects were added: * CommissionEventFilter * TriggerCommissionImportProcessInput * TriggerCommissionRetryProcessInput * TriggerCommissionCancelProcessInput * LocalizedStringInput * LocalizedURLInput * LocalizedPhoneNumberInput * LocalizedEmailAddressInput * Below objects were added: * CommissionEventConnection * CommissionEvent * CommissionCycle * CommissionEventsSummary * CommissionCycleExecutionsConnection * CommissionEventErrorSummary * BatchMissingEvents * TriggerCommissionImportProcessPayload * TriggerCommissionRetryProcessPayload * TriggerCommissionCancelProcessPayload * InvalidInputAmountError * InvalidInputFieldError * PageInfo * LocalizedString * LocalizedURL * LocalizedPhoneNumber * LocalizedEmailAddress * Below enums were added: * ProcessStatus * EventStatus * OrderDirection * Below unions were added: * TriggerCommissionImportError * TriggerCommissionCancelError * Below mutations were added: * triggerCommissionImportProcess * triggerCommissionRetryProcess * triggerCommissionCancelProcess * Below interfaces were added: * UserError * AsynchronousProcess * AsynchronousProcessExecutionError ### Schema Changes on July 29, 2024[​](#schema-changes-on-july-29-2024 "Direct link to Schema Changes on July 29, 2024") * The following changes were made: * The object **BalanceTransaction** was updated to include a new field **source**. * The below objects were added: * CloseCreditMemoPayload * CreditMemoHasNoBalanceError * CreditMemoBalanceReservedError * A new union **CloseCreditMemoError** was added. * A new mutation **closeCreditMemo** was added. * A new input object **CloseCreditMemoInput** was added. * The input object **CreditMemoBalanceStatus** was updated to include a new field **CLOSED**. * The object **SubscriptionDefinition** was updated with the new field **addOnSubscriptions**. ### Schema Changes on July 5, 2024[​](#schema-changes-on-july-5-2024 "Direct link to Schema Changes on July 5, 2024") * The following changes were made: * The below objects were added: * CuratedCompanyCatalog * CuratedCompanyCatalogInput * The query **curatedCompanyCatalog** was updated to include a new argument **CuratedCompanyCatalogInput** and return field **CuratedCompanyCatalog**. ### Schema Changes on July 4, 2024[​](#schema-changes-on-july-4-2024 "Direct link to Schema Changes on July 4, 2024") * The enum DownloadEntityType was updated to include the following new fields: * PRICE\_BOOK * PRODUCT\_INTEGRATION * PRICE\_BOOK\_SCHEDULE * PRODUCT\_INTEGRATION\_CREDENTIAL * PRODUCT\_INTEGRATION\_AUTHENTICATION\_BOOKMARK * PRODUCT\_INTEGRATION\_AUTHENTICATION\_OPEN\_ID * PRODUCT\_INTEGRATION\_AUTHENTICATION\_OPEN\_ID\_CONNECT * PRODUCT\_INTEGRATION\_AUTHENTICATION\_SAML ### Schema Changes on June 28, 2024[​](#schema-changes-on-june-28-2024 "Direct link to Schema Changes on June 28, 2024") * The following objects were added: * SubscriptionInformation * SubscriptionState * ContractVendorEndDateResponse * SubscriptionUpdateResponse * SubscriptionUpdateValidationError * SubscriptionUpdateRequestStatusResponse * SubscriptionUpdateRequest * SubscriptionUpdateRequestItem * SubscriptionUpdateRequestInput * SubscriptionUpdateRequestItemInput * The following input objects were added: * ContractVendorEndDateRequestInput * ContractVendorEndDateRequestItemInput * A new enum **RequestStatus** was added. * A new query **subscriptionUpdateRequestStatus** was added. * A new mutation **subscriptionUpdateRequest** was added. ### Schema Changes on June 27, 2024[​](#schema-changes-on-june-27-2024 "Direct link to Schema Changes on June 27, 2024") * The following enums were added: * **PriceBookMarkupType** - Lists all applicable markup types for a price book. * **PricingPlanStatus** - Status of pricing plan. * A new object **PriceBookVersionExistsForInputVersionedDateError** was added that represents an error when the price book version for the provided input version date already exists. * The union **CreateOrUpdatePriceBookVersionError** was updated to include a new possible error type **PriceBookVersionExistsForInputVersionedDateError**. * The union **CreateOrUpdatePricingEventError** was updated to include the following new possible error types: * ContractFeeNotConfiguredOnPricingPlanError * DuplicatePriceBookConditionNameError * DuplicatePriceBookConditionPropertyError * DuplicatePriceBookNameError * DuplicatePricingPlanForPriceBookError * DuplicatePricingUnitError * DuplicateUnitQtyTierError * FeesMissingOnPricingPlanError * FlatFeeNotConfiguredOnPricingPlanError * InvalidContractFeePriceConfiguration * InvalidCreateOrUpdatePriceBookInputError * InvalidFlatFeePriceConfiguration * InvalidPriceBookPriority * InvalidPriceValueForFee * InvalidRevenueModuleForMarkups * InvalidSetupFeePriceConfiguration * MarkupOnWorkingVersionNotAllowedError * PriceBookDateChangeNotAllowed * PriceBookDateRangeError * PriceBookEndDateError * PriceBookEntryFeesMissing * PriceBookEntryPricesForFeesNotProvidedError * PriceBookStartDateError * PricingPlanUnitFeeNotConfiguredError * SetupFeeNotConfiguredOnPricingPlanError * UnitPriceRangeNotConfiguredOnPricingPlanError * UnitSetupFeeNotConfiguredOnPricingPlanError ### Schema Changes on June 26, 2024[​](#schema-changes-on-june-26-2024 "Direct link to Schema Changes on June 26, 2024") * The following objects were added: * DistributorProduct * CategoryOutput * SubCategoryOutput * Distributor * DistributorOld * DistributorAccount * DistributorAccountConnectionStatus * DistributorAccountSettings * MarkupFeeSettings * MarkupFee * DistributorProductImportsConnection * DistributorProductImport * ImportDetails * PublishDetails * SyncDetails * ProductImporterDetails * MarketplaceProductDetails * PricingPlanDetails * EditionDetails * LastImportedProductData * DistributorsProductsFiltersData * SubCategory * Category * Vendor * InvalidAccountCredentialsError * InvalidSftpCredentialsError * DuplicateAccountError * InvalidDistributorProductIdsError * ShippingConnectorNotSetupError * DistributorAccountError * DeleteDistributorAccountPayload * RegisterDistributorAccountPayload * UpdateDistributorAccountPayload * UpdateUnitPricePayload * UpdateDistributorProductInput * UpdateDistributorProductPayload * TriggerDistributorsProductsImportsPayload * DistributorsProductsConnection * TriggerBalanceOperationEventPayload * The following input objects were added: * DeleteDistributorAccountInput * AccountDetailsInput * RegisterDistributorAccountInput * SynnexRegistrationInput * IngramRegistrationInput * UpdateDistributorAccountInput * DistributorAccountSettingsInput * MarkupFeeSettingsInput * MarkupFeeInput * BasicAccountDetailsInput * SFTPDetailsInput * UpdateUnitPriceInput * TriggerDistributorsProductsImportsInput * DistributorsProductsImportsOrderByInput * DistributorProductImportsFilter * DistributorsProductsFilter * DistributorsProductsOrderByInput * CategoryFilterInput * DistributorAccountFilter * TriggerBalanceOperationEventInput * The enums were added: * DistributorId * MarkupFeeType * ProductType * ImportStatus * PublishStatus * SyncStatus * ImportStatusFilter * SortDirectionInput * OrderDirection * The following unions were added: * RegisterDistributorAccountError * UpdateDistributorAccountError * TriggerDistributorsProductsImportsError * The following queries are added: * distributorsDetails * distributorAccount * distributorsProducts * distributorsProductsFiltersData * distributorProductImports * The following mutations are added: * registerDistributorAccount * updateDistributorAccount * deleteDistributorAccount * triggerDistributorsProductsImports * triggerBalanceOperationEvent * The object **VoidInvoicePayload** was updated to include a new field **creditMemos**. * The union **VoidInvoiceError** was updated to include the following possible error types: * InvoiceLinkedToPaymentError * InvoiceBalanceReservedError * InvoiceSiblingCreditMemoAppliedError ### Schema Changes on June 25, 2024[​](#schema-changes-on-june-25-2024 "Direct link to Schema Changes on June 25, 2024") * The object **CreditMemoLine** was updated to include a new field **associatedInvoiceLineId**. * The following enums were added: * CreditMemoOrderField * CreditMemoStatus * A new union **CreditMemoConnectionError** was added. * The following new objects were added: * Invoice * InvoiceLine * InvalidScopeError * CostPeriodInfo * RecordedSubscription * TaxDetail * TaxType * Edition ### Schema Changes on June 24, 2024[​](#schema-changes-on-june-24-2024 "Direct link to Schema Changes on June 24, 2024") * The following mutations were added: * **removePrivacyPolicyLink** - Removes a privacy policy link for a product. * **removeTermsAndConditionsLink** - Removes a terms and conditions link for a product. * The following input objects were added: * **RemovePrivacyPolicyLinkPayload** - Payload returned on removing the privacy policy link. * **LocalizedFieldLocaleError** - Error when the localized field does not contain the locale. * **ProductVariantProcessCancelledError** - Error when the product variant process is canceled. * The following unions were added: * **RemovePrivacyPolicyLinkErrors** - A union type that encapsulates all possible errors that may occur on removing a privacy policy link. * **RemoveTermsAndConditionsLinkErrors** - A union type that encapsulates all possible errors that may occur when removing a terms and conditions link. * The union type **ProductVariantsCreationProcessExecutionError** was updated to include new possible error type **ProductVariantProcessCancelledError**. * A new query **productVariantsCreationProcessByProductRefId** was added to query the variants creation process by product ref id. ### Schema Changes on June 7, 2024[​](#schema-changes-on-june-7-2024 "Direct link to Schema Changes on June 7, 2024") * The object **Account** was updated to include the following new fields: * **Tenant** - The Tenant that account belongs to. * **allowMembershipCreationByMarketplaceUsers** - Allows membership creation by marketplace users. * The enum **AccountMembershipRole** was updated to include a new field CORPORATE\_ADMIN. * The query **activeCart** was updated to include a new argument **locale**. * The object **CartItem** was updated to include the following new fields: * **isAddonItem** - Identifies if the cart item is an addon item or not. * **parentItemId** - Identifier for the main cart item ID to which addon item is associated. Populated only if isAddonItem is true, null otherwise. * The following new objects were added: * ExpiredDiscountCodeError * UpdateCartCustomAttributesPayload * The enum **CartFieldType** was updated to include a new field **DATE**. * The following new input objects were added: * UpdateCartCustomAttributesInput * CartCustomAttributeInput * CartCustomAttributesInput * UpdateCartItemCustomAttributesInput * CartItemCustomAttributesInput * CartItemCustomAttributeInput * The input object **ActiveCartOfUserInput** was updated to include a new field **locale**. ### Schema Changes on May 29, 2024[​](#schema-changes-on-may-29-2024 "Direct link to Schema Changes on May 29, 2024") * The query **publishedProductsSearchInternal** was updated to include new arguments: forceDefaultProductSearchFields, tenantSettings, userSettings, and useProductionVersion. * The following queries were added: * productSearchSettings * publishedProductsSearchInternal * productSearchSettings * The input object **PublishedProductSearchChannelSettingsInternal** was updated to include a new field minimumReviewsForRating. * A new input object **PublishedProductSearchUserSettingsInternal** was added. ### Schema Changes on May 17, 2024[​](#schema-changes-on-may-17-2024 "Direct link to Schema Changes on May 17, 2024") * The following input objects were added: * PsaMorInput * PsaFieldValueInput * CreatePsaConnectorInput * UpdatePsaConnectorInput * CreatePsaConnectorConfigurationInput * UpdatePsaConnectorConfigurationInput * ReadPsaConnectorConfigurationInput * CreatePsaCompanyMappingInput * UpdatePsaCompanyMappingInput * PsaCompanyInput * CreatePsaProductMappingInput * PsaProductInput * RemovePsaProductMappingInput * PsaProductMappingsFilter * PsaProductMappingsOrderBy * CreatePsaAdditionInput * The following objects were added: * PsaMor * PsaFieldValue * CreatePsaConnectorPayload * UpdatePsaConnectorPayload * CreatePsaConnectorConfigurationPayload * UpdatePsaConnectorConfigurationPayload * PsaConnectorInputError * PsaConnectorConfigurationError * PsaConnector * PsaConnectorConfiguration * PsaCompanyMapping * PsaCompany * CreatePsaCompanyMappingPayload * UpdatePsaCompanyMappingPayload * PsaCompanyInputError * PsaProductMappingConnection * PsaProductMapping * PsaProduct * ProductDetails * PageInformation * CreatePsaProductMappingPayload * RemovePsaProductMappingPayload * PsaProductInputError * PsaAgreement * CreatePsaAdditionPayload * CreatePsaAdditionError * PageInformation * The following enums were added: * PsaConnectorType * MorType * OrderDirectionBy * PsaProductName * The following mutations were added: * createPsaConnector * updatePsaConnector * createPsaConnectorConfiguration * updatePsaConnectorConfiguration * createPsaCompanyMapping * updatePsaCompanyMapping * createPsaProductMapping * removePsaProductMapping * createPsaAddition * The following queries were added: * psaConnectors * psaConnectorConfiguration * psaCompaniesByName * psaCompanyMappings * psaProductsByName * psaProductMappings * psaAgreementsByCompanyId ### Schema Changes on May 9, 2024[​](#schema-changes-on-may-9-2024 "Direct link to Schema Changes on May 9, 2024") The enum **UsageFileUploadStatus** was updated to include a new field **UPLOAD\_PROCESSING**. ### Schema Changes on April 26, 2024[​](#schema-changes-on-april-26-2024 "Direct link to Schema Changes on April 26, 2024") * The mutation createAllocation was updated the following authorization scopes: * ROLE\_CHANNEL\_ADMIN * ROLE\_CHANNEL\_SUPPORT * ROLE\_PARTNER * ROLE\_BILLING\_ADMIN * ROLE\_SYS\_ADMIN * ROLE\_RESELLER * ROLE\_SALES\_SUPPORT * ROLE\_CHANNEL\_PRODUCT\_SUPPORT * ROLE\_CORPORATE\_ADMIN * ROLE\_INTERNAL * billing-charge.subscription-allocation.write.instance * billing-charge.subscription-allocation.write.tenant * billing-charge.subscription-allocation.write.account * A new query **allocation** was added. * A new input object **SubscriptionAllocationInput** was added. ### Schema Changes on April 10, 2024[​](#schema-changes-on-april-10-2024 "Direct link to Schema Changes on April 10, 2024") The following changes were made: * The enum **DownloadEntityType** has been updated with the following new fields: * PRODUCT\_MEDIA * PRODUCT\_FEATURE\_CHARACTERISTIC * PRODUCT\_CONSOLIDATE * PRODUCT\_IMAGE ### Schema Changes on April 8, 2024[​](#schema-changes-on-april-8-2024 "Direct link to Schema Changes on April 8, 2024") The following changes were made: * The input object **AccountsFilter** has been updated to include a new boolean field **searchExternalId**. * The input object **UsersFilter** has been updated to include a new field **roles**. ### Schema Changes on March 18, 2024[​](#schema-changes-on-march-18-2024 "Direct link to Schema Changes on March 18, 2024") * Following mutations were added: * **createOrUpdatePriceBook** - Creates a new price book or updates the existing price book. * **createOrUpdatePriceBookVersion** - Creates price book version by price book Id or updates price book version by its Id. * Following objects were added: * **InvalidCreateOrUpdatePriceBookVersionInputError** - Represents an error when provided input for creating or updating price book version is not valid. * **InvalidCreateOrUpdatePriceBookInputError** - Represents an error when provided input for creating or updating price book is not valid. * **InvalidCreateOrUpdatePricingEventInputError** - Represents an error when provided input for creating or updating pricing event is not valid. * **CreateOrUpdatePriceBookPayload** - Payload for creating or updating price books. * **PriceBookEntryPricesForFeesNotProvidedError** - Represents an error with the prices for different fees of price book entry not provided while creating or updating price book entry. * **CreateOrUpdatePriceBookVersionPayload** - Payload for create or update price book version. * **PriceBookVersionConnection** - A connection type used to page through a list of price book versions. * Following input objects were added: * **CreateOrUpdatePriceBookInput** - Input for creating or updating price books. * **CreateOrUpdatePriceBookMetaDataInput** - Input to create or update price book metadata. * **CreateOrUpdatePriceBookConditionInput** - Input to create or update price book condition. * **CreateOrUpdatePriceBookEntryInput** - Input to create or update price book entry. * **PriceBookConditionInput** - Input to add or update price book condition. * **createOrUpdateEntryInput** - Input to create or update product entry in price book. * **RemoveEntryFeesInput** - Input to remove fees from price book entry. * **CreateOrUpdatePriceBookVersionInput** - Input for creating or updating price book version. * **UpdatePriceBookEntryVersionInput** - Input to update price book entry version. * **PriceBookEntryVersionInput** - Input to add or update price book entry version. * **PriceBookEntryVersionUnitPriceInput** - Input for setting custom prices on the unit fee of the price book version. * **UpdatePriceBookConditionVersionInput** - Input to update price book condition version. * **PriceBookConditionVersionInput** - Input to add or update price book condition version. * **PriceConditionVersionInput** - Input for associating or updating or removing the companies/segments to price book condition version. * **UpdatePriceBookVersionInput** - Input for updating price book version metadata. * **PriceBookVersionFilter** - Definition used to filter price book versions returned in the query. * **PriceBookVersionOrderBy** - Definition used to order price book versions returned in the query. * A new field **uuid** has been added to the **PriceBookEntryUnitPrice** object. * A new boolean field **isDeleted** has been added to the **PriceBook** object. * The following enums were added: * **PriceBookAction** - Action enum for price book. * **PriceBookConditionAction** - Action enum for price book condition. * **PriceBookEntryAction** - Action enum for price book entry. * **PriceBookEntryVersionActionEnum** - Enum for price book entry version action. * **PriceBookConditionVersionActionEnum** - Enum for price book condition version action. * **PriceBookVersionOrderField** - List of fields to sort price book versions returned in the query. * The following unions were added: * **CreateOrUpdatePriceBookError** - A union type that encapsulates all possible errors that can occur when creating or updating a price book. * **CreateOrUpdatePriceBookVersionError** - A union type that encapsulates all possible errors that may occur while creating or updating price book versions. * The queries **priceBookVersion** and **priceBookVersions** have been updated with new arguments and return fields. * The object PriceBookVersion has been updated with two new fields **versionedBy** and **versionedDate**. ### Schema Changes on March 13, 2024[​](#schema-changes-on-march-13-2024 "Direct link to Schema Changes on March 13, 2024") * The input objects **CreateTenantWebhookConfigurationInput**, **UpdateWebhookConfigurationInput**, and **CreateAccountWebhookConfigurationInput** have been updated with a new boolean field **active**. * The query **webhookConfigurations** has been updated with a new argument **filter**. * A new input object **WebhookConfigurationFilter** has been added to filter webhook configurations. * The enum WebhookStatus has been updated with two new fields **FAILED\_DELETED\_CONFIGURATION** and **FAILED\_INACTIVE\_CONFIGURATION**. ### Schema Changes on November 24, 2023[​](#schema-changes-on-november-24-2023 "Direct link to Schema Changes on November 24, 2023") The Inventory Sync GraphQL API was promoted from Preview to Early Availability status. ### Schema Changes on November 10, 2023[​](#schema-changes-on-november-10-2023 "Direct link to Schema Changes on November 10, 2023") New Checkout GraphQL APIs were released to support end-to-end self-serve checkout. These APIs enable customers to create a truly headless checkout experience. ### Schema Changes on October 13, 2023[​](#schema-changes-on-october-13-2023 "Direct link to Schema Changes on October 13, 2023") The following changes were made to Product GraphQL APIs: * New mutation (triggerProductPublicationProcess) - initiates the product publication process for one or multiple products and returns the productPublicationProcesses object, which includes the status, trigger date, and errors if the process fails. * New mutation (productPublicationProcess) - allows users to track the publication process of a product by process ID. ### Schema Changes on September 25, 2023[​](#schema-changes-on-september-25-2023 "Direct link to Schema Changes on September 25, 2023") The following changes were made to the schema: * Updated the ProductImage object to support product profile images. * Updated pricing plan APIs; * New error message for invalid grace period units. * New field modifiedBy added to the updatePriceBookCondition mutation- email ID of the user modifying the pricing. * New field removedBy added to the removeConditionProperties mutation - email ID of the user removing any properties. ### Schema Changes on August 11, 2023[​](#schema-changes-on-august-11-2023 "Direct link to Schema Changes on August 11, 2023") The following new Product GraphQL APIs were introduced in the Early Availability status: * Create the product shell * Create editions * Create pricing plans ### Schema changes on July 24, 2023[​](#schema-changes-on-july-24-2023 "Direct link to Schema changes on July 24, 2023") New enums PricingFeeType and PricingVersionType were added for pricing plan APIs. ### Schema changes on June 1, 2023[​](#schema-changes-on-june-1-2023 "Direct link to Schema changes on June 1, 2023") The following changes were made: * New webhook objects were added. * New error types were added to the product API schema. * New union UpdateEditionPricingError and following error types were added pricing plan APIs: * PricingPlanTerminationFeeValueError * DuplicateUnitForIncludedItemsError * InvalidUnitsForIncludedItemsError ### Schema Changes on May 30, 2023[​](#schema-changes-on-may-30-2023 "Direct link to Schema Changes on May 30, 2023") A new field *PRODUCT\_CUSTOM\_ATTRIBUTE* was added to the *DownloadEntityType* enum. ### Schema Changes on April 6, 2023[​](#schema-changes-on-april-6-2023 "Direct link to Schema Changes on April 6, 2023") The product integration GraphQL APIs were moved to the Early Availability (EA) phase from the preview. ### Schema changes on March 1, 2023[​](#schema-changes-on-march-1-2023 "Direct link to Schema changes on March 1, 2023") The following changes were made: * New union *UpdateProductEditionErrors* and new object *ProductEditionFeature* were added to the product API schema. ### Schema Changes on February 27, 2023[​](#schema-changes-on-february-27-2023 "Direct link to Schema Changes on February 27, 2023") The deprecated fields state and tag were removed from the Product Information Management (PIM) GraphQL APIs. ### Schema Changes on February 15, 2023[​](#schema-changes-on-february-15-2023 "Direct link to Schema Changes on February 15, 2023") The following changes were made to the schema: * New Serialized Fulfillment GraphQL APIs were added. With these changes, GraphQL APIs support a Serialized Fulfillment system that can track individually identified items within a shipment of physical products. ### Schema changes on January 27, 2023[​](#schema-changes-on-january-27-2023 "Direct link to Schema changes on January 27, 2023") The following changes were made: * Several improvements were made for the pricing plan APIs. * New fields and options were added to the accounts query and object. With these additions, the accounts query supports new filters to further refine results. * Additionally, the AccountAccessType enum supports new values: NON\_CHANNEL\_ADMIN and NON\_VENDOR. * The accounts orderBy field allows for DATE and NAME. * New mutations were added that allow a Marketplace Manager or Reseller Manager to assign an account to a Reseller as a client, or to remove such an assignment. * New queries were added to allow searching for account memberships involving Resellers. ### Schema changes on January 13, 2023[​](#schema-changes-on-january-13-2023 "Direct link to Schema changes on January 13, 2023") The following changes were made: * New fields (idpID and username) were added to the updateUser mutation in Preview. * New fields that capture contact details were added to the User and Account objects, also in the Preview status. Additionally, the schema for the following areas were also updated: * Account Association * File Uploader * Inventory * Price Book * Products ### Schema changes on December 2, 2022[​](#schema-changes-on-december-2-2022 "Direct link to Schema changes on December 2, 2022") The following updates were made: * Account Association * Notifications * Price Book * Products * Product Integrations ### Schema changes on September 29, 2022[​](#schema-changes-on-september-29-2022 "Direct link to Schema changes on September 29, 2022") The following changes were made: * Updated pricing plan APIs to support context to fetch pricing plan details, define developer and markup prices for flat fee, and update pricing details. * New fields were added to the userActivity object and query. ### Schema changes on August 24, 2022[​](#schema-changes-on-august-24-2022 "Direct link to Schema changes on August 24, 2022") The following updates were made: * Several authorizations in the Price Book API were updated to include ROLE\_PARTNER. ### Schema changes on August 17, 2022[​](#schema-changes-on-august-17-2022 "Direct link to Schema changes on August 17, 2022") The following updates were made: * The ProductEdition object now includes a name field when it is returned in a query. * The createProduct mutation accepts additional input fields (name, description, shortDescription). * New queries and mutations support Inventory records for physical products. * New queries and mutations allow users to view and modify notification templates. ### Schema changes on June 30, 2022[​](#schema-changes-on-june-30-2022 "Direct link to Schema changes on June 30, 2022") The following updates were made: * New mutations and queries were added to support custom prices. * Several elements of the existing Price Book API were updated. * The name attribute of the Product object changed type. ### Schema changes on May 18, 2022[​](#schema-changes-on-may-18-2022 "Direct link to Schema changes on May 18, 2022") The following updates were made: * The productId attribute was added as a required attribute for the updateProductEdition mutation. * A new Shared integration configurations topic was added under the Product management guide. ### Schema changes on April 29, 2022[​](#schema-changes-on-april-29-2022 "Direct link to Schema changes on April 29, 2022") The following new features were added: * New mutations for variant options, variant option values and variant creation. * A new query for the marketplace product. ### Schema changes on April 22, 2022[​](#schema-changes-on-april-22-2022 "Direct link to Schema changes on April 22, 2022") The following updates were made: * Two items within the Product Associations API were renamed. * A new query allows users to retrieve currency exchange rates. ### Schema changes on April 8, 2022[​](#schema-changes-on-april-8-2022 "Direct link to Schema changes on April 8, 2022") The following updates were made: * New standard attributes were added to the Account and User objects. * Account and User objects can now include custom attributes. * The mutations and queries for Account and User objects include the new attributes in the payload. * A new mutation allows users to update an Insights dataset. * Insights datasets include a new revision attribute, which stores a new type of object. ### Schema changes on March 30, 2022[​](#schema-changes-on-march-30-2022 "Direct link to Schema changes on March 30, 2022") The following update was made: * The queries and mutations related to pricing plans were updated to allow null values in certain fields. ### Schema changes on March 10, 2022[​](#schema-changes-on-march-10-2022 "Direct link to Schema changes on March 10, 2022") The following new features were added: * A new mutation for deleting accounts was added. * New fields in user definitions were made available for update using an existing mutation. ### Schema changes on January 26, 2022[​](#schema-changes-on-january-26-2022 "Direct link to Schema changes on January 26, 2022") The following updates were made: * Some price book items were promoted from Preview to Early Availability status for all customers on the AWS-US and AWS-EU clusters. * The queries and mutations related to price book conditions were updated to include segment information. ### Schema changes on January 19, 2022[​](#schema-changes-on-january-19-2022 "Direct link to Schema changes on January 19, 2022") The following updates were made: * Existing User, Account, and Account Membership mutations were made available in Preview status for all customers. * Existing User, Account, and Account Membership queries were promoted to Generally Available (GA) status for all customers. The GraphQL Explorer and Schema Introspection tools were similarly promoted to GA for all customers. * Marketplace Managers were given access to a new *Enable GraphQL Mutations* setting to manage whether users can execute GraphQL mutations that change marketplace data in the AppDirect GraphQL Explorer. New Account Membership mutations were added in Preview status for all customers. The following tasks are supported: * Create a new Account Membership that links a User with an existing Account, with or without an invitation being sent to the user's email address. * Delete an existing Account Membership. * Update roles assigned to Users within Account Memberships ### Schema changes on January 5, 2022[​](#schema-changes-on-january-5-2022 "Direct link to Schema changes on January 5, 2022") The following updates were made: * Selected Objects, Input Objects, and Enums related to Product APIs were renamed to conform to standards. * The API was updated to inherit the vendorId parameter from the client making an API call, rendering this parameter optional. * The authorization rules for Product APIs were added to the reference documentation. ### Schema changes on December 15, 2021[​](#schema-changes-on-december-15-2021 "Direct link to Schema changes on December 15, 2021") Selected price book schema mutations and queries (added June 17, 2021) were promoted from Preview to Early Availability status. The updated items support the following tasks: * Retrieve a specific price book by ID, pricing plan ID, or by name. * Retrieve a specific price book condition. * Retrieve a specific price book entry. * Create a new price book, price book condition, or price book entry * Update an existing price book A query was added in Early Availability (EA) status for AWS-US and AWS-EU customers: * Retrieve all price books. ### Schema changes on December 8, 2021[​](#schema-changes-on-december-8-2021 "Direct link to Schema changes on December 8, 2021") The user, account, and account membership queries were made available in Early Availability status to customers on the AWS-EU cluster. The GraphQL Explorer and Schema Introspection tools were also made available in Early Availability status to customers on the AWS-EU cluster. Additions were made to the Account object and associated schema items, also in Early Availability status for AWS-US and AWS-EU customers. The following have been added: * The Account object includes a countryCode attribute. * The AccountAccessType enum includes two new possible values: REFERRAL and CUSTOMER. New user, account, and account membership mutations were added in Preview status for customers on both the AWS-US and the AWS-EU clusters. The following tasks are supported: * Create a new Account * Update an existing Account * Update an existing User * Activate or deactivate an existing Account Membership New Subscription mutations and a query were made available in Early Availability status to customers on the AWS-EU cluster. The following tasks are supported: * Terminate a subscription by changing its status to can celled, without triggering vendor notifications. * Create a price change with a price definition on an existing subscription. * Retrieve an upcoming price change operation for an existing subscription by subscription ID. ### Schema changes on November 17, 2021[​](#schema-changes-on-november-17-2021 "Direct link to Schema changes on November 17, 2021") New queries and mutations were added to support the creation of Product Associations between existing product editions. The following tasks are supported: * Create a product association between a specific edition of a product, and editions of other products that it requires. * Remove a specific product association between an edition and other product editions. * Retrieve a list of all product associations that a given product edition has to editions of other products that it requires ### Schema changes on October 27, 2021[​](#schema-changes-on-october-27-2021 "Direct link to Schema changes on October 27, 2021") The GraphQL Explorer and Schema Introspection tools became available in Early Availability status to customers on the AWS-US cluster. * The GraphQL Explorer is a browser-based tool that simplifies the construction of GraphQL queries and mutations. * The GraphQL Schema Introspection tool provides documentation of the GraphQL schema within the GraphQL Explorer. ### Schema changes on October 20, 2021[​](#schema-changes-on-october-20-2021 "Direct link to Schema changes on October 20, 2021") The user queries and account queries from the releases transitioned from Preview status to Early Availability status for customers on the AWS-US cluster. Addition of account membership, Search feed resources, and Insights queries to the EA schema. The following tasks are supported: * Retrieve a specific account membership by user ID and account ID * Retrieve a list of account memberships by account ID * Retrieve a list of account memberships by user ID * Retrieve the current or most recently used account membership by user ID * Retrieve the user definition for the current user * Retrieve Search feed resources for the current user * Create an Insights dataset * Push data to an Insights dataset * Create a metric for an Insights dataset * Retrieve an Insights dataset by ID * Retrieve a metric for an Insights dataset by ID * Retrieve a metric by ID ### Schema changes on September 29, 2021[​](#schema-changes-on-september-29-2021 "Direct link to Schema changes on September 29, 2021") Addition of user queries to the Preview schema. The following tasks are supported: * Retrieve a user by AppDirect ID. * Retrieve a user by external ID. * Retrieve a user by username * Retrieve a list of all users. ### Schema changes on September 1, 2021[​](#schema-changes-on-september-1-2021 "Direct link to Schema changes on September 1, 2021") Addition of account (company) queries to the Preview schema. The following tasks are supported: The terminology was changed. Instead of "company", the term "account" is now used. * Retrieve an account by AppDirect ID. * Retrieve an account by external ID. * Retrieve a list of all accounts. ### Schema changes on June 17, 2021[​](#schema-changes-on-june-17-2021 "Direct link to Schema changes on June 17, 2021") Addition of price book mutations and queries to the Preview schema. The following tasks are supported: * Create, update, and delete price books. * Create, update, and delete price book conditions. * Create, update, and delete price book entries. * Retrieve price books. ### Schema changes on December 20, 2020[​](#schema-changes-on-december-20-2020 "Direct link to Schema changes on December 20, 2020") Initial release of the Preview schema. The following tasks are supported: * Create new products in the staging catalog. * Read products. * Request product publication to the production catalog. --- # GraphQL Explorer and schema documentation Marketplace Managers can enable a [GraphQL Explorer](/user-guides/graphql-dev-tools/graphql-explorer.md) for your marketplace. The GraphQL Explorer is an implementation of GraphiQL, which is embedded in your marketplace and uses your marketplace data. You can use it to build queries and mutations on either the preview or production (Early Availability) endpoints. To access GraphQL Explorer, see [GraphQL Explorer](/user-guides/graphql-dev-tools/graphql-explorer.md). Caution Although you can use either the Preview or Production endpoints in the Explorer, both affect your live marketplace data. Be careful if you are making any changes and if you only want to test the API, consider using a test environment if you have one. In addition, a Documentation Explorer is available in the same interface. The Documentation Explorer uses schema introspection to provide full schema documentation, which you can consult to build your calls or just to learn about the schema itself. The documentation content is the same as what is included in the GraphQL API reference. For information about the AppDirect GraphQL API, see [Developer tools for GraphQL](/user-guides/graphql-dev-tools/.md). --- # GraphQL API policy This section describes the AppDirect GraphQL API lifecycle, the backwards compatibility policy, and contains the API changelog. This policy is based on AppDirect's [product lifecycle phases](https://help.appdirect.com/platform/mngplatform/Prdctlifecyclephase/), but is focused on APIs specifically. ## API lifecycle[​](#apilifecycle "Direct link to API lifecycle") | API status | Duration | API updates | SLA | API support | API docs | | -------------------- | ---------- | -------------------------------------------------------- | --- | ----------- | ------------------------------ | | Preview | 3-6 months | Yes ("breaking changes" possible) | No | Limited | Partial | | Early Availability | 3-6 months | Backward compatible only (no "breaking changes" allowed) | Yes | Full | Complete for target use cases | | General Availability | -- | Backward compatible only (no "breaking changes" allowed) | Yes | Full | Complete | | Deprecated | 6 months1 | Backward compatible only (no "breaking changes" allowed) | Yes | Full | Complete | | Retired | 6 months1 | None | No | None | Available (no further updates) | | Decommissioned | N/A | None | N/A | N/A | None | ### Preview[​](#preview "Direct link to Preview") New features of the AppDirect GraphQL API might be made available as preview product offerings. Preview APIs are available to AppDirect partners who are interested in testing and providing feedback on upcoming functionality. note AppDirect does not guarantee that preview functionality will be promoted to the official AppDirect API. Breaking changes to preview APIs can be introduced throughout the preview program so it is strongly recommended that these APIs not be used in production deployments. Technical support and service-level agreements do not apply to preview APIs. All preview schemas are accessible through the following endpoint: ``` https:///api/graphql/preview ``` See [Preview schemas](#Preview) for more information on how to access and use the AppDirect Preview GraphQL API. ### Early Availability[​](#early-availability "Direct link to Early Availability") APIs in Early Availability (EA) are available in production to a limited number of customers based on fit with one or more specific use cases. SLAs do apply and support is available for participating customers. APIs should perform well for the selected customers and at limited transactional volume for the targeted use cases. AppDirect informs participants of known issues and limitations. Enhancements and bug fixes will be available through the schema on the production endpoint, the same endpoint that will be used when the API is in General Availability. All changes will be fully backwards compatible. See [Backwards compatible changes](#Backward) for examples of possible backwards-compatible changes to the GA AppDirect GraphQL API. The official GA GraphQL schema is accessible through the following endpoint: ``` https:///api/graphql ``` ### General Availability[​](#general-availability "Direct link to General Availability") When new API functionality becomes available through the official GraphQL schema, it is considered generally available (GA). Generally available API functionality is covered under all technical support and service-level agreements for a minimum of two years. While GraphQL API functionality is GA, enhancements and bug fixes will be available through the GA schema on the production endpoint. All changes will be fully backwards compatible. See [Backwards compatible changes](#Backward) for examples of possible backwards-compatible changes to the GA AppDirect GraphQL API. The official GA GraphQL schema is accessible through the following endpoint: ``` https:///api/graphql ``` ### Deprecation and Retirement[​](#deprecation-and-retirement "Direct link to Deprecation and Retirement") As the GA GraphQL schema is enhanced and new functionality is released, AppDirect might deprecate and subsequently retire obsolete or outmoded functionality. When this occurs, the associated fields and operations in the GA GraphQL schema are marked as deprecated and include a retirement date that defines when technical support and service-level agreements no longer apply. Retirement dates correspond to the first production release of each quarter (January, April, July, October) and are set at least two years after the deprecated field was originally introduced. Users of the GraphQL API will be notified at least six months before schema fields and operations are retired. Deprecated and retired functionality will also be recorded in the [Changelog](/user-guides/api-usage/graphql/changelog.md). note GraphQL schema fields and operations that are marked as deprecated but have not yet reached their retirement date will continue to be covered under all technical support and service level agreements until the retirement date is reached. AppDirect strongly encourages developers to migrate to the latest GA functionality before retirement. ### Decommission[​](#decommission "Direct link to Decommission") After API functionality is retired, AppDirect reserves the right to decommission it. When API functionality is decommissioned, the associated schema fields and operations are removed and no longer continue to operate. Users of the GraphQL API will be notified at least six months before an API decommission goes into effect. Decommissioned functionality is also recorded in the GraphQL API [Changelog](/user-guides/api-usage/graphql/changelog.md). Breaking changes associated with decommissioned functionality are introduced with the first production release of each quarter (January, April, July, October). ## Backwards compatibility[​](#backwards-compatibility "Direct link to Backwards compatibility") Both the Preview and EA/GA versions of the AppDirect GraphQL API will be enhanced over their lifecycle. Some changes will be backwards compatible (non-breaking) and some might not be backwards compatible (breaking). The following section illustrates the differences. note See [Changelog](/user-guides/api-usage/graphql/changelog.md) for a full list of upcoming and past breaking changes for the GA GraphQL schema. ### Backwards compatible changes[​](#Backward "Direct link to Backwards compatible changes") The following is a list of possible changes that could be made to a GA API that are considered backwards compatible: * Adding a new query, mutation, or type * Adding a new field * Adding a new value to an enum, which is used as an input argument (for example, a new `orderBy` clause) ### Non-backwards compatible changes[​](#non-backwards-compatible-changes "Direct link to Non-backwards compatible changes") The following is a list of possible changes that could be made to an API that are considered not to be backwards compatible: * Removing or renaming an existing field, enum or enum value * Removing an existing query or mutation * Removing an existing type * Changing a "non-null" field to "null" * Removing a schema directive * Adding a mandatory argument to a field * Changing the type of a field (for example, changing a `String` to an `Int`) ## Preview schemas[​](#Preview "Direct link to Preview schemas") Preview schemas allow AppDirect partners to test and provide feedback on upcoming functionality. All preview schemas are accessible through the following endpoint: ``` https:///api/graphql/preview ``` Because the preview endpoint might host multiple preview schemas at any given time, you might be required to provide a custom media type in the `Accept` header for your requests. The value sent in this header determines which preview schema is used to fulfill your request. --- # Mutations Important This part of the GraphQL API is currently in Early Availability status. For more information, see **[GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md)**. *Mutations* modify and return data. As with queries, you must specify which fields you want to be returned, but you must also use arguments to provide the data that you want to create, update, or delete. There are three essential parts of a mutation: * The mutation name, which identifies the type of action that you want to perform. For example, use the `productCreate` mutation to add a product to your marketplace's staging catalog. * An input object, which includes the various fields and field values that you want to modify. For a new product, typical information consists of the product name, type, and so on. * A payload object, which includes the fields that you want to see in the response. Mutations are requests to modify data in some way, similar to `POST`, `PATCH`, `PUT`, and `DELETE` requests in a REST API. Mutations are formed in this way: ``` mutation{ mutationName( inputObject:{ inputField1 inputField2 inputFieldN } ) { payload{ returnField1 returnField2 returnFieldN } } } ``` ### Example[​](#example "Direct link to Example") The following request creates a product in the staging catalog. It uses the `productCreate` mutation, the `product` input object, and all of the required input fields. It also requests a `product` response payload with the `name`, `id`, and `vendorId` return fields. ``` mutation{ productCreate( product:{ type:WEB_APP, name:"My product", addon:false, referable:false, allowMultiplePurchases:true, usageType:MULTI_USER } ) { product{ name id vendorId } } } ``` The response to this example mutation would look like this: ``` { "data": { "productCreate": { "product": { "name": "My product", "id": "72a3a80e-8b5f-4a88-b2a4-51b8ed07d5b5", "vendorId": "ce0a5582-2601-4080-b969-99f949492982" } } } } ``` --- # Overview Important This part of the GraphQL API is currently in Early Availability status. For more information, see **[GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md)**. GraphQL is an API query language that provides an efficient, fundamentally different way of interacting with data than REST. Client applications build queries (to retrieve data) and mutations (to add, modify, or delete data) that include only the specific fields they want, and the server returns only that data. GraphQL is strongly typed, based on the type definitions in the GraphQL *schema*, which defines all of the possible data that clients can access. For more information about basic GraphQL concepts, see the following topics: * [GraphQL terminology](/user-guides/api-usage/graphql/terminology.md) * [Queries](/user-guides/api-usage/graphql/queries.md) * [Mutations](/user-guides/api-usage/graphql/mutations.md) * [Variables](/user-guides/api-usage/graphql/variables.md) * [GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md) * [Changelog](/user-guides/api-usage/graphql/changelog.md) * [Resource limitations](/user-guides/api-usage/graphql/ressource-limitations.md) For more information about GraphQL in general, see the [GraphQL official documentation](https://graphql.org/learn/). ## GraphQL vs REST[​](#graphqlvs-rest "Direct link to GraphQL vs REST") The AppDirect GraphQL API reflects a fundamental shift in how developers interact with the AppDirect Platform. As an API developer, there are several key differences between GraphQL and REST that you should be aware of: * GraphQL uses a single endpoint for all requests, instead of unique endpoints for each request. See [Endpoints](#Endpoints) below. * All requests use the `POST` method, even if you are simply retrieving data. * Clients can build a single request to retrieve or update multiple data objects, rather than using multiple REST requests. * Client applications can specify the field data they want returned in an API response. REST responses return entire objects and therefore can often contain superfluous data. ## Endpoints[​](#Endpoints "Direct link to Endpoints") Each AppDirect marketplace has its own GraphQL endpoints: one for production and one for preview. The preview endpoint contains any schema elements that are in Preview status, while the production endpoint contains schema elements that are in Early Availability or General Availability status. * Preview endpoint: `https:///api/graphql/preview` * Production endpoint: `https:///api/graphql` For example: ## Preview release[​](#preview-release "Direct link to Preview release") AppDirect is implementing its GraphQL API in stages, starting with the product management API. See the GraphQL API [Changelog](/user-guides/api-usage/graphql/changelog.md) for details about what is available in this preview. ## Limitations[​](#Limitations "Direct link to Limitations") The AppDirect GraphQL API currently has the following limitations: * Most of the API is only available in Preview. See [Endpoints](#Endpoints) above. ## Reference documentation[​](#reference-documentation "Direct link to Reference documentation") The AppDirect GraphQL reference documentation, including interactive examples, is available here: * [GraphQL API reference](/graphql-docs/docs) --- # Queries Important This part of the GraphQL API is currently in Early Availability status. For more information, see **[GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md)**. *Queries* return information in JSON objects. To build a GraphQL query, you identify the data that you want to retrieve. When you build a query, you must identify specific fields at the [scalar](https://graphql.org/learn/schema/#scalar-types) level, which might be nested within other fields. Queries are requests to read data, similar to `GET` requests in a REST API. Queries follow this pattern: ``` query { object1 object2 { sub-field1 sub-field2 } ... objectN } ``` Example A query to list all marketplace products might look like this: ``` query{ products{ nodes{ name id vendorId type } } } ``` In this example, the `name`, `id`, `vendorId`, and `type` fields are all scalars. It would not be possible to only request the `products` object. The response to the query above looks like this: ``` { "data": { "products": { "nodes": [ { "name": "MySampleProduct", "id": "8a61cf55-1f2f-489c-8afb-052a5e2f9f91", "vendorId": "ce0a5582-2601-4080-b969-99f949492982", "type": "WEB_APP" }, { "name": "MyOtherProduct", "id": "8d7200d3-975d-4cc4-9c09-1e8d8a16f066", "vendorId": "ce0a5582-2601-4080-b969-99f949492982", "type": "WEB_APP" }, ... ] } } } ``` --- # Resource limitations Important This part of the GraphQL API is currently in Early Availability status. For more information, see **[GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md)**. Defining and enforcing API usage limits is an important component of maintaining a high-performance and reliable service. GraphQL presents unique challenges to services that aim to apply usage limits. A common approach used with REST is to set a max number of requests that are allowed to be made over a defined period of time (per hour, per day, and so on). GraphQL on the other hand allows queries for multiple resources to be made with a single call, resulting in a server load equivalent to hundreds of REST requests. So a different approach is required. The AppDirect GraphQL API enforces usage limitations by calculating the expected cost of a query and enforcing the cost in two ways: request limits and rate limits. See the following topics for more information on how queries are calculated and enforced. note Resource limitations may change as AppDirect learns more about how developers use the AppDirect GraphQL API. ## Cost calculation[​](#cost-calculation "Direct link to Cost calculation") To calculate the cost of a GraphQL query, AppDirect counts the number of requests required to fulfill a query and the number of nodes returned. ``` Calculated cost = number of requests + total number of nodes returned ``` Here is a simple example to help illustrate this calculation: ``` query { product(id: "1234") { name type } } ``` The above query results in a cost of **1** point because the API only needs to make one request to retrieve product `1234`. Here is a slightly more complex query: ``` query { product(first: 250) { name type } } ``` The query above results in a cost of 251 points because the API needs to make **1** request to retrieve a list of products and returns **250** products. ## Query limit[​](#query-limit "Direct link to Query limit") Request limits define the number of points that are allowed by a single GraphQL request made by a client application. The current limit is 1000 points. ## Rate limits[​](#rate-limits "Direct link to Rate limits") Rate limits define the maximum number of points that are allowed by a client application per minute, using a [leaky bucket algorithm](https://en.wikipedia.org/wiki/Leaky_bucket). Usage of a leaky bucket algorithm allows client applications to make an unlimited number of requests over a large time horizon but protects against excessively large bursts over a short one. The current bucket size is 1000, with a leak rate of 100 points per second. This means that at any given time the cost of queries cannot exceed 1000 points and room is created in the bucket at a rate of 100 points per second. --- # GraphQL terminology Important This part of the GraphQL API is currently in Early Availability status. For more information, see **[GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md)**. GraphQL is a completely different API framework than REST, and uses different terms to describe data and data structures. This section provides a brief introduction. For more details, refer to the [GraphQL documentation](https://graphql.github.io/learn/). ## Schemas[​](#schemas "Direct link to Schemas") Unlike REST, GraphQL has a strong type system that services use to define an API's *schema*, the description of all objects available through an API and the operations that can be performed on those objects. You can explore the schema through [introspection](https://graphql.github.io/learn/introspection/) to see what is available, and build queries and mutations to retrieve or send the information that you need. note Schema introspection is not currently supported in the Preview release of the AppDirect GraphQL API. See [Limitations](/user-guides/api-usage/graphql/overview.md#Limitations) for more information on limitations of the Preview release. ## Queries and mutations[​](#queries-and-mutations "Direct link to Queries and mutations") Queries represent requests for information, while mutations send information to the GraphQL server. In GraphQL, all requests, either query or mutation, are sent with a POST request. You indicate whether you are sending a query or mutation in the request body itself. For more information, see [Queries](/user-guides/api-usage/graphql/queries.md) and [Mutations](/user-guides/api-usage/graphql/mutations.md). ## Fields[​](#fields "Direct link to Fields") A field is the smallest unit of data that you can retrieve, for example a name or ID. With GraphQL, you can query as many fields as required, and only the fields that you require, in a single request, even if those fields are contained within different objects. For more information about fields, refer to the [GraphQL documentation](https://graphql.github.io/learn/queries/#fields). ## Arguments[​](#arguments "Direct link to Arguments") Arguments are field values that you pass through mutations. You can pass arguments to multiple objects in a single request. For more information about arguments, refer to the [GraphQL documentation](https://graphql.github.io/learn/queries/#arguments). ## Connections and nodes[​](#connections-and-nodes "Direct link to Connections and nodes") In GraphQL, connections represent collections of related data and nodes are items within that collection. For example, in the context of the AppDirect platform a list of products could be a connection and a specific product in that list would be a node. Connections and nodes are concepts that fall within GraphQL's larger pagination model. ## Pagination[​](#Pagination "Direct link to Pagination") When a query (or mutation) has the potential to return more than a single result in the response, you may want to organize how those results are returned in order to process them effectively. GraphQL uses *cursor-based pagination* to organize results. When a query may return multiple results, the API includes arguments you can use to specify the pagination. These may include either *first* / *after* for forward pagination, or *last* / *before* for backward pagination: * **first**—A number of results to return after the specified *after* cursor. Must be a positive integer. * **after**—The result to be used as a cursor. If null, the *first* number of results are returned starting at the beginning of the collection. * **last**—A number of results to return before the specified *before* cursor. Must be a positive integer. * **before**—The result to be used as a cursor. If null, the *last* number of results are returned starting at the end of the collection. For more information on GraphQL pagination, see [Pagination](https://graphql.org/learn/pagination/#gatsby-focus-wrapper) on the GraphQL Foundation site. --- # Variables Important This part of the GraphQL API is currently in Early Availability status. For more information, see **[GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md)**. You can use [variables](https://graphql.github.io/learn/queries/#variables) with queries and mutations to make it easier and more efficient to send the same request repeatedly. When you identify a variable in a query or mutation, you provide the variable values separately, which allows you to use the same request body and update the variable values instead of creating new request bodies repeatedly. In GraphQL, variables are identified with the `$variableName` convention. You provide the variable values, typically in JSON format, outside of the request body. Different explorers and API clients have different areas in which you provide the variable values. The following example creates a product, just as described in [Mutations](/user-guides/api-usage/graphql/mutations.md). However, in this case we use a variable (`$myVariable`) to replace the product input object (`ProductCreateInput!`): ### Request body[​](#request-body "Direct link to Request body") ``` mutation($myVariable:ProductCreateInput!){ productCreate(product:$myVariable) { product{ name id vendorId } } } ``` ### Variable values[​](#variable-values "Direct link to Variable values") ``` { "myVariable": { "type": "WEB_APP", "name": "My other product", "addon": false, "usageType": "MULTI_USER", "allowMultiplePurchases": true, "referable": false } } ``` ### Response[​](#response "Direct link to Response") ``` { "data": { "productCreate": { "product": { "name": "My other product", "id": "26db9280-1c3e-4ee7-adbd-90b8655f5800", "vendorId": "ce0a5582-2601-4080-b969-99f949492982" } } } } ``` --- # Use custom attributes with API Most custom attribute functions are done through the user interface (UI). You can, however, create a company with custom attributes through the API. note All other functions for company, user, order, lead, purchase, and subscription custom attributes must be done through the UI. Before you create a company with custom attributes, you first have to create the custom attribute in the UI. See [Create custom attributes](https://help.appdirect.com/platform/Default.htm#MarketplaceManager/MM-Setgscustui-create-attribs.html). Use the details from the custom attributes that you created in the UI to create a company with a custom attribute. The following table maps the fields in the UI with the custom attributes parameters. | UI field | Request Parameter | | ---------------------- | ------------------------------ | | Key | "name" | | Label | "label" | | Hint | "hint" | | Input Type, Text | "attributeType": "TEXT" | | Input Type, Checkboxes | "attributeType": "MULTISELECT" | | Options | "valueKeys" | For information on how to create a company through the API, see [Create a new company](/rest.md#tag/Companies/operation/resource_Company_readAllCompanies_GET). ## Create a company with custom attributes[​](#create-a-company-with-custom-attributes "Direct link to Create a company with custom attributes") The following example request and response demonstrate how to create a company with custom attributes. ### Request[​](#request "Direct link to Request") ``` { "name": "Webprix", "defaultRole": "USER", "firstUser": { "activated": false, "email": "roberta.simpson@webprix.com", "firstName": "Roberta", "lastName": "Simpson", "roles": [ "ROLE_USER" ], "userName": "roberta.simpson" }, "countryCode": "US", "customAttributes": [ { "name": "headquarters", "value": "New York" }, { "name": "Locations", "attributeType": "MULTISELECT", "label": "Company locations", "hint": "Storefront locations", "valueKeys": [ "Montreal", "New York", "San Diego" ] } ] } ``` ### Response[​](#response "Direct link to Response") ``` { "uuid": "b55adcb7-9dc3-4e05-ab57-f4f14821448e", "name": "Webprix", "enabled": true, "address": null, "companySize": null, "customAttributes": [ { "name": "headquarters", "value": "New York" }, { "name": "Locations", "attributeType": "MULTISELECT", "label": "Company locations", "hint": "Storefront locations", "valueKeys": [ "New York", "San Diego", "Montreal" ] } ], "creationDate": 1565705679871, "industry": null, "salesAgent": null, "emailAddress": null, "website": null, "picture": null, "vendor": false, "reseller": false, "channelAdmin": false, "externalId": null, "phoneNumber": null, "defaultRole": "USER", "countryCode": "US", "status": "INACTIVE", "thirtyDaysPurchaseLimitExempt": false, "thirtyDaysPurchaseLimitOverrideAmt": null, "dailyPurchaseLimitExempt": false, "dailyPurchaseLimitOverrideAmt": null, "importAppsEnabled": false, "onlyAdminsCanBuy": false, "firstUser": { "email": "roberta.simpson@webprix.com", "firstName": "Roberta", "lastName": "Simpson", "roles": [ "USER" ] } ``` --- # Rate limits Rate limits define the maximum number of requests that are allowed by a client application per minute, using a [leaky bucket algorithm](https://en.wikipedia.org/wiki/Leaky_bucket). Usage of a leaky bucket algorithm allows client applications to make an unlimited number of requests over a large time horizon but prevents excessively large bursts over a short one. The current bucket size is 20 requests, with a leak rate of 4 requests per second. The bucket size and leak rate can vary by endpoint and are documented in the reference documentation. --- # REST API versioning policy ## API organization[​](#apiorganization "Direct link to API organization") AppDirect REST APIs are organized around core services that are each versioned independently and represent a base set of capabilities of the AppDirect platform. The version number of an API is referenced in the URL path for that API. The separate concerns are versioned individually. The version status is indicated in the reference documentation and will be communicated as described in this document. The following is a list of current AppDirect APIs: | API | Description | Base path | | --------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------- | | Marketplace API | List products, editions, bundles, and more for a storefront experience. | /api/marketplace/v1 | | Subscription Management and Billing API | View and update purchases, subscriptions, invoices, payments, and other billing data. | /api/billing/v1 | | Account API | Manage companies, users, groups, authentication and other identity data. | /api/account/v1
/api/account/v2 | | Reports API | List and download reports generated in the platform. | /api/reporting/v1
/api/reporting/v2 | | Channel Administration API | Configure and view exchange rates, discounts, webhooks, notifications and other core parts of the platform. | /api/channel/v1 | | Customer Notifications | Manage email and SMS templates. | /api/notification/v1 | | Leads API | Manage leads. | /api/prm/v1
/api/lead/v2 | | Payment Methods API | Manage payment methods. | /api/appMarket/v2 | | Assisted Sales API | Manage opportunities. | /api/assistedSales/v1 | | Reseller API | Perform reseller operations. | /api/appReseller/v1
/api/reseller/v1 | | Product Integration API | Subscription sync and metered usage APIs. | /api/integration/v1
/api/sync/v1 | ## Versioning policy[​](#versioning-policy "Direct link to Versioning policy") This section describes the stages that different versions of AppDirect APIs pass through over the course of their lifecycles. AppDirect will communicate status changes beforehand, as indicated in the following table, and the API reference documentation will indicate any API that has a status other than General Availability (GA). ### Summary[​](#summary "Direct link to Summary") | API status | Duration | API endpoint availability | API updates | SLA | API support | API docs | | -------------------- | ---------- | ------------------------- | -------------------------------------------------------- | ------- | ----------- | ------------------------------ | | Preview | 3-6 months | Public | Yes ("breaking changes" possible) | No | Limited | Partial | | Early Availability | 3-6 months | Public | Backward compatible only (no "breaking changes" allowed) | Limited | Full | Complete for target use cases | | General Availability | 2+ years | Public | Backward compatible only (no "breaking changes" allowed) | Yes | Full | Complete | | Deprecated | 6 months1 | Public | Backward compatible only (no "breaking changes" allowed) | Yes | Full | Complete | | Retired | 6 months1 | Public (no enhancements) | None | No | None | Available (no further updates) | | Decommissioned | N/A | Unavailable | None | N/A | N/A | None | ### Preview[​](#preview "Direct link to Preview") AppDirect APIs might be made available as a preview offering to selected customers. Preview APIs are available to AppDirect partners who are interested in testing and providing feedback on upcoming functionality. AppDirect does not guarantee that Preview APIs will be promoted to General Availability as defined below. Breaking changes to beta APIs can be introduced throughout the beta program so it is recommended that beta APIs not be used in production deployments. Support and service-level agreements (SLAs) do not apply to beta APIs. ### Early Availability[​](#early-availability "Direct link to Early Availability") APIs in Early Availability are available in production to a limited number of customers based on fit with one or more specific use cases. SLAs do apply and support is available for participating customers. APIs should perform well for the selected customers and at limited transactional volume for the targeted use cases. AppDirect informs participants of known issues and limitations. ### General Availability[​](#general-availability "Direct link to General Availability") APIs in General Availability are fully supported and apply to all existing service-level agreements. While an API is generally available, additional functionality, data, and bug fixes are made available through the API. All changes are fully backwards compatible. See *Backwards Compatible Changes* below for a summary of backwards compatible changes that might be made to GA APIs. All GA versions of an AppDirect API will be supported for a minimum of two years. ### Deprecation[​](#deprecation "Direct link to Deprecation") When a new version of an API is released, AppDirect will deprecate any previous versions of that API that are two or more years old. API users will be notified at least six months before the API deprecation goes into effect. Deprecated APIs continue to operate after the deprecation date but are no longer supported and SLAs no longer apply. AppDirect strongly encourages developers to migrate to the latest API version prior to deprecation. ### Decommission[​](#decommission "Direct link to Decommission") After an API is deprecated, AppDirect reserves the right to decommission the API. When an API is decommissioned, its endpoints will no longer be publicly available. API users will be notified at least six months before an API is decommissioned. ## Backwards compatibility[​](#backwards-compatibility "Direct link to Backwards compatibility") All Beta and GA versions of AppDirect APIs will be enhanced over their lifecycles. Some changes will be backwards compatible (non-breaking) and some might not be backwards compatible (breaking). This section describes the differences. ### Backwards compatible changes[​](#backwards-compatible-changes "Direct link to Backwards compatible changes") The following is an exemplary list of changes that might be made to a GA API that are considered to be backwards compatible: * Adding a new optional data field to an existing request message * Adding a new field to an existing response message * Adding a new method to an existing API resource * Adding a new API resource ### Non-backwards compatible changes[​](#non-backwards-compatible-changes "Direct link to Non-backwards compatible changes") The following is an exemplary list of changes that might be made to a Beta API that are considered to be non-backwards compatible: * Adding a new required data field to an existing request message * Removing an existing method for an API resource * Removing an existing API resource --- # AppDirect status page service definitions The following table describes the outage status definitions for various services. To see the status of the services in EU region see - [AppDirect Europe Status](https://eu.status.appdirect.com/)
To see the status of the services in US region see - [AppDirect Americas Status](https://us.status.appdirect.com/) | Service | | Service Outage Definition | | --------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Authentication and Accounts | | Outage in this service prevents users from logging into their Marketplaces. | | Commerce | Product Management | Outage in this service impacts various subscription events, ISV communication, user assignment/unassignment, publishing products, and updating product integrations. | | | Checkout | Outage in this service prevents users from completing the checkout/purchase flow. | | | Reseller & Advisor Experience | Outage in this service impacts either one of the following two flows that are heavily used by Resellers/Advisors:- Opportunities/Quotes flow
- Advisor/Reseller dashboard | | | Billing | Outage in this service impacts the following features: - Payments (commissions payout)
- Payment connectors
- Invoices
- Tax
- Subscriptions Monthly billing runs may be affected, directly impacting purchase orders creation. Users may not be able to finalize a purchase or a Quote, and may not see correct pricing and related calculations while purchasing or renewing products/services. This service validates every SaaS purchase for all user types. | | | Storefront | Outage in this service impacts the core architecture of the e-commerce website prior to the checkout stage such as: - Managing theme template and assets
- Product APIs
- Providing marketplace data
- Marketplace products
- Visual editor
- Page headersThis service enables users to create and manage their own website within the AppDirect Platform. | | Platform | | Outage in this service impacts the entire platform, users will not be able to access or interact with the Marketplace. | | Vendor Integrations | Microsoft | Outage in this service prevents users from being able to perform transactions on Microsoft products | | | Google | Outage in this service causes Google subscription orders to fail, and license assignment (or unassignment) will not work. | | | Infrastructure as a Service | Outage in this service leads to disruptions in selling, managing, and billing IaaS products on our platform. | | | Other Vendors | Outage in this service causes the following subscription orders to fail: - Google
- Adobe
- Cisco
- Zoom
- Dropbox | | Search, Feed, and Insights | | Outage in this service leads to users not being able to receive feeds for events on the Marketplace (like invoice paid, orders created, and such) or view dashboards. | | Advisor Services | | Outage in this service results in Advisors not being able to process tickets, quotes, or orders for the business. | --- # Billing and subscription ## Overview[​](#overview "Direct link to Overview") Use the Billing and subscription API to manage subscriptions, payment method information, and discounts. You can use our libraries to manage off-platform payments. ## Getting Started[​](#getting-started "Direct link to Getting Started") 1. Select the appropriate grant types and scopes for your use case. See [Grant types](/user-guides/api-usage/api-auth/grant-type/.md) and [Scopes](/user-guides/api-usage/api-auth/scopes.md). 2. Create an API client to use with the AppDirect API. See [API clients](https://help.appdirect.com/platform/Default.htm#MarketplaceManager/mm-set-integ-api.htm). 3. Authenticate your client. See [API Authentication](/user-guides/api-usage/api-auth/.md). 4. Test your API calls with your access token using a third-party API IDE, for example Postman. ## Working with Billing and Subscription APIs[​](#working-with-billing-and-subscription-apis "Direct link to Working with Billing and Subscription APIs") * Manage subscriptions for example create, change, and cancel. * Manage payment method information, and discounts. ## API Reference[​](#api-reference "Direct link to API Reference") * [Subscriptions REST API](/rest.md#tag/Subscription) * [Discounts REST API](/rest.md#tag/Discount) * [Payment methods REST API](/rest.md#tag/Payment-Methods) --- # Billing and subscription You can use the AppDirect API to manage subscriptions, payment method information, and discounts. A JavaScript library is also available if you need to manage payments off-platform or collect payment information yourself. * [Metered Usage](/user-guides/billing-and-subscription/rest-api/metered-usage-v1/.md) * [Create payment instruments](/user-guides/billing-and-subscription/rest-api/create-payment-instruments/.md) * [Create subscriptions](/user-guides/billing-and-subscription/rest-api/create-subscriptions/.md) * [Change subscriptions](/user-guides/billing-and-subscription/rest-api/change-subscriptions/.md) * [Cancel subscriptions](/user-guides/billing-and-subscription/rest-api/cancel-subscriptions/.md) * [Assign users](/user-guides/billing-and-subscription/rest-api/assign-users/.md) * [Manage discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/.md) * [Payment.js library](/user-guides/billing-and-subscription/rest-api/payment-js-library/.md) --- # Assign users A subscription represents a customer's entitlement to a product and determines their access to that product, as well as their payment schedule. Subscriptions are created when the customer places an order. A company can own one subscription to any given product. After you create a subscription, you can assign users to and unassign users from the subscription, depending on how the purchased edition is configured.  Company Administrators can assign or unassign users to their subscription through the user interface. See [Assign applications to users](https://help.appdirect.com/platform/Default.htm#AppManager/AM-AssApps-AssApps2Users.html). After you create a company, users, and have created a subscription, you can assign (add) or unassign (remove) users to that subscription through the API. AppDirect supports an OAuth-authenticated REST interface that allows API users to read, create, edit, and delete marketplace records that describe a user's account and the user's access to existing subscriptions. Important The subscription assignment API requires either the password or authorization code OAuth 2.0 grant type to successfully authenticate. For more information on OAuth 2.0 and grant types, see [API authentication](/user-guides/api-usage/api-auth/.md). --- # Additional user assignment and unassignment examples ## Assign a user with parameters[​](#assign-a-user-with-parameters "Direct link to Assign a user with parameters") Below is an example of assigning a user to subscription passing parameters. Request ``` { "accessRights": "EDIT_AND_VIEW", "appAdmin": "false", "billRate": "0", "department": "IT", "idNumber": "3345", "password": "password", "timezone": "America/New_York", "title": "Engineer", "userName": "testuser@example.com", "zipCode": "95926" } ``` Response ``` Status Code: 201 Created ``` ## Assign a user who has already been assigned[​](#assign-a-user-who-has-already-been-assigned "Direct link to Assign a user who has already been assigned") Below is an example of assigning a user to subscription where the user has already been assigned to the subscription. **Response** ``` [ { "code": "Bad Request", "message": "Subscription has been already assigned to the user" } ] ``` ## Assign a user to a subscription that does not exist[​](#assign-a-user-to-a-subscription-that-does-not-exist "Direct link to Assign a user to a subscription that does not exist") Below is an example of assigning a user to a subscription that does not exist in the system or is not part of this marketplace. **Response** ``` [ { "code": "Not Found", "message": "CompanyEntitlement with UUID=07db4f71-8e24-48ba-acd6-49210aee0692 not found." } ] ``` Unassigning a user from a subscription does not require parameters beyond the companyId, userId, and subscriptionId, nor are attributes included. The examples included below show possible error cases. ## Unassign a user who has not been assigned[​](#unassign-a-user-who-has-not-been-assigned "Direct link to Unassign a user who has not been assigned") Below is an example of unassigning a user from a subscription where the user has either already been unassigned from the subscription or who was not ever assigned to the subscription. **Response** ``` [ { "code": "Not Found", "message": "No user entitement found." } ] ``` ## Unassign a user from a subscription that does not exist[​](#unassign-a-user-from-a-subscription-that-does-not-exist "Direct link to Unassign a user from a subscription that does not exist") Below is an example of unassigning a user from a subscription that does not exist in the system or is not part of this channel. **Response** ``` [ { "code": "Not Found", "message": "CompanyEntitlement with UUID=07db2f71-8e24-48ba-acd6-49210aee0692 not found." } ] ``` --- # Assign and unassign subscriptions After you create a valid subscription, you can assign and unassign users to and from that subscription. To do so, you will need the unique subscription identifier returned in the create subscription response, and the unique user identifier for the user to assign or unassign returned in the create user response. You can also find the identifiers with the respective list API methods. ## Create application assignments[​](#create-application-assignments "Direct link to Create application assignments") Assign (add) the specified user to the specified subscription. See the API reference documentation for full details. * [Create application assignment](/rest.md#tag/SubscriptionAssignments/operation/resource_Subscription_createSubscriptionAssignment_POST) Below is an example of a successful user assignment request and response. Additional examples are provided in the example section of this document.  All of the examples assume that you successfully created a subscription as described in [Create subscriptions](/user-guides/billing-and-subscription/rest-api/create-subscriptions/.md). **Request** ``` POST /api/account/v2/subscriptions/07db1f71-8e24-48ba-acd6-49210aee0692/assignments/f3acf89c-0803-47e8-8e12-30c4593c2904?access_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjY5NTY5ZjY4LTRlMzktNDE5NC05MGY2LTQ1ZDYzOTMyOTlmNyJ9.eyJzdWIiOiJhYXJvbi5iYXNkZW8rMjBAYXBwZGlyZWN0LmNvbSIsImF1ZCI6WyJvcGVuaWQiLCJkZXZlbG9wZXIiLCJhY2NvdW50IiwiYmlsbGluZyIsImF0dCIsIm8zNjUiLCJtYXJrZXRwbGFjZSIsImNoYW5uZWwiLCJob3N0ZWRjaGVja291dCIsInNlc3Npb24iLCJzdXBlcnVzZXIiLCJpbnRlZ3JhdGlvbiIsInJlcG9ydGluZyIsIm5vdGlmaWNhdGlvbiIsIlBSTSIsIm1hcmtldHBsYWNldjMiLCJhcHBSZXNlbGxlciIsInVuaXZlcnNhbG5hdmlnYXRvciIsImFwcE1hcmtldCIsInRlbHN0cmFWMyIsInByb2R1Y3RTZXR0aW5nIiwicHJvZHVjdFNldHRpbmdBY3RpdmVDb21wb25lbnQiLCJjaGVja291dFYzIiwibGVhZHN2MiJdLCJleHAiOjE1MzgxODgwNjksImp0aSI6IjgxM2ZkMDQ2LTA1Y2EtNDFmZC1hZGE3LTE4ODQ5OWVhMTU5YyIsImNsaWVudF9pZCI6IjVQMG9LNUdWZGsiLCJzY29wZSI6WyJST0xFX0NIQU5ORUxfU1VQUE9SVCIsIlJPTEVfREVWRUxPUEVSIiwib3BlbmlkIiwicHJvZmlsZSIsIlJPTEVfQ0hBTk5FTF9BRE1JTiIsIlJPTEVfQklMTElOR19BRE1JTiIsIlJPTEVfQ09SUE9SQVRFX0FETUlOIiwiUk9MRV9VU0VSIiwiUk9MRV9DSEFOTkVMX1BST0RVQ1RfU1VQUE9SVCIsImNvbXBhbnkiLCJST0xFX1NBTEVTX1NVUFBPUlQiLCJST0xFX1JFU0VMTEVSX01BTkFHRVIiLCJlbWFpbCIsIlJPTEVfU1lTX0FETUlOIl19.aSVP-2jgd5sx6QjHsnDTGM72o9h_tvHZasn7LDD13ZoK3IwlhBNQQIUxHsfe0yJXTsZ7I26iPc5tOHxjDyjWs49Pa2yv-QxGLiuEEd5wElZdfb6oXKJxxAL_UMIBQfqaRIj9jp3zfNjZ4rHnqPKO-AYsWAqEMW49ZXBBGbHdA_INgoeUqXKzWDLXCakUXQI7EZ147RZjJBnguQo8t7bT0fp1EpS6kD6TU4v3pZVjWlzDStMBWY9ZpB7Tz-6yGbeBSOZvrVTpqrqEZj92C47AFAMvewH_5F3O-IT2S-9dW8J40B_ANE_Z7D544bZPpHeclKACDsaqYyhyRMvCA3ODJQ HTTP/1.1 Host: www.example.com Accept: application/json Content-Type: application/json Cache-Control: no-cache ``` **Response** ``` Status: 201 Created ``` ## Delete application assignments[​](#delete-application-assignments "Direct link to Delete application assignments") Unassign (remove) the specified user from the subscription. See the API reference documentation for full details. * [Delete application assignment](/rest.md#tag/SubscriptionAssignments/operation/resource_Subscription_deleteSubscriptionAssignment_DELETE) URL endpoint: `/api/account/v1/companies/{companyId}/users/{userId}/unassign/{subscriptionId}` Below is an example of a successful user unassignment request and response. Additional examples are provided in the example section of this document.  All of the examples presented assume you successfully created a subscription as described in [Create subscriptions](/user-guides/billing-and-subscription/rest-api/create-subscriptions/.md). **Request** ``` DELETE /api/account/v2/subscriptions/07db1f71-8e24-48ba-acd6-49210aee0692/assignments/4ef60b96-6180-4d82-8080-6f59ff51e2d3?access_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImYyMmNlOGFhLTc4MzktNDk1Yy04ZTU5LTg5ZTIxYjcyZmJlZiJ9.eyJzdWIiOiJhYXJvbi5iYXNkZW8rMjBAYXBwZGlyZWN0LmNvbSIsImF1ZCI6WyJvcGVuaWQiLCJkZXZlbG9wZXIiLCJhY2NvdW50IiwiYmlsbGluZyIsImF0dCIsIm8zNjUiLCJtYXJrZXRwbGFjZSIsImNoYW5uZWwiLCJob3N0ZWRjaGVja291dCIsInNlc3Npb24iLCJzdXBlcnVzZXIiLCJpbnRlZ3JhdGlvbiIsInJlcG9ydGluZyIsIm5vdGlmaWNhdGlvbiIsIlBSTSIsIm1hcmtldHBsYWNldjMiLCJhcHBSZXNlbGxlciIsInVuaXZlcnNhbG5hdmlnYXRvciIsImFwcE1hcmtldCIsInRlbHN0cmFWMyIsInByb2R1Y3RTZXR0aW5nIiwicHJvZHVjdFNldHRpbmdBY3RpdmVDb21wb25lbnQiLCJjaGVja291dFYzIiwibGVhZHN2MiJdLCJleHAiOjE1MzgyMDYwMzMsImp0aSI6IjY5MTIwZTI1LTc4MTYtNDVjZi1hMjFjLTI3MjI2OTRmZDAwZSIsImNsaWVudF9pZCI6IjVQMG9LNUdWZGsiLCJzY29wZSI6WyJST0xFX0NIQU5ORUxfU1VQUE9SVCIsIlJPTEVfREVWRUxPUEVSIiwib3BlbmlkIiwicHJvZmlsZSIsIlJPTEVfQ0hBTk5FTF9BRE1JTiIsIlJPTEVfQklMTElOR19BRE1JTiIsIlJPTEVfQ09SUE9SQVRFX0FETUlOIiwiUk9MRV9VU0VSIiwiUk9MRV9DSEFOTkVMX1BST0RVQ1RfU1VQUE9SVCIsImNvbXBhbnkiLCJST0xFX1NBTEVTX1NVUFBPUlQiLCJST0xFX1JFU0VMTEVSX01BTkFHRVIiLCJlbWFpbCIsIlJPTEVfU1lTX0FETUlOIl19.Q-ocY4XARP12aufTkvK_8yvRBvVlslgKeeNVmdZ0XEaN57-jqJatU2A0w7qtPRr7kfElFA4JVMO-5ip-Cdyzcox3FVrQ3lafKcytIBCbCU2Ul5oNHo3fsJNqIRMEeNzrX3IIregmL9pjG3D5Rid1yeThg2W1mIg03FT_BMsOiDlQyllwqACZeDjCvknETHub5ZHiq_9eKvrKgiMFVylO4mURMb01iFDddIs2_9NxN1x8jFavH4oyF4Ew6HGt8COA0AMRlpUass1NQVjpTd1RXBD8LmRiljfbstCajLaxRcSCr98FF0c0OH39Ae4-j_cs90ZdVAF6wHAJ4BQCzOtehg HTTP/1.1 Host: www.example.com Cache-Control: no-cache ``` **Response** ``` Status Code: 204 No Content ``` --- # Other subscription assignment-related API methods The AppDirect Account API supports several additional methods for managing your subscription assignments. See the API reference documentation for more information. * [List application assignments for subscription](/rest.md#tag/SubscriptionAssignments/operation/resource_Subscription_readSubscriptionAssignments_GET) * [Read application assignment for user and subscription](/rest.md##tag/SubscriptionAssignments/operation/resource_Subscription_readSubscriptionAssignment_GET) * [Read application assignment count](/rest.md#tag/SubscriptionAssignments/operation/resource_Subscription_readSubscriptionAssignmentCount_HEAD) --- # Use cases After a company with multiple users and a subscription are created, you can assign (add) users to the subscription through the API. Doing so is the equivalent of assigning users to a purchased application through the UI. Some editions might have limitations on the number of users that can be assigned to the subscription. You can also unassign (remove) users from the subscription through the API. Doing so is the equivalent of unassigning users from a purchased application through the UI. --- # Cancel subscriptions A subscription represents a customer's entitlement to a product and determines their access to that product, as well as their payment schedule. Subscriptions are created when the customer places an order. Once you have a created a subscription, you may cancel (delete) your subscription A user may cancel their subscription through the UI by clicking the "Cancel Subscription" button on the Manage->Account->Applications page for the given application. ![](/assets/images/bag-cancelsubscription-b5416eef9d299063e60b4605589e72d5.png) Once you have a created company, a user, a payment instrument for that user, and a subscription on behalf of that user, you may cancel that subscription through the API. When you cancel existing subscriptions, they are still subject to any contract termination terms. You cannot perform any subscription management operations on cancelled subscriptions. AppDirect supports an OAuth-authenticated REST interface that allows API users to read, create, edit, and delete marketplace records that describe a subscription. These functions are all part of the Billing API, which is invokable through standard HTTP methods (GET, POST, PUT, and DELETE) using standard REST conventions. All calls to the Billing API occur under its endpoint URL, . --- # Additional subscription cancel examples Cancellation of a subscription doesn't require parameters beyond the subscriptionId, nor are attributes included. The examples included below show possible error cases. ## Cancelling a subscription that has already been cancelled[​](#cancelling-a-subscription-that-has-already-been-cancelled "Direct link to Cancelling a subscription that has already been cancelled") Below is an example of cancelling a subscription that has already been cancelled. **Response** * JSON ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 196 Content-Type: application/json;charset=UTF-8 Date: Tue, 18 Aug 2015 19:36:34 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=2906E30E4B81183984ABF99341C29C8B; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "SUBSCRIPTION_NOT_EDITABLE", "message": "Cannot cancel a subscription in CANCELLED status or with pending null" } ``` * XML ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 196 Content-Type: application/xml;charset=UTF-8 Date: Tue, 18 Aug 2015 19:36:34 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=2906E30E4B81183984ABF99341C29C8B; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff SUBSCRIPTION_NOT_EDITABLE Cannot cancel a subscription in CANCELLED status or with pending null ``` ## Cancelling a subscription that does not exist[​](#cancelling-a-subscription-that-does-not-exist "Direct link to Cancelling a subscription that does not exist") Below is an example of cancelling a subscription that does not exist in the system or is not part of this channel. **Response** * JSON ``` Status Code: 404 Not Found Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 178 Content-Type: application/xml;charset=UTF-8 Date: Tue, 18 Aug 2015 19:42:38 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "Not Found", "message": "Subscription not found with id 7845d75c-0fc0-4ec3-ac17-df95a746eff8." } ``` * XML ``` Status Code: 404 Not Found Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 178 Content-Type: application/xml;charset=UTF-8 Date: Tue, 18 Aug 2015 19:42:38 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff Not Found Subscription not found with id 7845d75c-0fc0-4ec3-ac17-df95a746eff8. ``` --- # Canceling a subscription Once you have a created valid subscription, you can cancel that subscription. To do so, you will need the unique subscription identifer returned in the create subscription response. The identifier may also be found by calling the subscription list API method. URL endpoint: `/api/billing/v1/subscriptions/{subscriptionId}` Method: DELETE Parameters: * subscriptionId - The unique identifier for the subscription provided by the channel. This id can be obtained either from the response returned when the subscription is created via the API, or by using the API to list the subscriptions for the company  and user in order to view the id for the subscription. HTTP status codes | HTTP Status Code | Description | | ---------------- | ------------------------------------------ | | 204 No Content | The subscription was successfully deleted. | | 400 Bad Request | The subscription was previously deleted. | | 404 Not Found | The specified subscription was not found. | Below is an example of a successful subscription cancel request and response. Additional examples for the error cases are provided in the example section of this document.  All of the examples presented assume you have successfully created a subscription as described in [Create subscriptions](/user-guides/billing-and-subscription/rest-api/create-subscriptions/.md). **Request** * JSON ``` DELETE https://www.appdirect.com/api/billing/v1/subscriptions/7845d75c-0fc0-4ec3-ac17-df95a746eff9 Host: www.appdirect.com Authorization OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="VeJO1tP7RKUE1rz", oauth_timestamp="1438728054", oauth_consumer_key="appdirect-91", oauth_signature="xy37tmDbpwuIHZJIioRSB3GGAhM%3D" Content-Type application/json ``` * XML ``` DELETE https://www.appdirect.com/api/billing/v1/subscriptions/7845d75c-0fc0-4ec3-ac17-df95a746eff9 Host: www.appdirect.com Authorization OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="VeJO1tP7RKUE1rz", oauth_timestamp="1438728054", oauth_consumer_key="appdirect-91", oauth_signature="xy37tmDbpwuIHZJIioRSB3GGAhM%3D" Content-Type application/xml ``` **Response** * JSON ``` Status Code: 204 No Content Cache-Control: no-cache, no-store, max-age=0, must-revalidate Date: Tue, 18 Aug 2015 17:30:49 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=42507F373A2CF782C6C9DC3B222ED5A4; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff ``` * XML ``` Status Code: 204 No Content Cache-Control: no-cache, no-store, max-age=0, must-revalidate Date: Tue, 18 Aug 2015 17:30:49 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=42507F373A2CF782C6C9DC3B222ED5A4; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff ``` --- # Other subscription-related API methods The AppDirect Billing API supports several additional methods for managing your subscription once it has been created or changed. There is a brief description of these methods below. ## List company subscriptions[​](#list-company-subscriptions "Direct link to List company subscriptions") Returns a list of subscriptions for the specified company. URL endpoint: /api/billing/v1/companies/\/subscriptions Method: GET Parameters: \ the ID assigned by the channel to identify each company HTTP Status Code: 200 OK Return list of subscriptions matching criteria; 404 Not Found if company with that id is not present in the system. ## List user subscriptions[​](#list-user-subscriptions "Direct link to List user subscriptions") Returns a list of subscriptions for the specified user. URL endpoint: /api/billing/v1/companies/\/users/\/subscriptions Method: GET Parameters: \ the ID assigned by the channel to identify each company, \ the ID assigned by the channel to identify each user HTTP Status Code: 200 OK Return list of subscriptions matching criteria; 404 Not Found if company, or user, with that id is not present in the system. ## Read subscription[​](#read-subscription "Direct link to Read subscription") Returns the details of a single payment instrument URL endpoint: /api/billing/v1/subscriptions/\ Method: GET Parameters: \ The unique identifier assigned to the subscription by the channel HTTP Status Codes: 200 OK Return payment instrument; 404 Not Found if the payment instrument with that id is not present in the system. ## Change subscription[​](#change-subscription "Direct link to Change subscription") Change an existing subscription URL endpoint: /api/billing/v1/companies/\/users/\/subscriptions/\ Method: PUT Parameters: \ the ID assigned by the channel to identify each company, \ the ID assigned by the channel to identify each user, \ the ID assigned by the channel to identify each subscription, a valid JSON or XML object containing subscription data HTTP Status Codes: 200 OK subscription updated, 404 Not Found if company, user, or subscription with that id is not present in the system. --- # Supported request attributes There are no supported request attributes for subscription cancel. --- # Supported response attributes There are no supported response attributes for subscription cancel. --- # Use cases Once a subscription has been created, you may cancel the subscription through the AppDirect API. Doing so is the equivalent of canceling or removing the subscription through the AppDirect UI. Note that the user cancelling the subscription does not necessarily have to be the original purchaser of the product. It can be another user with the appropriate permissions. Doing so through the API, of course, requires channel admin access. --- # Change subscriptions A subscription represents a customer's entitlement to a product and determines their access to that product, as well as their payment schedule. Subscriptions are created when the customer places an order. Once you have a created a subscription, you may make changes to your subscription, depending on what options are available. You may be able to upgrade or downgrade the options on the current edition, or move to a different edition. A subscription can be changed through the UI by selecting the "Update Edition" tab on the Manage->Account->Applications page for the given application. through an AppDirect-powered marketplace. ![](/assets/images/bag-updateedition-ba414ae3738ac42fe7ae467ca2e1041b.png) Once you have a created company, a user, a payment instrument for that user,  and a subscription on behalf of that user, you may manage the subscription.  This includes changing a subscription. AppDirect supports an OAuth-authenticated REST interface that allows API users to read, create, edit, and delete marketplace records that describe a subscription. These functions are all part of the Billing API, which is invokable through standard HTTP methods (GET, POST, PUT, and DELETE) using standard REST conventions. All calls to the Billing API occur under its endpoint URL, . --- # Additional subscription change examples Several examples of changes to subscriptions are included below. The requests often only vary by the payment plan, which represents the edition of the product being purchased, or a number of units, but the responses may contain very different information depending on how the edition is configured. ### Changing a subscription - upgrade free trial to paid[​](#changing-a-subscription---upgrade-free-trial-to-paid "Direct link to Changing a subscription - upgrade free trial to paid") Below is an example of changing a subscription from a free trial edition to the same edition, but paid. Request * JSON ``` { "id":"6b9804cd-b2b9-45c2-8487-1e8b9d5fa667", "order":{ "paymentPlanId" : 552 "activated" : true } } ``` * XML ``` 6b9804cd-b2b9-45c2-8487-1e8b9d5fa667 552 true ``` **Response** * JSON ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1281 Content-Type: application/xml;charset=UTF-8 Date: Sun, 16 Aug 2015 22:42:03 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "efc58da2-d957-46d7-988b-48c7419a8c58", "creationDate": "2015-08-12T11:18:59-06:00", "externalAccountId": "2217d789-bdce-4c01-bebe-431b44cab478", "status": "FREE_TRIAL", "maxUsers": "1", "order": { "id": "1585", "startDate": "2015-08-27T00:00:00-06:00", "nextBillingDate": "2015-08-27T00:00:00-06:00", "status": "FREE_TRIAL", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "0.0000000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/450/paymentPlans/552", "id": "552", "uuid": "78941742-43e6-4a85-b656-65b2727d515c", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false" }, "paymentPlanId": "552", "activated": "false", "orderLines": {[ { "description": "LATEST AUTO_WEBAPP_NEW - Free Trial 15 Days No Grace Period - Monthly Fee", "id": "2430", "price": "0.0000000000", "quantity": "1.0000000000", "totalPrice": "0.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Sales Tax", "id": "2431", "percentage": "0.0000000000", "quantity": "1.0000000000", "totalPrice": "0.0000000000", "type": "TAX" } ] } }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "http://localhost:8080/api/marketplace/v1/products/78" }, "edition": { "-id": "450", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/450" } } ``` * XML ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1281 Content-Type: application/xml;charset=UTF-8 Date: Sun, 16 Aug 2015 22:42:03 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff efc58da2-d957-46d7-988b-48c7419a8c58 2015-08-12T11:18:59-06:00 2217d789-bdce-4c01-bebe-431b44cab478 FREE_TRIAL 1 1585 2015-08-27T00:00:00-06:00 2015-08-27T00:00:00-06:00 ACTIVE> MONTHLY USD NEW 0.0000000000 552 78941742-43e6-4a85-b656-65b2727d515c MONTHLY false false false false false false false > 552 false LATEST AUTO_WEBAPP_NEW - Free Trial 15 Days No Grace Period - Monthly Fee 2430 0.0000000000 1.0000000000 0.0000000000 ITEM NOT_APPLICABLE Sales Tax 2431 0.0000000000 1.0000000000 0.0000000000 TAX ``` ## Changing a subscription - upgrade free trial to a paid edition[​](#changing-a-subscription---upgrade-free-trial-to-a-paid-edition "Direct link to Changing a subscription - upgrade free trial to a paid edition") Below is an example of changing a subscription from a free trial edition to a different edition that is paid. Request * JSON ``` { "id":"6b9804cd-b2b9-45c2-8487-1e8b9d5fa667", "order":{ "paymentPlanId":541 } } ``` * XML ``` 6b9804cd-b2b9-45c2-8487-1e8b9d5fa667 541 ``` **Response** * JSON ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1281 Content-Type: application/xml;charset=UTF-8 Date: Sun, 16 Aug 2015 22:42:03 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "6b9804cd-b2b9-45c2-8487-1e8b9d5fa667", "creationDate": "2015-08-16T15:56:27-06:00", "externalAccountId": "5f5aee55-e45d-44c3-bc34-1fd1486f4dbf", "status": "ACTIVE", "maxUsers": "1", "order": { "id": "1616", "startDate": "2015-08-16T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "MIGRATION", "totalPrice": "10.6300000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/440/paymentPlans/541", "id": "541", "uuid": "dcdf76e8-e7d2-4fe3-bc12-f6d03bb4c8b0", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": {[ { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "SEK": "10", "USD": "10" } }, { "unit": "ONE_TIME_SETUP", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "1.5", "CHF": "1.5", "SEK": "1.5", "USD": "1.5" } }, { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "5", "CHF": "5", "SEK": "5", "USD": "5" } }, { "unit": "ONE_TIME_SETUP", "unitDependency": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "2", "CHF": "2", "SEK": "2", "USD": "2" } } ] } }, "previousOrder": { "-id": "1614", "-href": "http://localhost:8080/api/billing/v1/orders/1614" }, "paymentPlanId": "541", "activated": "false", "oneTimeOrders": { "oneTimeOrder": { "id": "1615", "startDate": "2015-08-16T00:00:00-06:00", "endDate": "2015-08-16T00:00:00-06:00", "nextBillingDate": "2015-08-16T16:42:03-06:00", "status": "ONE_TIME", "frequency": "ONE_TIME", "currency": "USD", "type": "ONE_TIME_FEE", "totalPrice": "1.5900000000", "paymentPlan": { "-id": "541", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/440/paymentPlans/541" } } }, "orderLines": {[ { "description": "LATEST AUTO_WEBAPP_NEW - Recurring edition all fees except contract - Monthly Fee", "id": "2509", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Sales Tax", "id": "2510", "percentage": "6.3000000000", "quantity": "1.0000000000", "totalPrice": "0.6300000000", "type": "TAX" } ] } }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "http://localhost:8080/api/marketplace/v1/products/78" }, "edition": { "-id": "440", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/440" } } ``` * XML ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1281 Content-Type: application/xml;charset=UTF-8 Date: Sun, 16 Aug 2015 22:42:03 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 6b9804cd-b2b9-45c2-8487-1e8b9d5fa667 2015-08-16T15:56:27-06:00 5f5aee55-e45d-44c3-bc34-1fd1486f4dbf ACTIVE 1 1616 2015-08-16T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD MIGRATION 10.6300000000 541 dcdf76e8-e7d2-4fe3-bc12-f6d03bb4c8b0 MONTHLY false false false false false false false NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 10 10 ONE_TIME_SETUP 0.0000000000 false 1.0000000000 false false false false 1.5 1.5 1.5 1.5 USER 0.0000000000 false false false false false 5 5 5 5 ONE_TIME_SETUP USER 0.0000000000 false 1.0000000000 false false false false 2 2 2 2 541 false 1615 2015-08-16T00:00:00-06:00 2015-08-16T00:00:00-06:00 2015-08-16T16:42:03-06:00 ONE_TIME ONE_TIME USD ONE_TIME_FEE 1.5900000000 LATEST AUTO_WEBAPP_NEW - Recurring edition all fees except contract - Monthly Fee 2509 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE Sales Tax 2510 6.3000000000 1.0000000000 0.6300000000 TAX ``` ## Changing a free trial subscription to a different free trial[​](#changing-a-free-trial-subscription-to-a-different-free-trial "Direct link to Changing a free trial subscription to a different free trial") Below is an example of changing a free trial (15 days) subscription to a subscription with a different free trial (10 days). Note that an error is returned because a free trial edition has already been purchased for this product. Request * JSON ``` { "order": { "paymentPlanId": "553" } } ``` * XML ``` 553 ``` **Response** * JSON ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 191 Content-Type: application/json;charset=UTF-8 Date: Mon, 17 Aug 2015 15:19:44 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "FREE_TRIAL_EDITION_NOT_AVAILABLE", "message": "Company has already purchased an edition with free trial." } ``` * XML ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 191 Content-Type: application/xml;charset=UTF-8 Date: Mon, 17 Aug 2015 15:19:44 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff FREE_TRIAL_EDITION_NOT_AVAILABLE Company has already purchased an edition with free trial. ``` ## Changing a subscription to a one time edition[​](#changing-a-subscription-to-a-one-time-edition "Direct link to Changing a subscription to a one time edition") Below is an example of changing a subscription to one time, flat rate edition. Request * JSON ``` { "id": "7845d75c-0fc0-4ec3-ac17-df95a746eff9", "order": { "paymentPlanId": "568" } } ``` * XML ``` 7845d75c-0fc0-4ec3-ac17-df95a746eff9 568 ``` **Response** * JSON ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1115 Content-Type: application/json;charset=UTF-8 Date: Mon, 17 Aug 2015 16:22:28 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=DE50B3B7CB909A3EE747624B195C2CA3; Path=/; HttpOnly Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "7845d75c-0fc0-4ec3-ac17-df95a746eff9", "creationDate": "2015-08-16T17:12:53-06:00", "externalAccountId": "9fb3765a-1271-4fe3-aa72-92b3468995d6", "status": "ACTIVE", "order": { "id": "1618", "startDate": "2015-08-17T00:00:00-06:00", "endDate": "2015-08-17T00:00:00-06:00", "nextBillingDate": "2015-08-17T10:22:28-06:00", "status": "ONE_TIME", "frequency": "ONE_TIME", "currency": "USD", "type": "MIGRATION", "totalPrice": "10.6300000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/465/paymentPlans/568", "id": "568", "uuid": "e52ff207-2a17-4c58-85f3-6d49a23136af", "frequency": "ONE_TIME", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "1", "SEK": "10", "USD": "10" } } } }, "previousOrder": { "-id": "1617", "-href": "http://localhost:8080/api/billing/v1/orders/1617" }, "paymentPlanId": "568", "activated": "false", "orderLines": {[ { "description": "LATEST AUTO_WEBAPP_NEW - One Time - Flat Rate Price - One Time Fee", "id": "2513", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Sales Tax", "id": "2514", "percentage": "6.3000000000", "quantity": "1.0000000000", "totalPrice": "0.6300000000", "type": "TAX" } ] } }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "http://localhost:8080/api/marketplace/v1/products/78" }, "edition": { "-id": "465", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/465" } } ``` * XML ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1115 Content-Type: application/xml;charset=UTF-8 Date: Mon, 17 Aug 2015 16:22:28 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=DE50B3B7CB909A3EE747624B195C2CA3; Path=/; HttpOnly Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 7845d75c-0fc0-4ec3-ac17-df95a746eff9 2015-08-16T17:12:53-06:00 9fb3765a-1271-4fe3-aa72-92b3468995d6 ACTIVE 1618 2015-08-17T00:00:00-06:00 2015-08-17T00:00:00-06:00 2015-08-17T10:22:28-06:00 ONE_TIME ONE_TIME USD MIGRATION 10.6300000000 568 e52ff207-2a17-4c58-85f3-6d49a23136af ONE_TIME false false false false false false false NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 1 10 10 568 false LATEST AUTO_WEBAPP_NEW - One Time - Flat Rate Price - One Time Fee 2513 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE Sales Tax 2514 6.3000000000 1.0000000000 0.6300000000 TAX ``` ## Changing to a recurring subscription with price per unit[​](#changing-to-a-recurring-subscription-with-price-per-unit "Direct link to Changing to a recurring subscription with price per unit") Below is an example of changing to a subscription for a recurring edition with USER as a price per unit. Request * JSON ``` { "id": "7845d75c-0fc0-4ec3-ac17-df95a746eff9", "order": { "paymentPlanId": "565", "orderLines": [ { "unit": "USER", "quantity": 5 } ] } } ``` * XML ``` 7845d75c-0fc0-4ec3-ac17-df95a746eff9 565 USER 5 ``` **Response** * JSON ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1109 Content-Type: application/json;charset=UTF-8 Date: Mon, 17 Aug 2015 17:28:23 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "7845d75c-0fc0-4ec3-ac17-df95a746eff9", "creationDate": "2015-08-16T17:12:53-06:00", "externalAccountId": "a2d2d90d-d58e-46b9-bdc8-20e33e289415", "status": "ACTIVE", "maxUsers": "6", "order": { "id": "1620", "startDate": "2015-08-17T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "MIGRATION", "totalPrice": "53.1300000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462/paymentPlans/565", "id": "565", "uuid": "a8c0b5d3-640f-4389-ba48-962a29934c06", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "1", "SEK": "10", "USD": "10" } } } }, "previousOrder": { "-id": "1619", "-href": "http://localhost:8080/api/billing/v1/orders/1619" }, "paymentPlanId": "565", "activated": "false", "orderLines": [ { "description": "LATEST AUTO_WEBAPP_NEW - Recurring Edition - Price Per Unit - Per User Fee", "id": "2518", "price": "10.0000000000", "quantity": "5.0000000000", "totalPrice": "50.0000000000", "type": "ITEM", "unit": "USER" }, { "description": "Sales Tax", "id": "2519", "percentage": "6.2600000000", "quantity": "1.0000000000", "totalPrice": "3.1300000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "http://localhost:8080/api/marketplace/v1/products/78" }, "edition": { "-id": "462", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462" } } ``` * XML ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1109 Content-Type: application/xml;charset=UTF-8 Date: Mon, 17 Aug 2015 17:28:23 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 7845d75c-0fc0-4ec3-ac17-df95a746eff9 2015-08-16T17:12:53-06:00 a2d2d90d-d58e-46b9-bdc8-20e33e289415 ACTIVE 6 1620 2015-08-17T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD MIGRATION 53.1300000000 565 a8c0b5d3-640f-4389-ba48-962a29934c06 MONTHLY false false false false false false false USER 0.0000000000 false false false false false 10 10 1 10 10 565 false LATEST AUTO_WEBAPP_NEW - Recurring Edition - Price Per Unit - Per User Fee 2518 10.0000000000 5.0000000000 50.0000000000 ITEM USER Sales Tax 2519 6.2600000000 1.0000000000 3.1300000000 TAX ``` ## Changing a subscription with price per unit - upgrade[​](#changing-a-subscription-with-price-per-unit---upgrade "Direct link to Changing a subscription with price per unit - upgrade") Below is an example of changing a subscription for a recurring price per unit edition upgrading (increasing) the number of users. Request * JSON ``` { "id": "7845d75c-0fc0-4ec3-ac17-df95a746eff9", "order": { "paymentPlanId": "565", "orderLines": [ { "unit": "USER", "quantity": 10 } ] } } ``` * XML ``` 7845d75c-0fc0-4ec3-ac17-df95a746eff9 565 USER 10 ``` **Response** * JSON ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1109 Content-Type: application/json;charset=UTF-8 Date: Mon, 17 Aug 2015 17:28:23 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "7845d75c-0fc0-4ec3-ac17-df95a746eff9", "creationDate": "2015-08-16T17:12:53-06:00", "externalAccountId": "930f48bf-0aac-41fb-a6e9-58df4f573d72", "status": "ACTIVE", "maxUsers": "11", "order": { "id": "1622", "startDate": "2015-08-17T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "MIGRATION", "totalPrice": "106.2500000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462/paymentPlans/565", "id": "565", "uuid": "a8c0b5d3-640f-4389-ba48-962a29934c06", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "1", "SEK": "10", "USD": "10" } } } }, "previousOrder": { "-id": "1620", "-href": "http://localhost:8080/api/billing/v1/orders/1620" }, "paymentPlanId": "565", "activated": "false", "oneTimeOrders": { "oneTimeOrder": { "id": "1621", "startDate": "2015-08-17T00:00:00-06:00", "endDate": "2015-09-01T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ONE_TIME", "frequency": "MONTHLY", "currency": "USD", "type": "CREDIT", "totalPrice": "-53.1300000000", "paymentPlan": { "-id": "565", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462/paymentPlans/565" } } }, "orderLines": [ { "description": "LATEST AUTO_WEBAPP_NEW - Recurring Edition - Price Per Unit - Per User Fee", "id": "2522", "price": "10.0000000000", "quantity": "10.0000000000", "totalPrice": "100.0000000000", "type": "ITEM", "unit": "USER" }, { "description": "Sales Tax", "id": "2523", "percentage": "6.2500000000", "quantity": "1.0000000000", "totalPrice": "6.2500000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "http://localhost:8080/api/marketplace/v1/products/78" }, "edition": { "-id": "462", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462" } } ``` * XML ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1161 Content-Type: application/xml;charset=UTF-8 Date: Mon, 17 Aug 2015 17:28:23 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 7845d75c-0fc0-4ec3-ac17-df95a746eff9 2015-08-16T17:12:53-06:00 930f48bf-0aac-41fb-a6e9-58df4f573d72 ACTIVE 11 1622 2015-08-17T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD MIGRATION 106.2500000000 565 a8c0b5d3-640f-4389-ba48-962a29934c06 MONTHLY false false false false false false false USER 0.0000000000 false false false false false 10 10 1 10 10 565 false 1621 2015-08-17T00:00:00-06:00 2015-09-01T00:00:00-06:00 2015-09-01T00:00:00-06:00 ONE_TIME MONTHLY USD CREDIT -53.1300000000 LATEST AUTO_WEBAPP_NEW - Recurring Edition - Price Per Unit - Per User Fee 2522 10.0000000000 10.0000000000 100.0000000000 ITEM USER Sales Tax 2523 6.2500000000 1.0000000000 6.2500000000 TAX ``` ## Changing a subscription with price per unit - downgrade[​](#changing-a-subscription-with-price-per-unit---downgrade "Direct link to Changing a subscription with price per unit - downgrade") Below is an example of changing a subscription for a recurring price per unit edition downgrading (descreasing) the number of users. Request * JSON ``` { "id": "7845d75c-0fc0-4ec3-ac17-df95a746eff9", "order": { "paymentPlanId": "565", "orderLines": [ { "unit": "USER", "quantity": 3 } ] } } ``` * XML ``` 7845d75c-0fc0-4ec3-ac17-df95a746eff9 565 USER 3 ``` **Response** * JSON ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1109 Content-Type: application/json;charset=UTF-8 Date: Mon, 17 Aug 2015 17:28:23 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "7845d75c-0fc0-4ec3-ac17-df95a746eff9", "creationDate": "2015-08-16T17:12:53-06:00", "externalAccountId": "6b4a3289-c864-4f41-8a63-95e1abcacaea", "status": "ACTIVE", "maxUsers": "4", "order": { "id": "1624", "startDate": "2015-08-17T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "MIGRATION", "totalPrice": "31.8800000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462/paymentPlans/565", "id": "565", "uuid": "a8c0b5d3-640f-4389-ba48-962a29934c06", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "1", "SEK": "10", "USD": "10" } } } }, "previousOrder": { "-id": "1622", "-href": "http://localhost:8080/api/billing/v1/orders/1622" }, "paymentPlanId": "565", "activated": "false", "oneTimeOrders": { "oneTimeOrder": { "id": "1623", "startDate": "2015-08-17T00:00:00-06:00", "endDate": "2015-09-01T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ONE_TIME", "frequency": "MONTHLY", "currency": "USD", "type": "CREDIT", "totalPrice": "-106.2500000000", "paymentPlan": { "-id": "565", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462/paymentPlans/565" } } }, "orderLines": [ { "description": "LATEST AUTO_WEBAPP_NEW - Recurring Edition - Price Per Unit - Per User Fee", "id": "2526", "price": "10.0000000000", "quantity": "3.0000000000", "totalPrice": "30.0000000000", "type": "ITEM", "unit": "USER" }, { "description": "Sales Tax", "id": "2527", "percentage": "6.2666666700", "quantity": "1.0000000000", "totalPrice": "1.8800000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "http://localhost:8080/api/marketplace/v1/products/78" }, "edition": { "-id": "462", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462" } ``` * XML ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1167 Content-Type: application/xml;charset=UTF-8 Date: Mon, 17 Aug 2015 19:05:34 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 7845d75c-0fc0-4ec3-ac17-df95a746eff9 2015-08-16T17:12:53-06:00 6b4a3289-c864-4f41-8a63-95e1abcacaea ACTIVE 4 1624 2015-08-17T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD MIGRATION 31.8800000000 565 a8c0b5d3-640f-4389-ba48-962a29934c06 MONTHLY false false false false false false false USER 0.0000000000 false false false false false 10 10 1 10 10 565 false 1623 2015-08-17T00:00:00-06:00 2015-09-01T00:00:00-06:00 2015-09-01T00:00:00-06:00 ONE_TIME MONTHLY USD CREDIT -106.2500000000 LATEST AUTO_WEBAPP_NEW - Recurring Edition - Price Per Unit - Per User Fee 2526 10.0000000000 3.0000000000 30.0000000000 ITEM USER Sales Tax 2527 6.2666666700 1.0000000000 1.8800000000 TAX ``` ## Changing a subscription to add a discount[​](#changing-a-subscription-to-add-a-discount "Direct link to Changing a subscription to add a discount") Below is an example of changing a subscription to apply a discount. Request * JSON ``` { "id": "7845d75c-0fc0-4ec3-ac17-df95a746eff9", "order": { "paymentPlanId": "565" "discountId": "27" } } ``` * XML ``` 7845d75c-0fc0-4ec3-ac17-df95a746eff9 565 27 ``` **Response** * JSON ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1136 Content-Type: application/json;charset=UTF-8 Date: Mon, 17 Aug 2015 16:50:46 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "7845d75c-0fc0-4ec3-ac17-df95a746eff9", "creationDate": "2015-08-16T17:12:53-06:00", "externalAccountId": "906dc4e6-b2fe-4567-95a3-03c1bc4a99b3", "status": "ACTIVE", "maxUsers": "1", "order": { "id": "1626", "startDate": "2015-08-17T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "MIGRATION", "totalPrice": "-5.0000000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462/paymentPlans/565", "id": "565", "uuid": "a8c0b5d3-640f-4389-ba48-962a29934c06", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "1", "SEK": "10", "USD": "10" } } } }, "previousOrder": { "-id": "1624", "-href": "http://localhost:8080/api/billing/v1/orders/1624" }, "discount": { "-id": "27", "-href": "http://localhost:8080/api/channel/v1/discounts/27" }, "paymentPlanId": "565", "activated": "false", "oneTimeOrders": { "oneTimeOrder": { "id": "1625", "startDate": "2015-08-17T00:00:00-06:00", "endDate": "2015-09-01T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ONE_TIME", "frequency": "MONTHLY", "currency": "USD", "type": "CREDIT", "totalPrice": "-31.8800000000", "paymentPlan": { "-id": "565", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462/paymentPlans/565" } } }, "orderLines":[ { "description": "autoApply attribute is true", "id": "2530", "price": "-5.0000000000", "quantity": "1.0000000000", "totalPrice": "-5.0000000000", "type": "DISCOUNT" }, { "description": "Sales Tax", "id": "2531", "percentage": "0.0000000000", "quantity": "1.0000000000", "totalPrice": "0.0000000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "http://localhost:8080/api/marketplace/v1/products/78" }, "edition": { "-id": "462", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/462" } } ``` * XML ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1183 Content-Type: application/xml;charset=UTF-8 Date: Mon, 17 Aug 2015 16:50:46 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 7845d75c-0fc0-4ec3-ac17-df95a746eff9 2015-08-16T17:12:53-06:00 906dc4e6-b2fe-4567-95a3-03c1bc4a99b3 ACTIVE 1 1626 2015-08-17T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD MIGRATION -5.0000000000 565 a8c0b5d3-640f-4389-ba48-962a29934c06 MONTHLY false false false false false false false USER 0.0000000000 false false false false false 10 10 1 10 10 565 false 1625 2015-08-17T00:00:00-06:00 2015-09-01T00:00:00-06:00 2015-09-01T00:00:00-06:00 ONE_TIME MONTHLY USD CREDIT -31.8800000000 autoApply attribute is true 2530 -5.0000000000 1.0000000000 -5.0000000000 DISCOUNT Sales Tax 2531 0.0000000000 1.0000000000 0.0000000000 TAX ``` ## Changing a subscription to Microsoft products[​](#changing-a-subscription-to-microsoft-products "Direct link to Changing a subscription to Microsoft products") Below is an example of changing a Microsoft product. The number of users and the edition (payment plan) are both updated. Request * JSON ``` { "id":"65c8b5fc-2563-4668-ac85-485b2e06aaac", "order":{ "paymentPlanId":750, "orderLines":[{ "unit":"USER", "quantity":2 }] } } ``` * XML ``` 65c8b5fc-2563-4668-ac85-485b2e06aaac 750 USER 2 ``` **Response** * JSON ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1088 Content-Type: application/json;charset=UTF-8 Date: Sun, 16 Aug 2015 21:03:06 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "65c8b5fc-2563-4668-ac85-485b2e06aaac", "creationDate": "2015-08-16T14:47:50-06:00", "externalAccountId": "b21b8123-bc21-425e-9bbf-4672fc7c1340", "status": "ACTIVE", "maxUsers": "4", "order": { "id": "1611", "startDate": "2015-08-16T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "42.5100000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "http://localhost:8080/api/marketplace/v1/products/93/editions/612/paymentPlans/749", "id": "749", "uuid": "eb483983-ce47-41a7-b304-e5b6bb89d818", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": [ { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10.0000000000", "CHF": "10.0000000000", "USD": "10.0000000000" } }, { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10.0000000000", "CHF": "10.0000000000", "USD": "10.0000000000" } } ] } }, "paymentPlanId": "749", "activated": "false", "orderLines": {[ { "description": "Office 365 Web Apps - Plan 1 - Monthly Fee", "id": "2496", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Office 365 Web Apps - Plan 1 - Per User Fee", "id": "2497", "price": "10.0000000000", "quantity": "3.0000000000", "totalPrice": "30.0000000000", "type": "ITEM", "unit": "USER" }, { "description": "Sales Tax", "id": "2498", "percentage": "6.2750000000", "quantity": "1.0000000000", "totalPrice": "2.5100000000", "type": "TAX" } ] } }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "93", "-href": "http://localhost:8080/api/marketplace/v1/products/93" }, "edition": { "-id": "612", "-href": "http://localhost:8080/api/marketplace/v1/products/93/editions/612" } } ``` * XML ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1088 Content-Type: application/xml;charset=UTF-8 Date: Sun, 16 Aug 2015 21:03:06 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 65c8b5fc-2563-4668-ac85-485b2e06aaac 2015-08-16T14:47:50-06:00 b21b8123-bc21-425e-9bbf-4672fc7c1340 ACTIVE 4 1611 2015-08-16T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD NEW 42.5100000000 749 eb483983-ce47-41a7-b304-e5b6bb89d818 MONTHLY false false false false false false false USER 0.0000000000 false false false false false 10.0000000000 10.0000000000 10.0000000000 NOT_APPLICABLE 0.0000000000 false false false false false 10.0000000000 10.0000000000 10.0000000000 749 false Office 365 Web Apps - Plan 1 - Monthly Fee 2496 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE Office 365 Web Apps - Plan 1 - Per User Fee 2497 10.0000000000 3.0000000000 30.0000000000 ITEM USER Sales Tax 2498 6.2750000000 1.0000000000 2.5100000000 TAX ``` ## Changing a subscription invalid discount[​](#changing-a-subscription-invalid-discount "Direct link to Changing a subscription invalid discount") Below is an example of changing a subscription with a bad request caused by invalid data, specifically the discount code not being valid for the application. Request * JSON ``` { "id": "902ac86e-89c2-4d02-8d2d-614d2117bd2c", "order": { "paymentPlanId": "541", "discountId": "25" } } ``` * XML ``` 902ac86e-89c2-4d02-8d2d-614d2117bd2c 749 25 ``` **Response** * JSON ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 152 Content-Type: application/json;charset=UTF-8 Date: Thu, 13 Aug 2015 01:41:49 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "DISCOUNT_NOT_VALID", "message": "Discount cannot apply to this order." } ``` * XML ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 152 Content-Type: application/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 01:41:49 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff DISCOUNT_NOT_VALID Discount cannot apply to this order. ``` ## Changing a subscription missing required data[​](#changing-a-subscription-missing-required-data "Direct link to Changing a subscription missing required data") Below is an example of changing a subscription with a bad request caused by missing required data, specifically the subscription id field. Request * JSON ``` { "order": { "paymentPlanId": "568" } } ``` * XML ``` 568 ; ``` **Response** * JSON ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 152 Content-Type: application/json;charset=UTF-8 Date: Thu, 13 Aug 2015 01:41:49 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "INVALID_PARAMETER", "message": "Subscription ID does not match." } ``` * XML ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 152 Content-Type: application/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 01:41:49 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff INVALID_PARAMETER Subscription ID does not match. ``` ## Changing a subscription with a bad request[​](#changing-a-subscription-with-a-bad-request "Direct link to Changing a subscription with a bad request") Below is an example of changing a subscription with a bad request. In this case, the JSON object is missing a curly brace, while the XML is missing a closing tag. Request * JSON ``` { "id": "902ac86e-89c2-4d02-8d2d-614d2117bd2c", "order": { "paymentPlanId": "568" } ``` * XML ``` 568 ``` **Response** * JSON ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 133 Content-Type: text/json;charset=UTF-8 Date: Thu, 13 Aug 2015 01:29:50 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=36AF57502F9FA7774A5C25DB732DD8BF; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "Bad Request", "message": "Unexpected end-of-input: expected close marker for OBJECT (from [Source: org.apache.cxf.transport.http.AbstractHTTPDestination$1@41e290f5; line: 1, column: 0])" } ``` * XML ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 133 Content-Type: text/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 01:29:50 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=36AF57502F9FA7774A5C25DB732DD8BF; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff Bad Request HTTP 400 Bad Request ``` ## Changing a subscription to the same thing[​](#changing-a-subscription-to-the-same-thing "Direct link to Changing a subscription to the same thing") Below is an example of changing a subscription to the same edition with the same options. Request * JSON ``` { "id": "902ac86e-89c2-4d02-8d2d-614d2117bd2c", "order": { "paymentPlanId": "541", "orderLines":[ { "unit": "USER", "quantity": "3" }] } } ``` * XML ``` 902ac86e-89c2-4d02-8d2d-614d2117bd2c 541 >USER 3 ; ``` **Response** * JSON ``` Status Code: 409 Conflict Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 166 Content-Type: application/xml;charset=UTF-8 Date: Wed, 12 Aug 2015 23:28:03 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=5F84FC4F9EA36791D38C5E32869DBC29; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "409", "message": "Already subscribed to this edition." } ``` * XML ``` Status Code: 409 Conflict Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 140 Content-Type: application/xml;charset=UTF-8 Date: Sat, 15 Aug 2015 19:41:54 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 409 Already subscribed to this edition. ``` --- # Changing a subscription Once you have a created valid subscription, you can change the subscription. To do so, you will need the unique company identifier returned in the create company response, the unique user identifier returned in the create user response, and the unique subscription identifer returned in the create subscription response. Note that you do not need the unique identifier for the payment instrument, but the user must have a valid payment instrument in the database. The identifiers may also be found by calling the respective list API methods. URL endpoint: `/api/billing/v1/companies/{companyId}/users/{userId}/subscriptions/{subscriptionId}` Method: PUT Parameters: * companyId - The unique identifier for the company provided by the channel. This id can be obtained either from the response returned when the company is created via the API, or by using the API to list the companies in order to view the id for your company. * userId - The unique identifier for the user provided by the channel. This id can be obtained either from the response returned when the user is created via the API, or by using the API to list the users for the company in order to view the id for the user. * subscriptionId - The unique identifier for the subscription provided by the channel. This id can be obtained either from the response returned when the subscription is created via the API, or by using the API to list the subscriptions for the company  and user in order to view the id for the subscription. * A valid JSON or XML object with subscription data HTTP status codes | HTTP Status Code | Description | | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 201 Created | The subscription was created. | | 400 Bad Request | Some required fields were not received. | | 404 Not Found | The specified company, user, or subscription was not found. | | 409 Conflict | A subscription with identical attributes already exists for the specified company.  You may assign the user to the existing subscription or change the subscription (to a different edition, or upgrade/downgrade modifiable options). | Below is an example of the most basic subscription change request and response. In this case, the edition is simply changed to a new edition. Additional examples are provided in the example section of this document.  All of the examples presented assume you have successfully created a subscription as described in [Create subscriptions](/user-guides/billing-and-subscription/rest-api/create-subscriptions/.md). Request * JSON ``` PUT https://www.appdirect.com/api/billing/v1/companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78/users/3d4d2342-b7c4-4865-85bd-842f269adae6/subscriptions/902ac86e-89c2-4d02-8d2d-614d2117bd2c Host: www.appdirect.com Authorization OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="VeJO1tP7RKUE1rz", oauth_timestamp="1438728054", oauth_consumer_key="appdirect-91", oauth_signature="xy37tmDbpwuIHZJIioRSB3GGAhM%3D" Content-Type application/json { "id": "902ac86e-89c2-4d02-8d2d-614d2117bd2c", "order": { "paymentPlanId": "568" } } ``` * XML ``` PUT https://www.appdirect.com/api/billing/v1/companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78/users/3d4d2342-b7c4-4865-85bd-842f269adae6/subscriptions/902ac86e-89c2-4d02-8d2d-614d2117bd2c Host: www.appdirect.com Authorization OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="VeJO1tP7RKUE1rz", oauth_timestamp="1438728054", oauth_consumer_key="appdirect-91", oauth_signature="xy37tmDbpwuIHZJIioRSB3GGAhM%3D" Content-Type application/xml "902ac86e-89c2-4d02-8d2d-614d2117bd2c 568 ``` Response * JSON ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1178 Content-Type: application/json;charset=UTF-8 Date: Sat, 15 Aug 2015 20:03:31 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "902ac86e-89c2-4d02-8d2d-614d2117bd2c", "creationDate": "2015-08-15T12:46:43-06:00", "externalAccountId": "825e63bf-1ba9-46a5-9237-3a715b467d38", "status": "ACTIVE", "order": { "id": "1610", "startDate": "2015-08-15T00:00:00-06:00", "endDate": "2015-08-15T00:00:00-06:00", "nextBillingDate": "2015-08-15T14:03:30-06:00", "status": "ONE_TIME", "frequency": "ONE_TIME", "currency": "USD", "type": "MIGRATION", "totalPrice": "10.6300000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www/api/marketplace/v1/products/78/editions/465/paymentPlans/568", "id": "568", "uuid": "e52ff207-2a17-4c58-85f3-6d49a23136af", "frequency": "ONE_TIME", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": [ { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "1", "SEK": "10", "USD": "10" } ] }, "previousOrder": { "-id": "1608", "-href": "https://www.appdirect.com/api/billing/v1/orders/1608" }, "paymentPlanId": "568", "activated": "false", "oneTimeOrders": { "oneTimeOrder": { "id": "1609", "startDate": "2015-08-15T00:00:00-06:00", "endDate": "2015-09-01T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ONE_TIME", "frequency": "MONTHLY", "currency": "USD", "type": "CREDIT", "totalPrice": "-10.6300000000", "paymentPlan": { "-id": "541", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/440/paymentPlans/541" } } }, "orderLines": { "orderLine": [ { "description": "LATEST AUTO_WEBAPP_NEW - One Time - Flat Rate Price - One Time Fee", "id": "2494", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Sales Tax", "id": "2495", "percentage": "6.3000000000", "quantity": "1.0000000000", "totalPrice": "0.6300000000", "type": "TAX" } ] } }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://localhost:8080/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://localhost:8080/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "http://localhost:8080/api/marketplace/v1/products/78" }, "edition": { "-id": "465", "-href": "http://localhost:8080/api/marketplace/v1/products/78/editions/465" } } ``` * XML ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1178 Content-Type: application/xml;charset=UTF-8 Date: Sat, 15 Aug 2015 20:03:31 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 902ac86e-89c2-4d02-8d2d-614d2117bd2c 2015-08-15T12:46:43-06:00 825e63bf-1ba9-46a5-9237-3a715b467d38 ACTIVE 1610 2015-08-15T00:00:00-06:00 2015-08-15T00:00:00-06:00 2015-08-15T14:03:30-06:00 ONE_TIME ONE_TIME USD MIGRATION 10.6300000000 568 e52ff207-2a17-4c58-85f3-6d49a23136af ONE_TIME false false false false false false false NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 1 10 10 568 false 1609 2015-08-15T00:00:00-06:00 2015-09-01T00:00:00-06:00 2015-09-01T00:00:00-06:00 ONE_TIME MONTHLY USD CREDIT -10.6300000000 LATEST AUTO_WEBAPP_NEW - One Time - Flat Rate Price - One Time Fee 2494 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE Sales Tax 2495 6.3000000000 1.0000000000 0.6300000000 TAX ``` --- # Other subscription-related API methods The AppDirect Billing API supports several additional methods for managing your subscription once it has been created or changed. There is a brief description of these methods below. ## List company subscriptions[​](#list-company-subscriptions "Direct link to List company subscriptions") Returns a list of subscriptions for the specified company. URL endpoint: /api/billing/v1/companies/\/subscriptions Method: GET Parameters: \ the ID assigned by the channel to identify each company HTTP Status Code: 200 OK Return list of subscriptions matching criteria; 404 Not Found if company with that id is not present in the system. ## List user subscriptions[​](#list-user-subscriptions "Direct link to List user subscriptions") Returns a list of subscriptions for the specified user. URL endpoint: /api/billing/v1/companies/\/users/\/subscriptions Method: GET Parameters: \ the ID assigned by the channel to identify each company, \ the ID assigned by the channel to identify each user HTTP Status Code: 200 OK Return list of subscriptions matching criteria; 404 Not Found if company, or user, with that id is not present in the system. ## Read subscription[​](#read-subscription "Direct link to Read subscription") Returns the details of a single payment instrument URL endpoint: /api/billing/v1/subscriptions/\ Method: GET Parameters: \ The unique identifier assigned to the subscription by the channel HTTP Status Codes: 200 OK Return payment instrument; 404 Not Found if the payment instrument with that id is not present in the system. ## Cancel subscription[​](#cancel-subscription "Direct link to Cancel subscription") Cancels a subscription URL endpoint: /api/billing/v1/subscriptions/\ Method: DELETE Parameters: \ The unique identifier assigned to the subscription by the channel HTTP Status Codes: 204 No Content subscription deleted, 404 Not Found if subscription is not present in the system --- # Products, payment plans and discounts In order to understand what products are available for purchase, what editions each of these products offer, and the discounts available for these products, it is important to know about a few more AppDirect API methods. The methods described below will allow you to get the paymentPlanId and discountId necessary to create a subscription through the API.  Note that these ids are also available through the UI. ## Read product list[​](#read-product-list "Direct link to Read product list") The Product Listing API returns all products within the marketplace catalog and information about respective products.  URL endpoint: /api/marketplace/v1/listing Method: GET Parameters: You can use all supported parameters in combination, as in this example that combines 'q' and 'count' -- | Parameter | Description | | --------- | --------------------------------------------------------------------------------------------------------------------------- | | type | Set of: WEB\_APP, WEB\_APP\_MANUAL\_SETUP, TEMPLATE, DESIGN\_ELEMENT, MODULE, EMBEDDED\_VIDEO, BUNDLE, DOWNLOADABLE\_BUNDLE | | filters | Set of: FEATURED, POPULAR, STAFFPICK, FREE, PAID | | order | Order of which apps will be displayed. One of: NEWEST\_FIRST, ALPHABETICAL, POPULARITY | | count | Number of products returned | | c | Query category IDs | | s | Query subcategory IDs | | i | Query customer IDs | | a | Query attribue IDs | | q | Query search string | HTTP Status Codes: 200 OK on success ## Read product profile[​](#read-product-profile "Direct link to Read product profile") The Product Profile API returns the full details of a product in order to show the product profile on the marketplace.  URL endpoint: /api/marketplace/v1/products/\ Method: GET Parameters: \ the unique product identifier provided by the channel HTTP Status Codes: 200 OK on success; 404 Not Found if no product with the specified productId exists in the system. ## List discounts[​](#list-discounts "Direct link to List discounts") The Discount Listing API returns all discounts available within the marketplace. Additional information can be found [here](/rest.md#tag/Discount/operation/resource_Other_readDiscounts_GET). URL endpoint: /api/channel/v1/discounts Method: GET Parameters: The optional parameters are shown below. | Parameter | Description | | --------- | ----------------------------------------------------------------------------------------------- | | code | 4-255 characters | | sortField | CODE, APPLICATION, REDEMPTIONS, START\_DATE, END\_DATE, or CREATED\_ON; defaults to CREATED\_ON | | sortOrder | ASC or DESC; defaults to ASC | | start | Integer values; defaults to 0 | | count | 0-250; defaults to 250 | HTTP Status Codes: 200 OK on success --- # Supported request attributes | Request Field | Format | Required | Description | | --------------------- | ----------- | -------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | String | Yes | The unique identifier for the subscription provided by AppDirect. | | order | Object | Yes | The order information for the subscription to create (or change to). | | order.paymentPlanId | String | Yes | The unique identifier for the edition pricing for which a subscription is being created. | | order.discountId | String | No | The unique identifier for the discount to be applied to the subscription. | | order.orderLines | Array | Yes, if order line item information is required by the edition | An array of orderLine objects representing the subscription information. This information is required in cases where additional information is required by the edition. An example of this would be an edition that has individual unit pricing ("price per unit"), so information about the desired number of units must be passed. | | orderLines.orderLine | Object | Yes | An object containing information about one line of the subscription order. | | orderLine.type | String Enum | No | The type of order line item; can be ITEM, TAX, PENALTY, or DISCOUNT. | | orderLine.unit | String Enum | No | The unit type of order line item; can be USER, GIGABYTE, MEGABYTE, HOUR, MINUTE, INVOICE, UNIT, PROJECT, PROPERTY, ITEM, WORD, EMAIL, CONTACT, CALL, CREDIT, ROOM, HOST, AGENT, OPERATOR, PROVIDER, MANAGER, TESTER, JVM, SERVER, WEB\_USE\_MINUTE, AUDIO\_USE\_MINUTE, PIECE, EMPLOYEE\_PAY\_PERIOD, COMPUTER, NOT\_APPLICABLE, ONE\_TIME\_SETUP, DATA\_POINTS, TIER1\_API\_CALLS, TIER2\_API\_CALLS, ADVISORY\_HOURS, OVERAGE\_AUDIO\_MINUTE, EMPLOYEE, CONNECTION, PUSH\_USER, THOUSAND\_EMAILS\_PER\_DAY, PUSH\_NOTIFICATION\_DEVICES, API\_CALLS, SMS\_TEXT\_MESSAGE, CONTACTS\_1000, CONTRACT\_FEE, TRANSFER\_FEE, REACTIVATION\_FEE, RECIPIENT, ADDITIONAL\_1000\_CONTACTS\_BLOCK, SCHEDULE\_PLAN, EMAILS\_1000, MOBILE\_DEVICE, PAYSLIP, PAYSLIP\_CORRECTION, STORE, WEBSITE, EPAPER, PAGE, POSTAGE\_AND\_PRINT, INTERNATIONAL\_POSTAGE\_AND\_PRINT, TIER1\_TOP\_LEVEL\_DOMAIN, TIER2\_TOP\_LEVEL\_DOMAIN, DEDICATED\_IP, ENABLELCM, MAXCOMPONENTS, DATA\_MANAGEMENT\_USER, SPECIALIST\_USER, PROFESSIONAL\_USER, MATERIALITY\_MATRIX, STAKEHOLDER\_MANAGEMENT, SCORECARD, STANDARD\_MAPPING, DONATION\_MANAGEMENT, DOCUMENT, PACKAGE\_SMALL, PACKAGE\_LARGE, MEMBER, ATTENDEE, MAILING, RESPONSE, EXTERNAL\_INVOICE\_FEE, CLIENT\_TEST, IMAGE\_TRANSFORMATION, TOTAL\_IMAGE, LICENSE, MAILBOX, FREE\_40\_INCH\_HDTV\_PC, FREE\_46\_INCH\_HDTV\_PC, FREE\_46\_INCH\_HDTV\_PC\_MOUNTING, EMPLOYEE\_PER\_WEEK, REGISTER, END\_USER, CORE, DEVICE, PORT, MEASURER, PUBLISHED\_MEASUREMENT, NODE, SERVER\_RULE, VPN\_LP, PROXY\_LP, DESKTOP\_CONNECT\_LP, CAMERA, MAIN\_SOUND\_ZONE, SUB\_SOUND\_ZONE, POST, REPORT, BOX, SESSION, DISPLAY, TRUCKROLL, TRANSACTION\_FEE, SENDING\_API\_CALL, LOOKUP\_API\_CALL, or ANALYTICS\_API\_CALL. | | orderLine.quantity | Numeric | No | The quantity for order line item. | | orderLine.price | Numeric | No | The price per unit for order line item. | | orderLine.percentage | Numeric | No | The percentage (e.g., tax) associated with order line item. | | orderLine.totalPrice | Numeric | No | The total price for order line item. | | orderLine.description | String | No | The description of order line item. | | order.parameters | Array | No | An array of optional parameters required in order to create a subscription to a product. Some products will require additional information that can be passed through this attribute. | | parameters.name | String | Yes, if parameters are used | The name of the parameter to be passed. | | parameters.value | String | Yes, if parameters are used | The value of the parameter to be passed. | --- # Supported response attributes | Response Field | Format | Description | | ------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | String | The unique identifier assigned to the subscription by the channel. This is the identifier that should be used in subsequent subscription API calls. | | creationDate | String | The date on which the subscripton was created. | | endDate | String | The end date for the subscription (e.g., in the case of a contract); may be NULL. | | externalAccountId | String | The identifier for the external (to the channel) account. | | status | String Enum | The status of the subscription order; can be INITIALIZED, PENDING\_USER\_APPROVAL, PENDING\_REMOTE\_CREATION, FREE\_TRIAL, ACTIVE, FINISHED, ONE\_TIME, CANCELLED, SUSPENDED, FREE\_TRIAL\_EXPIRED, FREE\_TRIAL\_CANCELLED, DELETED, FAILED, UPCOMING, PENDING\_MIGRATION\_ACTIVATION. | | maxUsers | Numeric | The maximum number of users allowed for the subscription. | | order | Object | The order information for the subscription that was created. | | order.paymentPlanId | String | The unique identifier for the edition pricing for which a subscription is being created. | | order.discountId | String | The unique identifier for the discount to be applied to the subscription. | | order.activated | boolean | True if the subscription has been activated. | | order.paymentPlan | Object | An object representing the payment plan for this subscription. | | paymentPlan.id | String | The identifier for the payment plan created by the channel. | | paymentPlan.href | String | The link to the payment plan. | | paymentPlan.uuid | String | The unique identifier for the payment plan. | | paymentPlan.frequency | String | The frequency of billing; may be ONE\_TIME, MONTHLY, QUARTERLY, SIX\_MONTHS, YEARLY, TWO\_YEARS, THREE\_YEARS, or DAILY. | | paymentPlan.contract | Object | An object containing contract information for the payment plan. | | contract.minimumServiceLength | Numeric | The minimum service length specified by the contract. | | contract.cancellationPeriodLimit | Numeric | The cancellation period limit specified by the contract. | | contract.endOfContractGracePeriod | Numeric | The grace period allowed at the end of the contract. | | contract.blockSwitchToShorterContract | Boolean | True if the contract blocks changing to a shorter contract. | | contract.blockContractDowngrades | Boolean | True if the contract blocks contract downgrades. | | contract.blockContractUpgrades | Boolean | True if the contract blocks contract upgrades. | | contract.autoExtensionPricingId | Numeric | The identifier for the pricing plan for the contract autoextension, if applicable. | | contract.gracePeriod | Object | An object representing the contract grace period. | | gracePeriod.length | Numeric | The length of the grace period specified by the contract. | | gracePeriod.unit | String | The units for the grace period length specified by the contract. | | contract.terminationFee | Object | An object representing the contract termination fee. | | terminationFee.type | String Enum | The termination fee type; can be NONE, PERCENTAGE, or FLAT\_RATE. | | terminationFee.description | String | The termination fee description. | | terminationFee.percentageFee | Numeric | The percentage to charge for the termination fee. | | terminationFee.flatFee | Object | An object representing the flat fee to charge for the termination fee; this will contain an entry for each supported currency for the product. | | paymentPlan.allowCustomUsage | Boolean | True if custom usage is allowed for the subscription. | | paymentPlan.keepBillDateOnUsageChange | Boolean | True if the billling date doesn't change on usage changes to the subscription. | | paymentPlan.separatePrepaid | Boolean | True if prepayment is separate. | | paymentPlan.isPrimaryPrice | Boolean | True if this is the primary price for the subscription. | | paymentPlan.costs | Array | An array of objects containing cost information. | | costs.cost | Object | An object containing cost information. | | cost.amount | Object | An object representing the cost amount; this will contain an entry for each supported currency for the product. | | cost.pricePerIncrement | Boolean | True if the price applies per increment. | | cost.blockContractDecrease | Boolean | True if the contract blocks a contract decrease in cost. | | cost.blockContractIncrease | Boolean | True if the contract blocks a contract increase in cost. | | cost.blockOriginalContractDecrease | Boolean | True if the contract blocks a decrease in cost from the original contract. | | cost.unit | String Enum | The unit for the contract cost. See orderLine.unit for valid units. | | cost.unitDependency | String | The unit dependency for the contract cost. | | cost.minUnits | Numeric | The minimum units allowed. | | cost.maxUnits | Numeric | The maximum units allowed. | | cost.meteredUsage | Boolean | True if the cost is for metered usage. | | cost.increment | Numericm | The increment the cost applies to. | | paymentPlan.discount | Object | An object containing the discount information. | | discount.amount | Object | An object representing the discount amount; this will contain an entry for each supported currency for the product. | | discount.description | String | The discount description. | | discount.percentage | Numeric | The percentage discount. | | discount.numOfBillingCycles | Numeric | The number of billing cycles the discount applies to. | | discount.availableRedemptions | Numeric | The number of times remaining the discount can be applied. | | discount.startDate | String | The start date of the discount. | | discount.expirationDate | String | The expiration date of the discount. | | order.contract | Object | An object representing the contract for this subscription, if applicable. | | contract.minimumServiceLength | Numeric | The minimum service length specified by the contract. | | contract.cancellationPeriodLimit | Numeric | The cancellation period limit specified by the contract. | | contract.endOfContractGracePeriod | Numeric | The grace period allowed at the end of the contract. | | contract.endOfContractDate | String | The end date of the contract. | | contract.gracePeriodEndDate | String | The end date of the contract grace period. | | contract.terminationFee | Object | An object representing the contract termination fee. | | terminationFee.type | String Enum | The termination fee type; can be NONE, PERCENTAGE, or FLAT\_RATE. | | terminationFee.description | String | The termination fee description. | | terminationFee.percentage | Numeric | The percentage to charge for the termination fee. | | terminationFee.price | Object | An object representing the flat fee price to charge for the termination fee; this will contain an entry for each supported currency for the product. | | contract.renewal | Object | An object representing the contract renewal. | | renewal.order | String | A link to the contract renewal rder. | | renewal.paymentPlan | String | TA link to the contract renewal payment plan. | | order.previousOrder | String | A link to the previous order. | | order.nextOrder | String | A link to the next order. | | order.discount | String | A link to the discount. | | order.orderLines | Array | An array of orderLine objects representing the subscription information. This information is required in cases where additional information is required by the edition. An example of this would be an edition that has individual unit pricing ("price per unit"), so information about the desired number of units must be passed. | | orderLines.orderLine | Object | An object containing information about one line of the subscription order. | | orderLine.type | String Enum | The type of order line item; can be ITEM, TAX, PENALTY, or DISCOUNT. | | orderLine.unit | String Enum | The unit type of order line item; can be USER, GIGABYTE, MEGABYTE, HOUR, MINUTE, INVOICE, UNIT, PROJECT, PROPERTY, ITEM, WORD, EMAIL, CONTACT, CALL, CREDIT, ROOM, HOST, AGENT, OPERATOR, PROVIDER, MANAGER, TESTER, JVM, SERVER, WEB\_USE\_MINUTE, AUDIO\_USE\_MINUTE, PIECE, EMPLOYEE\_PAY\_PERIOD, COMPUTER, NOT\_APPLICABLE, ONE\_TIME\_SETUP, DATA\_POINTS, TIER1\_API\_CALLS, TIER2\_API\_CALLS, ADVISORY\_HOURS, OVERAGE\_AUDIO\_MINUTE, EMPLOYEE, CONNECTION, PUSH\_USER, THOUSAND\_EMAILS\_PER\_DAY, PUSH\_NOTIFICATION\_DEVICES, API\_CALLS, SMS\_TEXT\_MESSAGE, CONTACTS\_1000, CONTRACT\_FEE, TRANSFER\_FEE, REACTIVATION\_FEE, RECIPIENT, ADDITIONAL\_1000\_CONTACTS\_BLOCK, SCHEDULE\_PLAN, EMAILS\_1000, MOBILE\_DEVICE, PAYSLIP, PAYSLIP\_CORRECTION, STORE, WEBSITE, EPAPER, PAGE, POSTAGE\_AND\_PRINT, INTERNATIONAL\_POSTAGE\_AND\_PRINT, TIER1\_TOP\_LEVEL\_DOMAIN, TIER2\_TOP\_LEVEL\_DOMAIN, DEDICATED\_IP, ENABLELCM, MAXCOMPONENTS, DATA\_MANAGEMENT\_USER, SPECIALIST\_USER, PROFESSIONAL\_USER, MATERIALITY\_MATRIX, STAKEHOLDER\_MANAGEMENT, SCORECARD, STANDARD\_MAPPING, DONATION\_MANAGEMENT, DOCUMENT, PACKAGE\_SMALL, PACKAGE\_LARGE, MEMBER, ATTENDEE, MAILING, RESPONSE, EXTERNAL\_INVOICE\_FEE, CLIENT\_TEST, IMAGE\_TRANSFORMATION, TOTAL\_IMAGE, LICENSE, MAILBOX, FREE\_40\_INCH\_HDTV\_PC, FREE\_46\_INCH\_HDTV\_PC, FREE\_46\_INCH\_HDTV\_PC\_MOUNTING, EMPLOYEE\_PER\_WEEK, REGISTER, END\_USER, CORE, DEVICE, PORT, MEASURER, PUBLISHED\_MEASUREMENT, NODE, SERVER\_RULE, VPN\_LP, PROXY\_LP, DESKTOP\_CONNECT\_LP, CAMERA, MAIN\_SOUND\_ZONE, SUB\_SOUND\_ZONE, POST, REPORT, BOX, SESSION, DISPLAY, TRUCKROLL, TRANSACTION\_FEE, SENDING\_API\_CALL, LOOKUP\_API\_CALL, or ANALYTICS\_API\_CALL. | | orderLine.quantity | Numeric | The quantity for order line item. | | orderLine.price | Numeric | The price per unit for order line item. | | orderLine.percentage | Numeric | The percentage (e.g., tax) associated with order line item. | | orderLine.totalPrice | Numeric | The total price for order line item. | | orderLine.description | String | The description of order line item. | | order.oneTimeOrders | Array | An array of any one time order listings. | | oneTimeOrders.oneTimeOrder | Object | An object representing a one time order. | | oneTimeOrder.paymentPlan | String | A link to the payment plan for the one time order. | | oneTimeOrder.id | String | The one time order provided by the channel. | | oneTimeOrder.startDate | String | The one time order start date. | | oneTimeOrder.endDate | String | The one time order end date. | | oneTimeOrder.nextBillingDate | String | The next billing date for the one time order. | | oneTimeOrder.endOfDiscountDate | String | The end date for the one time order discount, if applicable. | | oneTimeOrder.status | String Enum | The status of the subscription order; can be INITIALIZED, PENDING\_USER\_APPROVAL, PENDING\_REMOTE\_CREATION, FREE\_TRIAL, ACTIVE, FINISHED, ONE\_TIME, CANCELLED, SUSPENDED, FREE\_TRIAL\_EXPIRED, FREE\_TRIAL\_CANCELLED, DELETED, FAILED, UPCOMING, PENDING\_MIGRATION\_ACTIVATION. | | oneTimeOrder.frequency | String | The frequency of billing, in this case ONE\_TIME. | | oneTimeOrder.currency | String | The currency for the one time order; may be USD, CAD, EUR, JPY, GBP, KRW, CHF, SEK, SGD, MYR, AUD, MXN, INR, BRL, DKK, NZD, NOK, ZAR, PHP | | oneTimeOrder.type | String | The subscription type for the one time order; may be NEW, MIGRATION, ADOPTION, METERED\_USAGE, FREE\_TRIAL\_ACTIVATION, BUNDLED, TERMINATION\_FEE, END\_OF\_CONTRACT\_MIGRATION, REFUND, CREDIT, ONE\_TIME\_FEE, ADDITIONAL\_FEE. | | oneTimeOrder.totalPrice | Numeric | The total price of the one time order. | | oneTimeOrder.user | String | A link to the user to which the one time order is associated. | | oneTimeOrder.salesSupportUser | String | A link to the sales support user to which the one time order is associated. | | oneTimeOrder.company | String | A link to the company to which the one time order is associated. | | order.parameters | Array | An array of optional parameters required in order to create a subscription to a product. Some products will require additional information that can be passed through this attribute. | | parameters.name | String | The name of the parameter to be passed. | | parameters.value | String | The value of the parameter to be passed. | --- # Use cases Once a subscription has been created, you may change the subscription through the AppDirect API. Doing so is the equivalent of updating an edition through the AppDirect UI. Note that the user updating the subscription does not necessarily have to be the original purchaser of the product. It can be another user with the appropriate permissions. Doing so through the API, of course, requires channel admin access. When a subscription is changed, it can be changed to a different edition of the same product. It can be upgraded or downgraded, say to add or remove users (or any other unit associated with the edition) respectively. If the subscription is a free trial, you may upgrade it to a paid. If nothing about the subscription is changed on the change subscription call, the call will return a 409 Conflict, indicating the user is trying to change to an identical subscription. --- # Create payment instruments A payment instrument is created through the UI when a user purchases a product through an AppDirect-powered marketplace. Creating a payment instrument is the equivalent to entering billing details on purchase through the UI as shown below. ![](/assets/images/bag-billingdetails-9ce096985d314b35c1fc79f4f4ac76e0.png) A payment instrument is required if you are creating a subscription for a paid product. Once you have a created company and a user, you can create a payment instrument through the AppDirect Billing API. AppDirect supports an OAuth-authenticated REST interface that allows API users to read, create, edit, and delete marketplace records that describe a payment instrument. These functions are all part of the Billing API, which is invokable through standard HTTP methods (GET, POST, PUT, and DELETE) using standard REST conventions. All calls to the Billing API occur under its endpoint URL, . You must create a payment instrument before you can create subscriptions via the Billling API. --- # Additional payment instrument creation examples ## Creating a payment instrument with all attributes[​](#creating-a-payment-instrument-with-all-attributes "Direct link to Creating a payment instrument with all attributes") Below is an example of creating a payment instrument passing all supported attributes. **Request** * JSON ``` { "id": "ecec3635-7989-4c6f-91a6-a940e9093b78", "paymentMethod": "CREDIT_CARD", "billingAddress": { "firstName": "Dev, "lastName": "User", "street1": "123 Fake St.", "street2": "floor 2", "city": "Somerville", "country": "US", "state": "MA", "zip": "02114", "phone": "(508)-213-1534", "phoneExtension": "x787", "fax": "(508)-253-1334", "faxExtension": "x727" }, "accountDisplay": "1111", "creditCard": { "name": "Bob Jones", "number": "4111111111111111", "expirationMonth": "12", "expirationYear": "2020", "securityCode": "111" }, "isDefault": "true", "parameters":{ "issuer":"Citibank", "maskedPan":"*************111" } } ``` * XML ``` ecec3635-7989-4c6f-91a6-a940e9093b78 CREDIT_CARD Dev User 123 Fake St. floor 2 Somerville US MA 02114 (508)-213-1534 x787 (508)-253-1334 x727 1111 Bob Jones 4111111111111111 12 2020 111 true Citibank *************111 ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 568 Content-Type: application/xml;charset=UTF-8 Date: Tue, 11 Aug 2015 16:25:17 GMT Expires: 0 Location: http://www.appdirect.com/api/billing/v1/paymentInstruments/0c3a9e49-cdb9-46ac-b42b-142b09111932 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "0c3a9e49-cdb9-46ac-b42b-142b09111932", "company": { "-id": "2e983f07-99d1-46cd-920a-dd0c8de5bc48", "-href": "http://www.appdirect.com/api/account/v1//companies/2e983f07-99d1-46cd-920a-dd0c8de5bc48" }, "user": { "-id": "5019a0a6-a1e3-4d6a-85d3-6b6993afe96d", "-href": "http://www.appdirect.com/api/account/v1//users/5019a0a6-a1e3-4d6a-85d3-6b6993afe96d" }, "accountDisplay": "1111", "paymentMethod": "CREDIT_CARD", "billingAddress": { "city": "Somerville", "country": "US", "state": "MA", "street1": "123 Fake St.", "street2": "floor 2", "zip": "02114", "firstName": "Dev", "lastName": "User", "phone": "(508)-213-1534", "phoneExtension": "x787", "fax": "(508)-253-1334", "faxExtension": "x727" }, "creditCard": { "expirationMonth": "12", "expirationYear": "2020", "type": "VISA" }, "createdOn": "2015-08-11T10:25:17.474-06:00", "isDefault": "true", "parameters":{ "issuer":"Citibank", "maskedPan":"*************111" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 568 Content-Type: application/xml;charset=UTF-8 Date: Tue, 11 Aug 2015 16:25:17 GMT Expires: 0 Location: http://www.appdirect.com/api/billing/v1/paymentInstruments/0c3a9e49-cdb9-46ac-b42b-142b09111932 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 0c3a9e49-cdb9-46ac-b42b-142b09111932 1111 CREDIT_CARD Somerville US MA 123 Fake St. floor 2 02114 Dev User (508)-213-1534 x787 (508)-253-1334 x727 12 2020 VISA 2015-08-11T10:25:17.474-06:00 true ``` ## Creating a payment instrument with several attributes[​](#creating-a-payment-instrument-with-several-attributes "Direct link to Creating a payment instrument with several attributes") Below is an example of creating a payment instrument passing several commonly used attributes. **Request** * JSON ``` { "paymentMethod": "CREDIT_CARD", "billingAddress": { "firstName": "Dev", "lastName": "User, "street1": "123 Fake St.", "street2": "floor 2", "city": "Somerville", "country": "US", "state": "MA", "zip": "02114", "phone": "(508)-213-1534", "phoneExtension": "x787" }, "accountDisplay": "1111", "creditCard": { "name": "Bob Jones", "number": "4111111111111111", "expirationMonth": "12", "expirationYear": "2020", "securityCode": "111" }, "isDefault": "true" } ``` * XML ``` CREDIT_CARD Dev User 123 Fake St. floor 2 Somerville US MA 02114 (508)-213-1534 x787 1111 Bob Jones 4111111111111111 12 2020 111 true ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 568 Content-Type: application/xml;charset=UTF-8 Date: Tue, 11 Aug 2015 16:25:17 GMT Expires: 0 Location: http://www.appdirect.com/api/billing/v1/paymentInstruments/0c3a9e49-cdb9-46ac-b42b-142b09111932 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "0c3a9e49-cdb9-46ac-b42b-142b09111932", "company": { "-id": "2e983f07-99d1-46cd-920a-dd0c8de5bc48", "-href": "http://www.appdirect.com/api/account/v1//companies/2e983f07-99d1-46cd-920a-dd0c8de5bc48" }, "user": { "-id": "5019a0a6-a1e3-4d6a-85d3-6b6993afe96d", "-href": "http://www.appdirect.com/api/account/v1//users/5019a0a6-a1e3-4d6a-85d3-6b6993afe96d" }, "accountDisplay": "1111", "paymentMethod": "CREDIT_CARD", "billingAddress": { "city": "Somerville", "country": "US", "state": "MA", "street1": "123 Fake St.", "street2": "floor 2", "zip": "02114", "firstName": "Dev", "lastName": "User", "phone": "(508)-213-1534", "phoneExtension": "x787" }, "creditCard": { "expirationMonth": "12", "expirationYear": "2020", "type": "VISA" }, "createdOn": "2015-08-11T10:25:17.474-06:00", "isDefault": "true" } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 568 Content-Type: application/xml;charset=UTF-8 Date: Tue, 11 Aug 2015 16:25:17 GMT Expires: 0 Location: http://www.appdirect.com/api/billing/v1/paymentInstruments/0c3a9e49-cdb9-46ac-b42b-142b09111932 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 0c3a9e49-cdb9-46ac-b42b-142b09111932 1111 CREDIT_CARD Somerville US MA 123 Fake St. floor 2 02114 Dev User (508)-213-1534 x787 12 2020 VISA 2015-08-11T10:25:17.474-06:00 true ``` ## Creating a payment instrument missing required data[​](#creating-a-payment-instrument-missing-required-data "Direct link to Creating a payment instrument missing required data") Below is an example of creating a payment instrument with a bad request caused by missing required data, specifically the credit card field. **Request** * JSON ``` { "paymentMethod":"CREDIT_CARD", "billingAddress":{ "firstName":"Demo", "lastName":"User", "street1":"50 Grove St", "city":"Somerville", "country":"US", "state":"MA", "zip":"02114", "phone":"4159991100" } } ``` * XML ``` CREDIT_CARD Demo User 50 Grove St Somerville US MA 02114 4159991100 ``` **Response** * JSON ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 144 Content-Type: application/xml;charset=UTF-8 Date: Tue, 11 Aug 2015 04:31:28 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=BA90F20336DFCBAB0F115B26AF3457B7; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "CREDIT_CARD_MISSING", "message": "Credit Card is missing." } ``` * XML ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 144 Content-Type: application/xml;charset=UTF-8 Date: Tue, 11 Aug 2015 04:31:28 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=BA90F20336DFCBAB0F115B26AF3457B7; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff CREDIT_CARD_MISSING Credit Card is missing. ``` ## Creating a payment instrument with a bad request[​](#creating-a-payment-instrument-with-a-bad-request "Direct link to Creating a payment instrument with a bad request") Below is an example of creating a payment instrument with a bad request. In this case, the JSON object is missing a comma, while the XML is missing a closing tag. **Request** * JSON ``` { "paymentMethod":"CREDIT_CARD" "billingAddress":{ "firstName":"Demo", "lastName":"User", "street1":"50 Grove St", "city":"Somerville", "country":"US", "state":"MA", "zip":"02114", "phone":"4159991100" }, "creditCard":{ "name":"Demo User", "number":"4111111111111111", "expirationMonth":"5", "expirationYear":"2017", "securityCode":111, "type":"VISA" } } ``` * XML ``` lt;paymentInstrument> CREDIT_CARD Demo User 50 Grove St Somerville US MA 02114 4159991100 Demo User 4111111111111111 5 2017 111 VISA ``` **Response** * JSON ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 120 Content-Type: application/json;charset=UTF-8 Date: Tue, 11 Aug 2015 12:34:55 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=F7C61C4351EE8174CB05E22F15FF1B99; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "Bad Request", "message": "Unexpected character ('"' (code 34)): was expecting comma to separate OBJECT entries" } ``` * XML ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 133 Content-Type: text/xml;charset=UTF-8 Date: Tue, 11 Aug 2015 12:38:55 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff Bad Request HTTP 400 Bad Request ``` ## Creating a payment instrument that already exists[​](#creating-a-payment-instrument-that-already-exists "Direct link to Creating a payment instrument that already exists") Below is an example of creating a payment instrument for a user that already has an existing default payment instrument. **Request** * JSON ``` { "paymentMethod":"CREDIT_CARD", "billingAddress":{ "firstName":"Demo", "lastName":"User", "street1":"50 Grove St", "city":"Somerville", "country":"US", "state":"MA", "zip":"02114", "phone":"4159991100" }, "creditCard":{ "name":"Demo User", "number":"4111111111111111", "expirationMonth":"5", "expirationYear":"2017", "securityCode":111, "type":"VISA" } } ``` * XML ``` CREDIT_CARD Demo User 50 Grove St Somerville US MA 02114 4159991100 Demo User 4111111111111111 5 2017 111 VISA ``` **Response** * JSON ``` Status Code: 409 Conflict Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 175 Content-Type: application/xml;charset=UTF-8 Date: Mon, 10 Aug 2015 16:09:40 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=EF55CB7ED3B901B9617F04C5D621ADB4; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "PAYMENT_INSTRUMENT_ALREADY_EXIST", "message": "Default paymentInstrument already exists." } ``` * XML ``` Status Code: 409 Conflict Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 175 Content-Type: application/xml;charset=UTF-8 Date: Mon, 10 Aug 2015 16:09:40 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=EF55CB7ED3B901B9617F04C5D621ADB4; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff PAYMENT_INSTRUMENT_ALREADY_EXIST Default paymentInstrument already exists. ``` --- # Creating a payment instrument Once you have a created company and added a user to the company, you can create a payment instrument for that user. To do so, you will need the unique company identifier returned in the create company response and the unique user identifier returned in the create user response. The unique identifier for your new payment instrument will be returned in the response (shown in the example below). This identifier will be used in calls to create subscriptions, as well as for managing subscriptions. If no payment instrument exists yet for the user and company pair, a payment instrument will be created and set to be the default. If a payment instrument does exist, but has a different payment method and is set to be the default, a payment instrument will be created and set to the is\_default setting passed in the request. If no is\_default setting is provided in the request, the value will be set to 'N', indicating it is not the default payment instrument. If the payment instrument exists for the given user and company pair, regardless of whether or not it is set to be the default, you will receive a 409 Conflict response, indicating the payment instrument already exists. URL endpoint: `/billing/v1/companies/{companyId}/users/{userId}/paymentInstruments` Method: POST Parameters: * companyId - The unique identifier for the company provided by the channel. This id can be obtained either from the response returned when the company is created via the API, or by using the API to list the companies in order to view the id for your company. * userId - The unique identifier for the user provided by the channel. This id can be obtained either from the response returned when the user is created via the API, or by using the API to list the users for the company in order to view the id for the user. * A valid JSON or XML object with payment instrument data HTTP status codes | HTTP Status Code | Description | | ---------------- | ----------------------------------------------------------------------------------- | | 201 Created | The payment instrument was created. | | 400 Bad Request | Some required fields were not received. | | 404 Not Found | The specified company or user was not found. | | 409 Conflict | The specified payment instrument already exists for the specified company and user. | Below is an example of the most basic payment instrument creation request and response. Additional examples are provided in the example section of this document. **Request** * JSON ``` POST https://appdirect.com/api/billing/v1/companies/d7a773af-e216-4127-969d-eaf99d5d9cd2/users/f86e98b7-7749-4b26-adef-bc1a2ced873f/paymentInstruments Host: www.appdirect.com Authorization OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="VeJO1tP7RKUE1rz", oauth_timestamp="1438728054", oauth_consumer_key="appdirect-91", oauth_signature="xy37tmDbpwuIHZJIioRSB3GGAhM%3D" Content-Type application/json { "paymentMethod":"CREDIT_CARD", "billingAddress":{ "firstName":"Demo", "lastName":"User", "street1":"50 Grove St", "city":"Somerville", "country":"US", "state":"MA", "zip":"02114", "phone":"4159991100" }, "creditCard":{ "name":"Demo User", "number":"4111111111111111", "expirationMonth":"5", "expirationYear":"2017", "securityCode":111, "type":"VISA" } } ``` * XML ``` POST https://appdirect.com/api/billing/v1/companies/d7a773af-e216-4127-969d-eaf99d5d9cd2/users/f86e98b7-7749-4b26-adef-bc1a2ced873f/paymentInstruments Host: www.appdirect.com Authorization OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="VeJO1tP7RKUE1rz", oauth_timestamp="1438728054", oauth_consumer_key="appdirect-91", oauth_signature="xy37tmDbpwuIHZJIioRSB3GGAhM%3D" Content-Type application/xml CREDIT_CARD Demo User 50 Grove St Somerville US MA 02114 4159991100 Demo User 4111111111111111 5 2017 111 VISA ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 887 Content-Type: application/xml;charset=UTF-8 Date: Tue, 11 Aug 2015 15:46:15 GMT Expires: 0 Location: http://www.appdirect.com/api/billing/v1/paymentInstruments/2d54fbc8-6c35-4438-ad8e-d9c9768aaa6a Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "2d54fbc8-6c35-4438-ad8e-d9c9768aaa6a", "company": { "-id": "2e983f07-99d1-46cd-920a-dd0c8de5bc48", "-href": "http://www.appdirect.com/api/account/v1//companies/2e983f07-99d1-46cd-920a-dd0c8de5bc48" }, "user": { "-id": "5019a0a6-a1e3-4d6a-85d3-6b6993afe96d", "-href": "http://www.appdirect.com/api/account/v1//users/5019a0a6-a1e3-4d6a-85d3-6b6993afe96d" }, "paymentMethod": "CREDIT_CARD", "billingAddress": { "city": "Somerville", "country": "US", "state": "MA", "street1": "50 Grove St", "zip": "02114", "firstName": "Demo", "lastName": "User", "phone": "4159991100" }, "creditCard": { "expirationMonth": "5", "expirationYear": "2017", "type": "VISA" }, "createdOn": "2015-08-11T09:46:15.628-06:00", "isDefault": "false" } ``` -XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 887 Content-Type: application/xml;charset=UTF-8 Date: Tue, 11 Aug 2015 15:46:15 GMT Expires: 0 Location: http://www.appdirect.com/api/billing/v1/paymentInstruments/2d54fbc8-6c35-4438-ad8e-d9c9768aaa6a Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 2d54fbc8-6c35-4438-ad8e-d9c9768aaa6a CREDIT_CARD Somerville US MA 50 Grove St 02114 Demo User 4159991100 5 2017 VISA 2015-08-11T09:46:15.628-06:00 false ``` --- # Other payment instrument-related API methods The AppDirect Billing API supports several additional methods for managing your payment instrument once it has been created. There is a brief description of these methods below. ## List payment instruments for user[​](#list-payment-instruments-for-user "Direct link to List payment instruments for user") Returns a list of payment instruments for the specified user. URL endpoint: /api/billing/v1/companies/\/users/\/paymentInstruments Method: GET Parameters: \ the ID assigned by the channel to identify each company, \ the ID assigned by the channel to identify each user HTTP Status Code: 200 OK Return list of payment instruments matching criteria; 404 Not Found if company, or user with that id is not present in the system. ## Read payment instrument[​](#read-payment-instrument "Direct link to Read payment instrument") Returns the details of a single payment instrument URL endpoint: /api/billing/v1/paymentInstruments/\ Method: GET Parameters: \ The unique identifier assigned to the payment instrument by the channel HTTP Status Codes: 200 OK Return payment instrument; 404 Not Found if the payment instrument with that id is not present in the system. ## Update payment instrument for user[​](#update-payment-instrument-for-user "Direct link to Update payment instrument for user") Updates an existing payment instrument URL endpoint: /api/billing/v1/companies/\/users/\/paymentInstruments/\ Method: PUT Parameters: \ the ID assigned by the channel to identify each company, \ the ID assigned by the channel to identify each user, \ the ID assigned by the channel to identify each payment instrument, a valid JSON or XML object containing payment instrument data HTTP Status Codes: 200 OK payment instrument updated, 404 Not Found if company, user, or payment instrument with that id is not present in the system. ## Delete payment instrument[​](#delete-payment-instrument "Direct link to Delete payment instrument") Removes the payment instrument. URL endpoint: /api/billing/v1/paymentInstruments/\ Method: DELETE Parameters: \ The unique identifier assigned to the payment instrument by the channel HTTP Status Codes: 204 No Content payment instrument removed, 404 Not Found if payment instrument is not present in the system --- # Supported request attributes | Request Field | Format | Required | Description | | ----------------------------- | ----------- | ------------------------------------------------------- | --------------------------------------------------------------------------------- | | uuid | String | Yes, only required if the partner is using external IDs | The unique identifier for payment instrument. | | billingAddress | Object | Yes | The billing address information for the user | | billingAddress.salutation | String Enum | No | The user's salutation, may be MR, MS, or COMPANY | | billingAddress.firstName | String | Yes | The user’s first name on their billing address | | billingAddress.lastName | String | Yes | The user's last name on their billing address | | billingAddress.fullName | String | No | The user's full name on their billing address | | billingAddress.companyName | String | No | The name of the user's company on their billing address | | billingAddress.phoneNumber | String | Yes | The user's billing address phone number | | billingAddress.phoneExtension | String | No | The user's billing address phone extension | | billingAddress.faxNumber | String | No | The user's billing address fax number | | billingAddress.faxExtension | String | No | The user's billing address fax extension | | billingAddress.street1 | String | Yes, if address specified | The user's billing street address line 1 | | billingAddress.street2 | String | No | The user's billing street address line 2 | | billingAddress.city | String | Yes | The user's billing address city | | bilingAddress.state | String | Yes | The user's billing address state | | billingAddress.zip | String | Yes | The user's billing address zip code | | billingAddress.country | String | Yes | The user's billing address country | | billingAddress.pobox | String | No | The user's billing address post office box | | billingAddress.pozip | String | No | The user's billing address post office box zip code | | creditCard | Object | Yes | The user’s credit card information | | creditCard.number | String | Yes | The user’s credit card number; on request only as credit card number is not saved | | creditCard.name | String | Yes | The user’s name as it appears on the credit card | | creditCard.securityCode | String | Yes | The user’s credit card CVV code from the back of the credit card; not saved | | creditCard.expirationMonth | String | Yes | The user’s credit card expiration month | | creditCard.expirationYear | String | Yes | The user’s credit card expiration year | | creditCard.gatewayKey | String | No | The user’s gateway key | | paymentMethod | String Enum | Yes | The payment method; must be CREDIT\_CARD | | isDefault | String | No, defaults to false | If this payment instrument is default form of payment, true | | customParameters | Array | No | A list of custom parameters | --- # Supported response attributes | Response Field | Format | Description | | ----------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | String | The unique ID of the payment instrument provided by the AppDirect; available only once the payment instrument has been created | | createdOn | String | The date on which the payment instrument was created. | | user | String | A link to the user information. | | company | String | A link to the company information. | | accountDisplay | String | The secure display (e.g., last 4 digits) of the credit card number. | | billingAddress | Object | The billing address information for the user | | billingAddress.salutation | String Enum | The user's salutation, may be MR, MS, or COMPANY | | billingAddress.firstName | String | The user’s first name on their billing address | | billingAddress.lastName | String | The user's last name on their billing address | | billingAddress.fullName | String | The user's full name on their billing address | | billingAddress.companyName | String | The name of the user's company on their billing address | | billingAddress.phoneNumber | String | The user's billing address phone number | | billingAddress.phoneExtension | String | The user's billing address phone extension | | billingAddress.faxNumber | String | The user's billing address fax number | | billingAddress.faxExtension | String | The user's billing address fax extension | | billingAddress.street1 | String | The user's billing street address line 1 | | billingAddress.street2 | String | The user's billing street address line 2 | | billingAddress.city | String | The user's billing address city | | bilingAddress.state | String | The user's billing address state | | billingAddress.zip | String | The user's billing address zip code | | billingAddress.country | String | The user's billing address country | | billingAddress.pobox | String | The user's billing address post office box | | billingAddress.pozip | String | The user's billing address post office box zip code | | creditCard | Object | The user’s credit card information | | creditCard.expirationMonth | String | The user’s credit card expiration month | | creditCard.expirationYear | String | The user’s credit card expiration year | | creditCard.type | String Enum | The user’s credit card type; must be AMEX, DISCOVER, GATEWAY, JCB, MASTERCARD, STAPLESCARD, STAPLESOPENACCOUNT, or VISA | | paymentMethod | String Enum | The payment method; must be BT\_BILL, CLICKANDBUY, CLOUDFOUNDRY, CREDIT\_CARD, CUMULA\_BILL, DTAG, EXTERNAL\_INVOICE, KREDITKARTE, LASTSCHRIFT\_MRNEXNET, MANO\_TEO\_BILL, MANUAL, NETS\_ARVATO\_INVOICE, NEXTEL, PAYPAL, SNAL, TBILL, THISTLE, or TOICLEARING | | isDefault | boolean | If this payment instrument is default form of payment, true. | | customParameters | Array | A list of custom parameters | --- # Use cases Once a company and user have been created, you may create a payment instrument for the users in order to then create subscriptions through the AppDirect API. Doing so is the equivalent of paying for a product purchase through the AppDirect UI. --- # Create subscriptions A subscription represents a customer's entitlement to a product and determines their access to that product, as well as their payment schedule. Subscriptions are created when the customer places an order. Paid subscriptions wait for payment approval before creating the subscription. A subscription is created through the UI when a user purchases a product through an AppDirect-powered marketplace. ![](/assets/images/bag-purchasingapp-68d86535f27a3b2a30a239a174f477f1.png) Once you have a created company, a user, and a payment instrument for that user, you can create subscriptions (purchase products) on behalf of that user. (The payment instrument is not required for free editions of products.) Note that the unique identifier for your new subscription will be returned in the response. This identifier will be used in the calls to manage the subscription. AppDirect supports an OAuth-authenticated REST interface that allows API users to read, create, edit, and delete marketplace records that describe a subscription. These functions are all part of the Billing API, which is invokable through standard HTTP methods (GET, POST, PUT, and DELETE) using standard REST conventions. All calls to the Billing API occur under its endpoint URL, . You must create a payment instrument before you can create subscriptions via the Billling API. --- # Additional subscription creation examples Several examples of subscription creation are included below. The requests often only vary by the payment plan, which represents the edition of the product being purchased, but the responses may contain very different information depending on how the edition is configured. ## Creating a subscription with all attributes[​](#creating-a-subscription-with-all-attributes "Direct link to Creating a subscription with all attributes") Below is an example of creating a subscription passing all supported attributes. **Request** * JSON ``` { "order":{ "paymentPlanId":749, "discountId":27, "orderLines":[{ "unit":"USER", "quantity":3 }], "parameters":[{ "name":"BusinessName", "value":"API Getting Started" }, { "name":"FirstName", "value":"Billing" }, { "name":"LastName", "value":"API" }, { "name":"Address/Line1", "value":"650 California Street" }, { "name":"Address/Line2", "value":"Floor 25" }, { "name":"Address/City", "value":"San Francisco" }, { "name":"Address/State", "value":"CA" }, { "name":"Address/PostalCode", "value":"94108" }, { "name":"Address/ISO3Country", "value":"USA" }, { "name":"Address/PhoneNumber", "value":"5109289829" }, { "name":"AlternateEmail", "value":"test@test.de" }, { "name":"UserPrincipleName", "value":"testUser" }, { "name":"SubDomain", "value":"subtest.onmicrosoft.com" }, { "name":"CommunicationLanguage", "value":"en" }, { "name":"CommunicationCulture", "value":"USA" }] } } ``` * XML ``` 749 27 USER 3 BusinessName API Getting Started FirstName Billing LastName API Address/Line1 650 California Street Address/Line2 Floor 25 Address/City San Francisco Address/State CA Address/PostalCode 94108 Address/ISO3Country USA Address/PhoneNumber 5109289829 AlternateEmail test@test.de UserPrincipleName testUser SubDomain subtest.onmicrosoft.com CommunicationLanguage en CommunicationCulture USA ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1114 Content-Type: application/json;charset=UTF-8 Date: Thu, 13 Aug 2015 04:41:56 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "fd1b0164-f4c5-4f00-b853-f0392d317e48", "creationDate": "2015-08-12T22:41:55-06:00", "status": "INITIALIZED", "maxUsers": "1", "order": { "id": "1590", "startDate": "2015-08-12T00:00:00-06:00", "nextBillingDate": "2015-09-12T00:00:00-06:00", "status": "PENDING_REMOTE_CREATION", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "5.3100000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "httpw://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www.appdirect.com/api/marketplace/v1/products/93/editions/612/paymentPlans/749", "id": "749", "uuid": "eb483983-ce47-41a7-b304-e5b6bb89d818", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": [ { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10.0000000000", "CHF": "10.0000000000", "USD": "10.0000000000" } }, { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10.0000000000", "CHF": "10.0000000000", "USD": "10.0000000000" } } ] } }, "discount": { "-id": "27", "-href": "https://www.appdirect.com/api/channel/v1/discounts/27" }, "paymentPlanId": "749", "activated": "false", "orderLines": { "orderLine": [ { "description": "Office 365 Web Apps - Plan 1 - Monthly Fee", "id": "2442", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "autoApply attribute is true", "id": "2443", "price": "-5.0000000000", "quantity": "1.0000000000", "totalPrice": "-5.0000000000", "type": "DISCOUNT" }, { "description": "Sales Tax", "id": "2444", "percentage": "6.2000000000", "quantity": "1.0000000000", "totalPrice": "0.3100000000", "type": "TAX" } ] } }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "93", "-href": "https://www.appdirect.com/api/marketplace/v1/products/93" }, "edition": { "-id": "612", "-href": "https://www.appdirect.com/api/marketplace/v1/products/93/editions/612" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1114 Content-Type: application/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 04:41:56 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff fd1b0164-f4c5-4f00-b853-f0392d317e48 2015-08-12T22:41:55-06:00 INITIALIZED 1 1590 2015-08-12T00:00:00-06:00 2015-09-12T00:00:00-06:00 PENDING_REMOTE_CREATION MONTHLY USD NEW 5.3100000000 749 eb483983-ce47-41a7-b304-e5b6bb89d818 MONTHLY false false false false false false false USER 0.0000000000 false false false false false 10.0000000000 10.0000000000 10.0000000000 NOT_APPLICABLE 0.0000000000 false false false false false 10.0000000000 10.0000000000 10.0000000000 749 false Office 365 Web Apps - Plan 1 - Monthly Fee 2442 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE autoApply attribute is true 2443 -5.0000000000 1.0000000000 -5.0000000000 DISCOUNT Sales Tax 2444 6.2000000000 1.0000000000 0.3100000000 TAX ``` ## Creating a free trial subscription[​](#creating-a-free-trial-subscription "Direct link to Creating a free trial subscription") Below is an example of creating a subscription for a free trial edition. **Request** * JSON ``` { "order": { "paymentPlanId": "552" } } ``` * XML ``` 552 ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 948 Content-Type: application/xml;charset=UTF-8 Date: Wed, 12 Aug 2015 17:19:00 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "efc58da2-d957-46d7-988b-48c7419a8c58", "creationDate": "2015-08-12T11:18:59-06:00", "externalAccountId": "2217d789-bdce-4c01-bebe-431b44cab478", "status": "FREE_TRIAL", "maxUsers": "1", "order": { "id": "1585", "startDate": "2015-08-27T00:00:00-06:00", "nextBillingDate": "2015-08-27T00:00:00-06:00", "status": "FREE_TRIAL", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "0.0000000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/450/paymentPlans/552", "id": "552", "uuid": "78941742-43e6-4a85-b656-65b2727d515c", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false" }, "paymentPlanId": "552", "activated": "false", "orderLines": {[ { "description": "LATEST AUTO_WEBAPP_NEW - Free Trial 15 Days No Grace Period - Monthly Fee", "id": "2430", "price": "0.0000000000", "quantity": "1.0000000000", "totalPrice": "0.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Sales Tax", "id": "2431", "percentage": "0.0000000000", "quantity": "1.0000000000", "totalPrice": "0.0000000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78" }, "edition": { "-id": "450", "-href": "https://www.appdi/api/marketplace/v1/products/78/editions/450" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 948 Content-Type: application/xml;charset=UTF-8 Date: Wed, 12 Aug 2015 17:19:00 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff efc58da2-d957-46d7-988b-48c7419a8c58 2015-08-12T11:18:59-06:00 2217d789-bdce-4c01-bebe-431b44cab478 FREE_TRIAL 1 1585 2015-08-27T00:00:00-06:00 2015-08-27T00:00:00-06:00 FREE_TRIAL> MONTHLY USD NEW 0.0000000000 552 78941742-43e6-4a85-b656-65b2727d515c MONTHLY false false false false false false false > 552 false LATEST AUTO_WEBAPP_NEW - Free Trial 15 Days No Grace Period - Monthly Fee 2430 0.0000000000 1.0000000000 0.0000000000 ITEM NOT_APPLICABLE Sales Tax 2431 0.0000000000 1.0000000000 0.0000000000 TAX ``` ## Creating a one time flat rate subscription[​](#creating-a-one-time-flat-rate-subscription "Direct link to Creating a one time flat rate subscription") Below is an example of creating a subscription for a one time flat rate edition. **Request** * JSON ``` { "order": { "paymentPlanId": "568" } } ``` * XML ``` 568 ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1072 Content-Type: application/json;charset=UTF-8 Date: Wed, 12 Aug 2015 23:49:09 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "03bbb592-327f-4a20-a4b2-f337d724b5db", "creationDate": "2015-08-12T17:49:07-06:00", "externalAccountId": "03250499-8505-41c4-bef7-fdfe1d243984", "status": "ACTIVE", "order": { "id": "1588", "startDate": "2015-08-12T00:00:00-06:00", "endDate": "2015-08-12T00:00:00-06:00", "nextBillingDate": "2015-08-12T17:49:08-06:00", "status": "ONE_TIME", "frequency": "ONE_TIME", "currency": "USD", "type": "NEW", "totalPrice": "10.6300000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www.app/api/marketplace/v1/products/78/editions/465/paymentPlans/568", "id": "568", "uuid": "e52ff207-2a17-4c58-85f3-6d49a23136af", "frequency": "ONE_TIME", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "1", "SEK": "10", "USD": "10" } } } }, "paymentPlanId": "568", "activated": "false", "orderLines": { "orderLine": [ { "description": "LATEST AUTO_WEBAPP_NEW - One Time - Flat Rate Price - One Time Fee", "id": "2438", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Sales Tax", "id": "2439", "percentage": "6.3000000000", "quantity": "1.0000000000", "totalPrice": "0.6300000000", "type": "TAX" } ] } }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78" }, "edition": { "-id": "465", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/465" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1072 Content-Type: application/xml;charset=UTF-8 Date: Wed, 12 Aug 2015 23:49:09 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 03bbb592-327f-4a20-a4b2-f337d724b5db 2015-08-12T17:49:07-06:00 03250499-8505-41c4-bef7-fdfe1d243984 ACTIVE 1588 2015-08-12T00:00:00-06:00 2015-08-12T00:00:00-06:00 2015-08-12T17:49:08-06:00 ONE_TIME ONE_TIME USD NEW 10.6300000000 568 e52ff207-2a17-4c58-85f3-6d49a23136af ONE_TIME false false false false false false false NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 1 10 10 568 false LATEST AUTO_WEBAPP_NEW - One Time - Flat Rate Price - One Time Fee 2438 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE Sales Tax 2439 6.3000000000 1.0000000000 0.6300000000 TAX ``` ## Creating a one time flat rate subscription with a discount[​](#creating-a-one-time-flat-rate-subscription-with-a-discount "Direct link to Creating a one time flat rate subscription with a discount") Below is an example of creating a subscription for a one time flat rate edition applying a discount. **Request** * JSON ``` { "order": { "paymentPlanId": "568" "discountId": "27" } } ``` * XML ``` 568 27 ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1143 Content-Type: application/json;charset=UTF-8 Date: Thu, 13 Aug 2015 16:08:47 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "b9e159e3-51d5-44f7-a44d-d48ff478f1f7", "creationDate": "2015-08-13T10:08:45-06:00", "externalAccountId": "eef78dca-25a7-4e19-a9bd-3ad22fe2cca3", "status": "ACTIVE", "order": { "id": "1593", "startDate": "2015-08-13T00:00:00-06:00", "endDate": "2015-08-13T00:00:00-06:00", "nextBillingDate": "2015-08-13T10:08:46-06:00", "status": "ONE_TIME", "frequency": "ONE_TIME", "currency": "USD", "type": "NEW", "totalPrice": "5.3100000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/465/paymentPlans/568", "id": "568", "uuid": "e52ff207-2a17-4c58-85f3-6d49a23136af", "frequency": "ONE_TIME", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "1", "SEK": "10", "USD": "10" } } } }, "discount": { "-id": "27", "-href": "https://www.appdirect.com/api/channel/v1/discounts/27" }, "paymentPlanId": "568", "activated": "false", "orderLines": [ { "description": "LATEST AUTO_WEBAPP_NEW - One Time - Flat Rate Price - One Time Fee", "id": "2450", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "autoApply attribute is true", "id": "2451", "price": "-5.0000000000", "quantity": "1.0000000000", "totalPrice": "-5.0000000000", "type": "DISCOUNT" }, { "description": "Sales Tax", "id": "2452", "percentage": "6.2000000000", "quantity": "1.0000000000", "totalPrice": "0.3100000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78" }, "edition": { "-id": "465", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/465" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1143 Content-Type: application/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 16:08:47 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff b9e159e3-51d5-44f7-a44d-d48ff478f1f7 2015-08-13T10:08:45-06:00 eef78dca-25a7-4e19-a9bd-3ad22fe2cca3 ACTIVE 1593 2015-08-13T00:00:00-06:00 2015-08-13T00:00:00-06:00 2015-08-13T10:08:46-06:00 ONE_TIME ONE_TIME USD NEW 5.3100000000 568 e52ff207-2a17-4c58-85f3-6d49a23136af ONE_TIME false false false false false false false NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 1 10 10 568 false LATEST AUTO_WEBAPP_NEW - One Time - Flat Rate Price - One Time Fee 2450 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE autoApply attribute is true 2451 -5.0000000000 1.0000000000 -5.0000000000 DISCOUNT Sales Tax 2452 6.2000000000 1.0000000000 0.3100000000 TAX ``` ## Creating a recurring flat rate subscription with price per unit[​](#creating-a-recurring-flat-rate-subscription-with-price-per-unit "Direct link to Creating a recurring flat rate subscription with price per unit") Below is an example of creating a subscription for a recurring flat rate edition with USER as a price per unit. **Request** * JSON ``` { "order": { "paymentPlanId": "600" "orderLines": [{ "unit": "USER", "quantity": "3" } ] } } ``` * XML ``` 600 USER 3 ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 948 Content-Type: application/xml;charset=UTF-8 Date: Wed, 12 Aug 2015 17:19:00 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "fed9488f-31fb-429b-9651-11d1acb52639", "creationDate": "2015-08-13T09:34:50-06:00", "externalAccountId": "b43d3c80-50e9-4e23-986d-ddd2fb193d7d", "status": "ACTIVE", "maxUsers": "4", "order": { "id": "1592", "startDate": "2015-08-13T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "42.5100000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/494/paymentPlans/600", "id": "600", "uuid": "99eca49e-9227-4c92-bdda-aa1af5e4671e", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": [ { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "SEK": "10", "USD": "10" } }, { "unit": "USER", "minUnits": "0.0000000000", "maxUnits": "10.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "true", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "SEK": "10", "USD": "10" } } ] } }, "paymentPlanId": "600", "activated": "false", "orderLines": { "orderLine": [ { "description": "LATEST AUTO_WEBAPP_NEW - Recurring having Flat Rate Price and Price Per Unit with Min 0 to Max 10 Usage Restrictions - Monthly Fee", "id": "2447", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "LATEST AUTO_WEBAPP_NEW - Recurring having Flat Rate Price and Price Per Unit with Min 0 to Max 10 Usage Restrictions - Per User Fee", "id": "2448", "price": "10.0000000000", "quantity": "3.0000000000", "totalPrice": "30.0000000000", "type": "ITEM", "unit": "USER" }, { "description": "Sales Tax", "id": "2449", "percentage": "6.2750000000", "quantity": "1.0000000000", "totalPrice": "2.5100000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78" }, "edition": { "-id": "494", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/494" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1150 Content-Type: application/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 15:24:23 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=1E0F77BD46679BE92DB37479B99466FE; Path=/; HttpOnly Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff fed9488f-31fb-429b-9651-11d1acb52639 2015-08-13T09:34:50-06:00 b43d3c80-50e9-4e23-986d-ddd2fb193d7d ACTIVE 4 1592 2015-08-13T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD NEW 42.5100000000 600 99eca49e-9227-4c92-bdda-aa1af5e4671e MONTHLY false false false false false false false NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 10 10 USER 0.0000000000 10.0000000000 false 1.0000000000 true false false false 10 10 10 10 600 false LATEST AUTO_WEBAPP_NEW - Recurring having Flat Rate Price and Price Per Unit with Min 0 to Max 10 Usage Restrictions - Monthly Fee 2447 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE LATEST AUTO_WEBAPP_NEW - Recurring having Flat Rate Price and Price Per Unit with Min 0 to Max 10 Usage Restrictions - Per User Fee 2448 10.0000000000 3.0000000000 30.0000000000 ITEM USER Sales Tax 2449 6.2750000000 1.0000000000 2.5100000000 TAX ``` ## Creating a tiered recurring subscription with price per unit[​](#creating-a-tiered-recurring-subscription-with-price-per-unit "Direct link to Creating a tiered recurring subscription with price per unit") Below is an example of creating a subscription for a tiered recurring edition with USER as a price per unit. **Request** * JSON ``` { "order": { "paymentPlanId": "599" } } ``` * XML ``` 599 ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 982 Content-Type: application/json;charset=UTF-8 Date: Fri, 14 Aug 2015 05:11:00 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "87f48c70-cf63-4362-80d6-22ef8a24b0f5", "creationDate": "2015-08-13T23:11:00-06:00", "externalAccountId": "439ba12f-355d-4d8a-a8c4-7d22d15695cf", "status": "ACTIVE", "maxUsers": "1", "order": { "id": "1602", "startDate": "2015-08-13T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "0.0000000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/493/paymentPlans/599", "id": "599", "uuid": "36e1d66b-fc77-4519-87c1-572b40b3e432", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": { "unit": "USER", "minUnits": "0.0000000000", "maxUnits": "5.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "true", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "5", "CHF": "5", "SEK": "5", "USD": "5" } } } }, "paymentPlanId": "599", "activated": "false", "orderLines": [{ "description": "Sales Tax", "id": "2469", "percentage": "0.0000000000", "quantity": "1.0000000000", "totalPrice": "0.0000000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78" }, "edition": { "-id": "493", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/493" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 982 Content-Type: application/xml;charset=UTF-8 Date: Fri, 14 Aug 2015 05:11:00 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 87f48c70-cf63-4362-80d6-22ef8a24b0f5 2015-08-13T23:11:00-06:00 439ba12f-355d-4d8a-a8c4-7d22d15695cf ACTIVE 1 1602 2015-08-13T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD NEW 0.0000000000 599 36e1d66b-fc77-4519-87c1-572b40b3e432 MONTHLY false false false false false false false USER 0.0000000000 5.0000000000 false 1.0000000000 true false false false 5 5 5 5 599 false Sales Tax 2469 0.0000000000 1.0000000000 0.0000000000 TAX ``` ## Creating a recurring flat rate subscription with set up fees[​](#creating-a-recurring-flat-rate-subscription-with-set-up-fees "Direct link to Creating a recurring flat rate subscription with set up fees") Below is an example of creating a subscription for a recurring flat rate edition with set up fees. **Request** * JSON ``` { "order": { "paymentPlanId": "592" } } ``` * XML ``` 592 ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1185 Content-Type: application/json;charset=UTF-8 Date: Thu, 13 Aug 2015 16:26:52 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options { "id": "47460ffb-4a25-43be-b32e-cd59c4ac7d6c", "creationDate": "2015-08-13T10:26:51-06:00", "externalAccountId": "3e5fd2ba-3e5a-43ae-931e-7dcff37bfcf1", "status": "ACTIVE", "maxUsers": "1", "order": { "id": "1595", "startDate": "2015-08-13T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "10.6300000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://ww.appdirect.com/api/marketplace/v1/products/78/editions/486/paymentPlans/592", "id": "592", "uuid": "b9902237-23ae-4dca-9696-8243c69f5023", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": [ { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "10", "SEK": "10", "USD": "10" } }, { "unit": "ONE_TIME_SETUP", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "5", "CHF": "5", "EUR": "5", "SEK": "5", "USD": "5" } } ] }, "paymentPlanId": "592", "activated": "false", "oneTimeOrders": { "oneTimeOrder": { "id": "1594", "startDate": "2015-08-13T00:00:00-06:00", "endDate": "2015-08-13T00:00:00-06:00", "nextBillingDate": "2015-08-13T10:26:52-06:00", "status": "ONE_TIME", "frequency": "ONE_TIME", "currency": "USD", "type": "ONE_TIME_FEE", "totalPrice": "5.3100000000", "paymentPlan": { "-id": "592", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/486/paymentPlans/592" } } }, "orderLines": [ { "description": "LATEST AUTO_WEBAPP_NEW - Recurring Flat Rate w/ Setup Fee - Monthly Fee", "id": "2455", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Sales Tax", "id": "2456", "percentage": "6.3000000000", "quantity": "1.0000000000", "totalPrice": "0.6300000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78" }, "edition": { "-id": "486", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/486" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1185 Content-Type: application/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 16:26:52 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options 47460ffb-4a25-43be-b32e-cd59c4ac7d6c 2015-08-13T10:26:51-06:00 3e5fd2ba-3e5a-43ae-931e-7dcff37bfcf1 ACTIVE 1 1595 2015-08-13T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD NEW 10.6300000000 592 b9902237-23ae-4dca-9696-8243c69f5023 MONTHLY false false false false false false false NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 10 10 10 ONE_TIME_SETUP 0.0000000000 false 1.0000000000 false false false false 5 5 5 5 5 592 false 1594 2015-08-13T00:00:00-06:00 2015-08-13T00:00:00-06:00 2015-08-13T10:26:52-06:00 ONE_TIME ONE_TIME USD ONE_TIME_FEE 5.3100000000 LATEST AUTO_WEBAPP_NEW - Recurring Flat Rate w/ Setup Fee - Monthly Fee 2455 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE Sales Tax 2456 6.3000000000 1.0000000000 0.6300000000 TAX ``` ## Creating a recurring subscription with an auto renewing contract[​](#creating-a-recurring-subscription-with-an-auto-renewing-contract "Direct link to Creating a recurring subscription with an auto renewing contract") Below is an example of creating a subscription for a recurring edition with an auto renewing contract. **Request** * JSON ``` { "order": { "paymentPlanId": "566" } } ``` * XML ``` 566 ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1191 Content-Type: application/json;charset=UTF-8 Date: Thu, 13 Aug 2015 17:21:40 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "38466fa8-c2e4-42c0-8b74-37ea62c17c6a", "creationDate": "2015-08-13T11:21:38-06:00", "externalAccountId": "a1b9a59e-a76e-407d-98c8-868b69b343a8", "status": "ACTIVE", "maxUsers": "1", "order": { "id": "1597", "startDate": "2015-08-13T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "10.6300000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/463/paymentPlans/566", "id": "566", "uuid": "463ef552-274d-4e03-9131-4307b3984d2a", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false", "minimumServiceLength": "0" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": [ { "unit": "CONTRACT_FEE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "10", "SEK": "10", "USD": "10" } }, { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "10", "SEK": "10", "USD": "10" } }, { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "10", "SEK": "10", "USD": "10" } } ] }, "paymentPlanId": "566", "activated": "false", "oneTimeOrders": { "oneTimeOrder": { "id": "1596", "startDate": "2015-08-13T00:00:00-06:00", "endDate": "2015-08-13T00:00:00-06:00", "nextBillingDate": "2015-08-13T11:21:39-06:00", "status": "ONE_TIME", "frequency": "ONE_TIME", "currency": "USD", "type": "ONE_TIME_FEE", "totalPrice": "10.6300000000", "paymentPlan": { "-id": "566", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/463/paymentPlans/566" } } }, "orderLines": [ { "description": "LATEST AUTO_WEBAPP_NEW - Contract Auto Renewal - Monthly Fee", "id": "2459", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Sales Tax", "id": "2460", "percentage": "6.3000000000", "quantity": "1.0000000000", "totalPrice": "0.6300000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78" }, "edition": { "-id": "463", "-href": "https://www.appdriect.com/api/marketplace/v1/products/78/editions/463" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1191 Content-Type: application/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 17:21:40 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 38466fa8-c2e4-42c0-8b74-37ea62c17c6a 2015-08-13T11:21:38-06:00 a1b9a59e-a76e-407d-98c8-868b69b343a8 ACTIVE 1 1597 2015-08-13T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD NEW 10.6300000000 566 463ef552-274d-4e03-9131-4307b3984d2a MONTHLY false false false 0 false false false false CONTRACT_FEE 0.0000000000 false 1.0000000000 false false false false 10 10 10 10 10 NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 10 10 10 USER 0.0000000000 false false false false false 10 10 10 10 10 566 false 1596 2015-08-13T00:00:00-06:00 2015-08-13T00:00:00-06:00 2015-08-13T11:21:39-06:00 ONE_TIME ONE_TIME USD ONE_TIME_FEE 10.6300000000 LATEST AUTO_WEBAPP_NEW - Contract Auto Renewal - Monthly Fee 2459 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE Sales Tax 2460 6.3000000000 1.0000000000 0.6300000000 TAX ``` ## Creating a recurring subscription with a contract termination fee[​](#creating-a-recurring-subscription-with-a-contract-termination-fee "Direct link to Creating a recurring subscription with a contract termination fee") Below is an example of creating a subscription for a recurring edition with a contract that has a percentage-based termination fee. **Request** * JSON ``` { "order": { "paymentPlanId": "571" } } ``` * XML ``` 571 ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1282 Content-Type: application/json;charset=UTF-8 Date: Thu, 13 Aug 2015 17:37:57 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "07265ec6-c0c7-44ba-99c3-960efa0e505f", "creationDate": "2015-08-13T11:37:56-06:00", "externalAccountId": "bc8a5beb-ff5a-46d8-a0ce-17378d1a8a4b", "status": "ACTIVE", "maxUsers": "1", "order": { "id": "1599", "startDate": "2015-08-13T00:00:00-06:00", "endDate": "2016-08-13T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "10.6300000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/468/paymentPlans/571", "id": "571", "uuid": "6ed24faf-bfce-45e4-839b-1c90be727c96", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false", "minimumServiceLength": "12", "terminationFee": { "type": "PERCENTAGE", "description": "Termination Fee applied to remaining", "percentageFee": "0.2500000000" } }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": [ { "unit": "CONTRACT_FEE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "10", "SEK": "10", "USD": "10" } }, { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "EUR": "1", "SEK": "10", "USD": "10" } } ] }, "contract": { "endOfContractDate": "2016-08-13T00:00:00-06:00", "minimumServiceLength": "12", "terminationFee": { "description": "Termination Fee applied to remaining", "percentage": "25.0000000000", "type": "PERCENTAGE" } }, "paymentPlanId": "571", "activated": "false", "oneTimeOrders": { "oneTimeOrder": { "id": "1598", "startDate": "2015-08-13T00:00:00-06:00", "endDate": "2015-08-13T00:00:00-06:00", "nextBillingDate": "2015-08-13T11:37:57-06:00", "status": "ONE_TIME", "frequency": "ONE_TIME", "currency": "USD", "type": "ONE_TIME_FEE", "totalPrice": "10.6300000000", "paymentPlan": { "-id": "571", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/468/paymentPlans/571" } } }, "orderLines": [ { "description": "LATEST AUTO_WEBAPP_NEW - Contract - Termination Fee Percentage - Monthly Fee", "id": "2463", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Sales Tax", "id": "2464", "percentage": "6.3000000000", "quantity": "1.0000000000", "totalPrice": "0.6300000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78" }, "edition": { "-id": "468", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/468" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1282 Content-Type: application/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 17:37:57 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 07265ec6-c0c7-44ba-99c3-960efa0e505f 2015-08-13T11:37:56-06:00 bc8a5beb-ff5a-46d8-a0ce-17378d1a8a4b ACTIVE 1 1599 2015-08-13T00:00:00-06:00 2016-08-13T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD NEW 10.6300000000 571 6ed24faf-bfce-45e4-839b-1c90be727c96 MONTHLY false false false 12 PERCENTAGE Termination Fee applied to remaining 0.2500000000 false false false false CONTRACT_FEE 0.0000000000 false 1.0000000000 false false false false 10 10 10 10 10 NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 1 10 10 2016-08-13T00:00:00-06:00 12 Termination Fee applied to remaining 25.0000000000 PERCENTAGE 571 false 1598 2015-08-13T00:00:00-06:00 2015-08-13T00:00:00-06:00 2015-08-13T11:37:57-06:00 ONE_TIME ONE_TIME USD ONE_TIME_FEE 10.6300000000 LATEST AUTO_WEBAPP_NEW - Contract - Termination Fee Percentage - Monthly Fee 2463 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE Sales Tax 2464 6.3000000000 1.0000000000 0.6300000000 TAX ``` ## Creating a recurring subscription with taxes[​](#creating-a-recurring-subscription-with-taxes "Direct link to Creating a recurring subscription with taxes") Below is an example of creating a subscription for a recurring edition charging a percentage tax. **Request** * JSON ``` { "order": { "paymentPlanId": "596", "orderLines": {[ { "unit": "USER", "quantity": "5" }, { "unit": "HOUR", "quantity": "15" }, { "type": "TAX", "percentage": "0.10", "description": "10% Tax" } ] } } ``` * XML ``` 596USER5HOUR15TAX0.1010% Tax ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1449 Content-Type: application/json;charset=UTF-8 Date: Fri, 14 Aug 2015 17:30:07 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "d74bc04e-f654-4e87-ae94-68fc5e7ab56f", "creationDate": "2015-08-14T11:30:05-06:00", "externalAccountId": "4a70546a-a2ae-448e-95ae-6f9b1eccdd9c", "status": "ACTIVE", "maxUsers": "6", "order": { "id": "1604", "startDate": "2015-08-14T00:00:00-06:00", "endDate": "2016-08-14T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "57.9100000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/490/paymentPlans/596", "id": "596", "uuid": "7ad9c40d-ce26-48f9-8573-954fabe6f862", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false", "minimumServiceLength": "12" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": [ { "unit": "CONTRACT_FEE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "100", "CHF": "100", "SEK": "100", "USD": "100" } }, { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "SEK": "10", "USD": "10" } }, { "unit": "ONE_TIME_SETUP", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "1.2", "CHF": "1.2", "SEK": "1.2", "USD": "1.2" } }, { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "5", "CHF": "5", "SEK": "5", "USD": "5" } }, { "unit": "ONE_TIME_SETUP", "unitDependency": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "1.1", "CHF": "1.1", "SEK": "1.1", "USD": "1.1" } }, { "unit": "HOUR", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "1.3", "CHF": "1.3", "SEK": "1.3", "USD": "1.3" } }, { "unit": "ONE_TIME_SETUP", "unitDependency": "HOUR", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "0.2", "CHF": "0.2", "SEK": "0.2", "USD": "0.2" } } ] }, "contract": { "endOfContractDate": "2016-08-14T00:00:00-06:00", "minimumServiceLength": "12" }, "paymentPlanId": "596", "activated": "false", "oneTimeOrders": { "oneTimeOrder": { "id": "1603", "startDate": "2015-08-14T00:00:00-06:00", "endDate": "2015-08-14T00:00:00-06:00", "nextBillingDate": "2015-08-14T11:30:06-06:00", "status": "ONE_TIME", "frequency": "ONE_TIME", "currency": "USD", "type": "ONE_TIME_FEE", "totalPrice": "116.5600000000", "paymentPlan": { "-id": "596", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/490/paymentPlans/596" } } }, "orderLines": [ { "description": "LATEST AUTO_WEBAPP_NEW - Recurring with all types of fees - Once per Company and Automated Discount - Monthly Fee", "id": "2475", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "LATEST AUTO_WEBAPP_NEW - Recurring with all types of fees - Once per Company and Automated Discount - Per Hour Fee", "id": "2476", "price": "1.3000000000", "quantity": "15.0000000000", "totalPrice": "19.5000000000", "type": "ITEM", "unit": "HOUR" }, { "description": "LATEST AUTO_WEBAPP_NEW - Recurring with all types of fees - Once per Company and Automated Discount - Per User Fee", "id": "2477", "price": "5.0000000000", "quantity": "5.0000000000", "totalPrice": "25.0000000000", "type": "ITEM", "unit": "USER" }, { "description": "Sales Tax", "id": "2478", "percentage": "6.2568807300", "quantity": "1.0000000000", "totalPrice": "3.4100000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78" }, "edition": { "-id": "490", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/490" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1449 Content-Type: application/xml;charset=UTF-8 Date: Fri, 14 Aug 2015 17:30:07 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff d74bc04e-f654-4e87-ae94-68fc5e7ab56f 2015-08-14T11:30:05-06:00 4a70546a-a2ae-448e-95ae-6f9b1eccdd9c ACTIVE 6 1604 2015-08-14T00:00:00-06:00 2016-08-14T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD NEW 57.9100000000 596 7ad9c40d-ce26-48f9-8573-954fabe6f862 MONTHLY false false false 12 false false false false CONTRACT_FEE 0.0000000000 false 1.0000000000 false false false false 100 100 100 100 NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 10 10 ONE_TIME_SETUP 0.0000000000 false 1.0000000000 false false false false 1.2 1.2 1.2 1.2 USER 0.0000000000 false false false false false 5 5 5 5 ONE_TIME_SETUP USER 0.0000000000 false 1.0000000000 false false false false 1.1 1.1 1.1 1.1 HOUR 0.0000000000 false false false false false 1.3 1.3 1.3 1.3 ONE_TIME_SETUP HOUR 0.0000000000 false 1.0000000000 false false false false 0.2 0.2 0.2 0.2 2016-08-14T00:00:00-06:00 12 596 false 1603 2015-08-14T00:00:00-06:00 2015-08-14T00:00:00-06:00 2015-08-14T11:30:06-06:00 ONE_TIME ONE_TIME USD ONE_TIME_FEE 116.5600000000 LATEST AUTO_WEBAPP_NEW - Recurring with all types of fees - Once per Company and Automated Discount - Monthly Fee 2475 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE LATEST AUTO_WEBAPP_NEW - Recurring with all types of fees - Once per Company and Automated Discount - Per Hour Fee 2476 1.3000000000 15.0000000000 19.5000000000 ITEM HOUR LATEST AUTO_WEBAPP_NEW - Recurring with all types of fees - Once per Company and Automated Discount - Per User Fee 2477 5.0000000000 5.0000000000 25.0000000000 ITEM USER Sales Tax 2478 6.2568807300 1.0000000000 3.4100000000 TAX ``` ### Creating a subscription to Microsoft products[​](#creating-a-subscription-to-microsoft-products "Direct link to Creating a subscription to Microsoft products") Below is an example of creating a Microsoft product. Notice that several parameters are passed in using the parameters attribute of the order field. **Request** * JSON ``` POST https://appdirect.com/api/billing/v1/companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78/users/3d4d2342-b7c4-4865-85bd-842f269adae6/subscriptions Host: www.appdirect.com Authorization OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="VeJO1tP7RKUE1rz", oauth_timestamp="1438728054", oauth_consumer_key="appdirect-91", oauth_signature="xy37tmDbpwuIHZJIioRSB3GGAhM%3D" Content-Type application/json { "order":{ "paymentPlanId":749, "orderLines":[{ "unit":"USER", "quantity":3 }], "parameters":[{ "name":"BusinessName", "value":"API Getting Started" }, { "name":"FirstName", "value":"Billing" }, { "name":"LastName", "value":"API" }, { "name":"Address/Line1", "value":"650 California Street" }, { "name":"Address/Line2", "value":"Floor 25" }, { "name":"Address/City", "value":"San Francisco" }, { "name":"Address/State", "value":"CA" }, { "name":"Address/PostalCode", "value":"94108" }, { "name":"Address/ISO3Country", "value":"USA" }, { "name":"Address/PhoneNumber", "value":"5109289829" }, { "name":"AlternateEmail", "value":"test@test.de" }, { "name":"UserPrincipleName", "value":"testUser" }, { "name":"SubDomain", "value":"subtest.onmicrosoft.com" }, { "name":"CommunicationLanguage", "value":"en" }, { "name":"CommunicationCulture", "value":"USA" }] } } ``` * XML ``` POST https://appdirect.com/api/billing/v1/companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78/users/3d4d2342-b7c4-4865-85bd-842f269adae6/subscriptions Host: www.appdirect.com Authorization OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="VeJO1tP7RKUE1rz", oauth_timestamp="1438728054", oauth_consumer_key="appdirect-91", oauth_signature="xy37tmDbpwuIHZJIioRSB3GGAhM%3D" Content-Type application/xml 749 USER 3 BusinessName API Getting Started FirstName Billing LastName API Address/Line1 650 California Street Address/Line2 Floor 25 Address/City San Francisco Address/State CA Address/PostalCode 94108 Address/ISO3Country USA Address/PhoneNumber 5109289829 AlternateEmail test@test.de UserPrincipleName testUser SubDomain subtest.onmicrosoft.com CommunicationLanguage en CommunicationCulture USA ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1049 Content-Type: application/json;charset=UTF-8 Date: Tue, 11 Aug 2015 21:39:41 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "1be642f4-64cd-4357-b0f0-14b476c47dfa", "creationDate": "2015-08-11T15:39:39-06:00", "status": "INITIALIZED", "maxUsers": "1", "order": { "id": "1584", "startDate": "2015-08-11T00:00:00-06:00", "nextBillingDate": "2015-09-11T00:00:00-06:00", "status": "PENDING_REMOTE_CREATION", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "10.6300000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "http://www.appdirect.com/api/marketplace/v1/products/93/editions/612/paymentPlans/749", "id": "749", "uuid": "eb483983-ce47-41a7-b304-e5b6bb89d818", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": [ { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10.0000000000", "CHF": "10.0000000000", "USD": "10.0000000000" } }, { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10.0000000000", "CHF": "10.0000000000", "USD": "10.0000000000" } } ] } }, "paymentPlanId": "749", "activated": "false", "orderLines": { "orderLine": [ { "description": "Office 365 Web Apps - Plan 1 - Monthly Fee", "id": "2428", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "Sales Tax", "id": "2429", "percentage": "6.3000000000", "quantity": "1.0000000000", "totalPrice": "0.6300000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "http://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "http://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "93", "-href": "http://www.appdirect.com/api/marketplace/v1/products/93" }, "edition": { "-id": "612", "-href": "http://www.appdirect.com/api/marketplace/v1/products/93/editions/612" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1049 Content-Type: application/xml;charset=UTF-8 Date: Tue, 11 Aug 2015 21:39:41 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 1be642f4-64cd-4357-b0f0-14b476c47dfa 2015-08-11T15:39:39-06:00 INITIALIZED 1 1584 2015-08-11T00:00:00-06:00 2015-09-11T00:00:00-06:00 PENDING_REMOTE_CREATION MONTHLY USD NEW 10.6300000000 749 eb483983-ce47-41a7-b304-e5b6bb89d818 MONTHLY false false false false false false false USER 0.0000000000 false false false false false 10.0000000000 10.0000000000 10.0000000000 NOT_APPLICABLE 0.0000000000 false false false false false 10.0000000000 10.0000000000 10.0000000000 749 false Office 365 Web Apps - Plan 1 - Monthly Fee 2428 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE Sales Tax 2429 6.3000000000 1.0000000000 0.6300000000 TAX ``` ## Creating a subscription invalid discount[​](#creating-a-subscription-invalid-discount "Direct link to Creating a subscription invalid discount") Below is an example of creating a subscription with a bad request caused by invalid data, specifically the discount code not being valid for the application. **Request** * JSON ``` { "order": { "paymentPlanId":749, "discountId":25 } } ``` * XML ``` 749 25 ``` **Response** * JSON ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 152 Content-Type: application/json;charset=UTF-8 Date: Thu, 13 Aug 2015 01:41:49 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "DISCOUNT_NOT_VALID", "message": "Discount cannot apply to this order." } ``` * XML ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 152 Content-Type: application/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 01:41:49 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff DISCOUNT_NOT_VALID Discount cannot apply to this order. ``` ## Creating a subscription missing required data[​](#creating-a-subscription-missing-required-data "Direct link to Creating a subscription missing required data") Below is an example of creating a subscription with a bad request caused by missing required data, specifically the paymentPlanId field. **Request** * JSON ``` { "order": { } } ``` * XML ``` ``` **Response** * JSON ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 152 Content-Type: application/json;charset=UTF-8 Date: Thu, 13 Aug 2015 01:41:49 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "PAYMENT_PLAN_ID_MISSING", "message": "Payment plan ID is missing." } ``` * XML ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 152 Content-Type: application/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 01:41:49 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff PAYMENT_PLAN_ID_MISSING Payment plan ID is missing. ``` ## Creating a subscription with a bad request[​](#creating-a-subscription-with-a-bad-request "Direct link to Creating a subscription with a bad request") Below is an example of creating a subscription with a bad request. In this case, the JSON object is missing a curly brace, while the XML is missing a closing tag. **Request** * JSON ``` { "order": { "paymentPlanId": "568" } ``` * XML ``` 568 ``` **Response** * JSON ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 133 Content-Type: text/json;charset=UTF-8 Date: Thu, 13 Aug 2015 01:29:50 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=36AF57502F9FA7774A5C25DB732DD8BF; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "Bad Request", "message": "Unexpected end-of-input: expected close marker for OBJECT (from [Source: org.apache.cxf.transport.http.AbstractHTTPDestination$1@41e290f5; line: 1, column: 0])" } ``` * XML ``` Status Code: 400 Bad Request Cache-Control: no-cache, no-store, max-age=0, must-revalidate Connection: close Content-Length: 133 Content-Type: text/xml;charset=UTF-8 Date: Thu, 13 Aug 2015 01:29:50 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=36AF57502F9FA7774A5C25DB732DD8BF; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff Bad Request HTTP 400 Bad Request ``` ## Creating a subscription for an existing entitlement[​](#creating-a-subscription-for-an-existing-entitlement "Direct link to Creating a subscription for an existing entitlement") Below is an example of creating a subscription for an application that is already owned by the user and/or company. It can be the same edition or a different edition of the application. **Request** * JSON ``` { "order": { "paymentPlanId": "568" } } ``` * XML ``` 568 ``` **Response** * JSON ``` Status Code: 409 Conflict Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 166 Content-Type: application/xml;charset=UTF-8 Date: Wed, 12 Aug 2015 23:28:03 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=5F84FC4F9EA36791D38C5E32869DBC29; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "code": "APP_ALREADY_EXISTS", "message": "Company has already purchased the application." } ``` * XML ``` Status Code: 409 Conflict Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 166 Content-Type: application/xml;charset=UTF-8 Date: Wed, 12 Aug 2015 23:28:03 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=5F84FC4F9EA36791D38C5E32869DBC29; Path=/; HttpOnly X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff APP_ALREADY_EXISTS Company has already purchased the application. ``` --- # Creating a subscription Once you have a created company, added a user to the company, and created a payment instrument for that user, you can create a subscription for that user. To do so, you will need the unique company identifier returned in the create company response and the unique user identifier returned in the create user response. Note that you do not need the unique identifier for the payment instrument, but the user must have a valid payment instrument in the database. The unique identifier for your new subscription will be returned in the response (shown in the example below). This identifier will be used in calls to manage the subscription. URL endpoint: `/api/billing/v1/companies/{companyId}/users/{userId}/subscriptions` Method: POST Parameters: * companyId - The unique identifier for the company provided by the channel. This id can be obtained either from the response returned when the company is created via the API, or by using the API to list the companies in order to view the id for your company. * userId - The unique identifier for the user provided by the channel. This id can be obtained either from the response returned when the user is created via the API, or by using the API to list the users for the company in order to view the id for the user. * A valid JSON or XML object with subscription data HTTP status codes | HTTP Status Code | Description | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 201 Created | The subscription was created. | | 400 Bad Request | Some required fields were not received. | | 404 Not Found | The specified company or user was not found. | | 409 Conflict | A subscription already exists for the specified company.  You may assign the user to the existing subscription or change the subscription (to a different edition, or upgrade/downgrade modifiable options). | Below is an example of a basic subscription creation request and response. Additional examples are provided in the example section of this document. **Request** * JSON ``` POST https://www.appdirect.com/api/billing/v1/companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78/users/3d4d2342-b7c4-4865-85bd-842f269adae6/subscriptions Host: www.appdirect.com Authorization OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="VeJO1tP7RKUE1rz", oauth_timestamp="1438728054", oauth_consumer_key="appdirect-91", oauth_signature="xy37tmDbpwuIHZJIioRSB3GGAhM%3D" Content-Type application/json { "order": { "paymentPlanId": "541", "orderLines":[ { "unit": "USER", "quantity": "3" }] } } ``` * XML ``` POST https://www.appdirect.com/api/billing/v1/companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78/users/3d4d2342-b7c4-4865-85bd-842f269adae6/subscriptions Host: www.appdirect.com Authorization OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="VeJO1tP7RKUE1rz", oauth_timestamp="1438728054", oauth_consumer_key="appdirect-91", oauth_signature="xy37tmDbpwuIHZJIioRSB3GGAhM%3D" Content-Type application/xml 541 >USER 3 ; ``` **Response** * JSON ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1272 Content-Type: application/json;charset=UTF-8 Date: Wed, 12 Aug 2015 19:43:28 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "2baa78aa-c5a8-49e8-b49f-ec5e8fe58086", "creationDate": "2015-08-12T13:43:26-06:00", "externalAccountId": "8dcdc107-ab42-43de-b772-d9f2a06d58fc", "status": "ACTIVE", "maxUsers": "4", "order": { "id": "1587", "startDate": "2015-08-12T00:00:00-06:00", "nextBillingDate": "2015-09-01T00:00:00-06:00", "status": "ACTIVE", "frequency": "MONTHLY", "currency": "USD", "type": "NEW", "totalPrice": "26.5700000000", "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "paymentPlan": { "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/440/paymentPlans/541", "id": "541", "uuid": "dcdf76e8-e7d2-4fe3-bc12-f6d03bb4c8b0", "frequency": "MONTHLY", "contract": { "blockContractDowngrades": "false", "blockContractUpgrades": "false", "blockSwitchToShorterContract": "false" }, "allowCustomUsage": "false", "keepBillDateOnUsageChange": "false", "separatePrepaid": "false", "isPrimaryPrice": "false", "costs": { "cost": [ { "unit": "NOT_APPLICABLE", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "10", "CHF": "10", "SEK": "10", "USD": "10" } }, { "unit": "ONE_TIME_SETUP", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "1.5", "CHF": "1.5", "SEK": "1.5", "USD": "1.5" } }, { "unit": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "5", "CHF": "5", "SEK": "5", "USD": "5" } }, { "unit": "ONE_TIME_SETUP", "unitDependency": "USER", "minUnits": "0.0000000000", "meteredUsage": "false", "increment": "1.0000000000", "pricePerIncrement": "false", "blockContractDecrease": "false", "blockContractIncrease": "false", "blockOriginalContractDecrease": "false", "amount": { "CAD": "2", "CHF": "2", "SEK": "2", "USD": "2" } } ] } }, "paymentPlanId": "541", "activated": "false", "oneTimeOrders": { "oneTimeOrder": { "id": "1586", "startDate": "2015-08-12T00:00:00-06:00", "endDate": "2015-08-12T00:00:00-06:00", "nextBillingDate": "2015-08-12T13:43:27-06:00", "status": "ONE_TIME", "frequency": "ONE_TIME", "currency": "USD", "type": "ONE_TIME_FEE", "totalPrice": "7.9700000000", "paymentPlan": { "-id": "541", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/440/paymentPlans/541" } } }, "orderLines": { "orderLine": [ { "description": "LATEST AUTO_WEBAPP_NEW - Recurring edition all fees except contract - Monthly Fee", "id": "2435", "price": "10.0000000000", "quantity": "1.0000000000", "totalPrice": "10.0000000000", "type": "ITEM", "unit": "NOT_APPLICABLE" }, { "description": "LATEST AUTO_WEBAPP_NEW - Recurring edition all fees except contract - Per User Fee", "id": "2436", "price": "5.0000000000", "quantity": "3.0000000000", "totalPrice": "15.0000000000", "type": "ITEM", "unit": "USER" }, { "description": "Sales Tax", "id": "2437", "percentage": "6.2800000000", "quantity": "1.0000000000", "totalPrice": "1.5700000000", "type": "TAX" } ] }, "user": { "-id": "3d4d2342-b7c4-4865-85bd-842f269adae6", "-href": "https://www.appdirect.com/api/account/v1//users/3d4d2342-b7c4-4865-85bd-842f269adae6" }, "company": { "-id": "a012bb88-c2c5-40a1-b140-ec6ed4593b78", "-href": "https://www.appdirect.com/api/account/v1//companies/a012bb88-c2c5-40a1-b140-ec6ed4593b78" }, "product": { "-id": "78", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78" }, "edition": { "-id": "440", "-href": "https://www.appdirect.com/api/marketplace/v1/products/78/editions/440" } } ``` * XML ``` Status Code: 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Length: 1272 Content-Type: application/xml;charset=UTF-8 Date: Wed, 12 Aug 2015 19:43:28 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 Vary: Accept-Encoding X-Frame-Options: DENY X-XSS-Protection: 1; mode=block x-content-type-options: nosniff 2baa78aa-c5a8-49e8-b49f-ec5e8fe58086 2015-08-12T13:43:26-06:00 8dcdc107-ab42-43de-b772-d9f2a06d58fc ACTIVE 4 1587 2015-08-12T00:00:00-06:00 2015-09-01T00:00:00-06:00 ACTIVE MONTHLY USD NEW 26.5700000000 541 dcdf76e8-e7d2-4fe3-bc12-f6d03bb4c8b0 MONTHLY false false false false false false false NOT_APPLICABLE 0.0000000000 false 1.0000000000 false false false false 10 10 10 10 ONE_TIME_SETUP 0.0000000000 false 1.0000000000 false false false false 2 2 2 2 541 false 1586 2015-08-12T00:00:00-06:00 2015-08-12T00:00:00-06:00 2015-08-12T13:43:27-06:00 ONE_TIME ONE_TIME USD ONE_TIME_FEE 7.9700000000 LATEST AUTO_WEBAPP_NEW - Recurring edition all fees except contract - Monthly Fee 2435 10.0000000000 1.0000000000 10.0000000000 ITEM NOT_APPLICABLE LATEST AUTO_WEBAPP_NEW - Recurring edition all fees except contract - Per User Fee 2436 5.0000000000 3.0000000000 15.0000000000 ITEM USER Sales Tax 2437 6.2800000000 1.0000000000 1.5700000000 TAX ``` --- # Other subscription-related API methods The AppDirect Billing API supports several additional methods for managing your subscription once it has been created. There is a brief description of these methods below. ## List company subscriptions[​](#list-company-subscriptions "Direct link to List company subscriptions") Returns a list of subscriptions for the specified company. URL endpoint: /api/billing/v1/companies/\/subscriptions Method: GET Parameters: \ the ID assigned by the channel to identify each company HTTP Status Code: 200 OK Return list of subscriptions matching criteria; 404 Not Found if company with that id is not present in the system. ## List user subscriptions[​](#list-user-subscriptions "Direct link to List user subscriptions") Returns a list of subscriptions for the specified user. URL endpoint: /api/billing/v1/companies/\/users/\/subscriptions Method: GET Parameters: \ the ID assigned by the channel to identify each company, \ the ID assigned by the channel to identify each user HTTP Status Code: 200 OK Return list of subscriptions matching criteria; 404 Not Found if company, or user, with that id is not present in the system. ## Read subscription[​](#read-subscription "Direct link to Read subscription") Returns the details of a single subscription URL endpoint: /api/billing/v1/subscriptions/\ Method: GET Parameters: \ The unique identifier assigned to the subscription by the channel HTTP Status Codes: 200 OK Return subscription; 404 Not Found if the subscription with that id is not present in the system. ## Change subscription[​](#change-subscription "Direct link to Change subscription") Change an existing subscription URL endpoint: /api/billing/v1/companies/\/users/\/subscriptions/\ Method: PUT Parameters: \ the ID assigned by the channel to identify each company, \ the ID assigned by the channel to identify each user, \ the ID assigned by the channel to identify each subscription, a valid JSON or XML object containing subscription data HTTP Status Codes: 200 OK subscription updated, 404 Not Found if company, user, or subscription with that id is not present in the system. ## Cancel subscription[​](#cancel-subscription "Direct link to Cancel subscription") Cancels a subscription URL endpoint: /api/billing/v1/subscriptions/\ Method: DELETE Parameters: \ The unique identifier assigned to the subscription by the channel HTTP Status Codes: 204 No Content subscription deleted, 404 Not Found if subscription is not present in the system --- # Products, payment plans and discounts In order to understand what products are available for purchase, what editions each of these products offer, and the discounts available for these products, it is important to know about a few more AppDirect API methods. The methods described below will allow you to get the paymentPlanId and discountId necessary to create a subscription through the API. Note that these ids are also available through the UI. ## Read product list[​](#read-product-list "Direct link to Read product list") The Product Listing API returns all products within the marketplace catalog and information about respective products.  Additional information can be found [here](/rest.md#tag/Product/operation/resource_Product_readAppListing_GET). URL endpoint: /api/marketplace/v1/listing Method: GET Parameters: You can use all supported parameters in combination, as in this example that combines 'q' and 'count' -- | Parameter | Description | | --------- | --------------------------------------------------------------------------------------------------------------------------- | | type | Set of: WEB\_APP, WEB\_APP\_MANUAL\_SETUP, TEMPLATE, DESIGN\_ELEMENT, MODULE, EMBEDDED\_VIDEO, BUNDLE, DOWNLOADABLE\_BUNDLE | | filters | Set of: FEATURED, POPULAR, STAFFPICK, FREE, PAID | | order | Order of which apps will be displayed. One of: NEWEST\_FIRST, ALPHABETICAL, POPULARITY | | count | Number of products returned | | c | Query category IDs | | s | Query subcategory IDs | | i | Query customer IDs | | a | Query attribue IDs | | q | Query search string | HTTP Status Codes: 200 OK on success ## Read product[​](#read-product "Direct link to Read product") The Read Product API returns the full details of a product in order to show the product profile on the marketplace.  Additional information can be found [here](/rest.md#tag/Product/operation/resource_Product_readProduct_GET). URL endpoint: /api/marketplace/v1/products/\ Method: GET Parameters: \ the unique product identifier provided by the channel HTTP Status Codes: 200 OK on success; 404 Not Found if no product with the specified productId exists in the system. ## List discounts[​](#list-discounts "Direct link to List discounts") The Discount Listing API returns all discounts available within the marketplace. Additional information can be found [here](/rest.md#tag/Discount/operation/resource_Other_readDiscounts_GET). URL endpoint: /api/channel/v1/discounts/listing Method: GET Parameters: The optional parameters are shown below. | Parameter | Description | | --------- | ----------------------------------------------------------------------------------------------- | | code | 4-255 characters | | sortField | CODE, APPLICATION, REDEMPTIONS, START\_DATE, END\_DATE, or CREATED\_ON; defaults to CREATED\_ON | | sortOrder | ASC or DESC; defaults to ASC | | start | Integer values; defaults to 0 | | count | 0-250; defaults to 250 | HTTP Status Codes: 200 OK on success --- # Supported request attributes | Request Field | Format | Required | Description | | --------------------- | ----------- | -------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | order | Object | Yes | The order information for the subscription to create | | order.paymentPlanId | String | Yes | The unique identifier for the edition pricing for which a subscription is being created. | | order.discountId | String | No | The unique identifier for the discount to be applied to the subscription. | | order.orderLines | Array | Yes, if order line item information is required by the edition | An array of orderLine objects representing the subscription information. This information is required in cases where additional information is required by the edition. An example of this would be an edition that has individual unit pricing ("price per unit"), so information about the desired number of units must be passed. | | orderLines.orderLine | Object | Yes | An object containing information about one line of the subscription order. | | orderLine.type | String Enum | No | The type of order line item; can be ITEM, TAX, PENALTY, or DISCOUNT. | | orderLine.unit | String Enum | No | The unit type of order line item; can be USER, GIGABYTE, MEGABYTE, HOUR, MINUTE, INVOICE, UNIT, PROJECT, PROPERTY, ITEM, WORD, EMAIL, CONTACT, CALL, CREDIT, ROOM, HOST, AGENT, OPERATOR, PROVIDER, MANAGER, TESTER, JVM, SERVER, WEB\_USE\_MINUTE, AUDIO\_USE\_MINUTE, PIECE, EMPLOYEE\_PAY\_PERIOD, COMPUTER, NOT\_APPLICABLE, ONE\_TIME\_SETUP, DATA\_POINTS, TIER1\_API\_CALLS, TIER2\_API\_CALLS, ADVISORY\_HOURS, OVERAGE\_AUDIO\_MINUTE, EMPLOYEE, CONNECTION, PUSH\_USER, THOUSAND\_EMAILS\_PER\_DAY, PUSH\_NOTIFICATION\_DEVICES, API\_CALLS, SMS\_TEXT\_MESSAGE, CONTACTS\_1000, CONTRACT\_FEE, TRANSFER\_FEE, REACTIVATION\_FEE, RECIPIENT, ADDITIONAL\_1000\_CONTACTS\_BLOCK, SCHEDULE\_PLAN, EMAILS\_1000, MOBILE\_DEVICE, PAYSLIP, PAYSLIP\_CORRECTION, STORE, WEBSITE, EPAPER, PAGE, POSTAGE\_AND\_PRINT, INTERNATIONAL\_POSTAGE\_AND\_PRINT, TIER1\_TOP\_LEVEL\_DOMAIN, TIER2\_TOP\_LEVEL\_DOMAIN, DEDICATED\_IP, ENABLELCM, MAXCOMPONENTS, DATA\_MANAGEMENT\_USER, SPECIALIST\_USER, PROFESSIONAL\_USER, MATERIALITY\_MATRIX, STAKEHOLDER\_MANAGEMENT, SCORECARD, STANDARD\_MAPPING, DONATION\_MANAGEMENT, DOCUMENT, PACKAGE\_SMALL, PACKAGE\_LARGE, MEMBER, ATTENDEE, MAILING, RESPONSE, EXTERNAL\_INVOICE\_FEE, CLIENT\_TEST, IMAGE\_TRANSFORMATION, TOTAL\_IMAGE, LICENSE, MAILBOX, FREE\_40\_INCH\_HDTV\_PC, FREE\_46\_INCH\_HDTV\_PC, FREE\_46\_INCH\_HDTV\_PC\_MOUNTING, EMPLOYEE\_PER\_WEEK, REGISTER, END\_USER, CORE, DEVICE, PORT, MEASURER, PUBLISHED\_MEASUREMENT, NODE, SERVER\_RULE, VPN\_LP, PROXY\_LP, DESKTOP\_CONNECT\_LP, CAMERA, MAIN\_SOUND\_ZONE, SUB\_SOUND\_ZONE, POST, REPORT, BOX, SESSION, DISPLAY, TRUCKROLL, TRANSACTION\_FEE, SENDING\_API\_CALL, LOOKUP\_API\_CALL, or ANALYTICS\_API\_CALL. | | orderLine.quantity | Numeric | No | The quantity for order line item. | | orderLine.price | Numeric | No | The price per unit for order line item. | | orderLine.percentage | Numeric | No | The percentage (e.g., tax) associated with order line item. | | orderLine.totalPrice | Numeric | No | The total price for order line item. | | orderLine.description | String | No | The description of order line item. | | order.parameters | Array | No | An array of optional parameters required in order to create a subscription to a product. Some products will require additional information that can be passed through this attribute. | | parameters.name | String | Yes, if parameters are used | The name of the parameter to be passed. | | parameters.value | String | Yes, if parameters are used | The value of the parameter to be passed. | --- # Supported response attributes | Response Field | Format | Description | | ------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | String | The unique identifier assigned to the subscription by the channel. This is the identifier that should be used in subsequent subscription API calls. | | creationDate | String | The date on which the subscripton was created. | | endDate | String | The end date for the subscription (e.g., in the case of a contract); may be NULL. | | externalAccountId | String | The identifier for the external (to the channel) account. | | status | String Enum | The status of the subscription order; can be INITIALIZED, PENDING\_USER\_APPROVAL, PENDING\_REMOTE\_CREATION, FREE\_TRIAL, ACTIVE, FINISHED, ONE\_TIME, CANCELLED, SUSPENDED, FREE\_TRIAL\_EXPIRED, FREE\_TRIAL\_CANCELLED, DELETED, FAILED, UPCOMING, PENDING\_MIGRATION\_ACTIVATION. | | maxUsers | Numeric | The maximum number of users allowed for the subscription. | | order | Object | The order information for the subscription that was created. | | order.paymentPlanId | String | The unique identifier for the edition pricing for which a subscription is being created. | | order.discountId | String | The unique identifier for the discount to be applied to the subscription. | | order.activated | boolean | True if the subscription has been activated. | | order.paymentPlan | Object | An object representing the payment plan for this subscription. | | paymentPlan.id | String | The identifier for the payment plan created by the channel. | | paymentPlan.href | String | The link to the payment plan. | | paymentPlan.uuid | String | The unique identifier for the payment plan. | | paymentPlan.frequency | String | The frequency of billing; may be ONE\_TIME, MONTHLY, QUARTERLY, SIX\_MONTHS, YEARLY, TWO\_YEARS, THREE\_YEARS, or DAILY. | | paymentPlan.contract | Object | An object containing contract information for the payment plan. | | contract.minimumServiceLength | Numeric | The minimum service length specified by the contract. | | contract.cancellationPeriodLimit | Numeric | The cancellation period limit specified by the contract. | | contract.endOfContractGracePeriod | Numeric | The grace period allowed at the end of the contract. | | contract.blockSwitchToShorterContract | Boolean | True if the contract blocks changing to a shorter contract. | | contract.blockContractDowngrades | Boolean | True if the contract blocks contract downgrades. | | contract.blockContractUpgrades | Boolean | True if the contract blocks contract upgrades. | | contract.autoExtensionPricingId | Numeric | The identifier for the pricing plan for the contract autoextension, if applicable. | | contract.gracePeriod | Object | An object representing the contract grace period. | | gracePeriod.length | Numeric | The length of the grace period specified by the contract. | | gracePeriod.unit | String | The units for the grace period length specified by the contract. | | contract.terminationFee | Object | An object representing the contract termination fee. | | terminationFee.type | String Enum | The termination fee type; can be NONE, PERCENTAGE, or FLAT\_RATE. | | terminationFee.description | String | The termination fee description. | | terminationFee.percentageFee | Numeric | The percentage to charge for the termination fee. | | terminationFee.flatFee | Object | An object representing the flat fee to charge for the termination fee; this will contain an entry for each supported currency for the product. | | paymentPlan.allowCustomUsage | Boolean | True if custom usage is allowed for the subscription. | | paymentPlan.keepBillDateOnUsageChange | Boolean | True if the billling date doesn't change on usage changes to the subscription. | | paymentPlan.separatePrepaid | Boolean | True if prepayment is separate. | | paymentPlan.isPrimaryPrice | Boolean | True if this is the primary price for the subscription. | | paymentPlan.costs | Array | An array of objects containing cost information. | | costs.cost | Object | An object containing cost information. | | cost.amount | Object | An object representing the cost amount; this will contain an entry for each supported currency for the product. | | cost.pricePerIncrement | Boolean | True if the price applies per increment. | | cost.blockContractDecrease | Boolean | True if the contract blocks a contract decrease in cost. | | cost.blockContractIncrease | Boolean | True if the contract blocks a contract increase in cost. | | cost.blockOriginalContractDecrease | Boolean | True if the contract blocks a decrease in cost from the original contract. | | cost.unit | String Enum | The unit for the contract cost. See orderLine.unit for valid units. | | cost.unitDependency | String | The unit dependency for the contract cost. | | cost.minUnits | Numeric | The minimum units allowed. | | cost.maxUnits | Numeric | The maximum units allowed. | | cost.meteredUsage | Boolean | True if the cost is for metered usage. | | cost.increment | Numericm | The increment the cost applies to. | | paymentPlan.discount | Object | An object containing the discount information. | | discount.amount | Object | An object representing the discount amount; this will contain an entry for each supported currency for the product. | | discount.description | String | The discount description. | | discount.percentage | Numeric | The percentage discount. | | discount.numOfBillingCycles | Numeric | The number of billing cycles the discount applies to. | | discount.availableRedemptions | Numeric | The number of times remaining the discount can be applied. | | discount.startDate | String | The start date of the discount. | | discount.expirationDate | String | The expiration date of the discount. | | order.contract | Object | An object representing the contract for this subscription, if applicable. | | contract.minimumServiceLength | Numeric | The minimum service length specified by the contract. | | contract.cancellationPeriodLimit | Numeric | The cancellation period limit specified by the contract. | | contract.endOfContractGracePeriod | Numeric | The grace period allowed at the end of the contract. | | contract.endOfContractDate | String | The end date of the contract. | | contract.gracePeriodEndDate | String | The end date of the contract grace period. | | contract.terminationFee | Object | An object representing the contract termination fee. | | terminationFee.type | String Enum | The termination fee type; can be NONE, PERCENTAGE, or FLAT\_RATE. | | terminationFee.description | String | The termination fee description. | | terminationFee.percentage | Numeric | The percentage to charge for the termination fee. | | terminationFee.price | Object | An object representing the flat fee price to charge for the termination fee; this will contain an entry for each supported currency for the product. | | contract.renewal | Object | An object representing the contract renewal. | | renewal.order | String | A link to the contract renewal rder. | | renewal.paymentPlan | String | TA link to the contract renewal payment plan. | | order.previousOrder | String | A link to the previous order. | | order.nextOrder | String | A link to the next order. | | order.discount | String | A link to the discount. | | order.orderLines | Array | An array of orderLine objects representing the subscription information. This information is required in cases where additional information is required by the edition. An example of this would be an edition that has individual unit pricing ("price per unit"), so information about the desired number of units must be passed. | | orderLines.orderLine | Object | An object containing information about one line of the subscription order. | | orderLine.type | String Enum | The type of order line item; can be ITEM, TAX, PENALTY, or DISCOUNT. | | orderLine.unit | String Enum | The unit type of order line item; can be USER, GIGABYTE, MEGABYTE, HOUR, MINUTE, INVOICE, UNIT, PROJECT, PROPERTY, ITEM, WORD, EMAIL, CONTACT, CALL, CREDIT, ROOM, HOST, AGENT, OPERATOR, PROVIDER, MANAGER, TESTER, JVM, SERVER, WEB\_USE\_MINUTE, AUDIO\_USE\_MINUTE, PIECE, EMPLOYEE\_PAY\_PERIOD, COMPUTER, NOT\_APPLICABLE, ONE\_TIME\_SETUP, DATA\_POINTS, TIER1\_API\_CALLS, TIER2\_API\_CALLS, ADVISORY\_HOURS, OVERAGE\_AUDIO\_MINUTE, EMPLOYEE, CONNECTION, PUSH\_USER, THOUSAND\_EMAILS\_PER\_DAY, PUSH\_NOTIFICATION\_DEVICES, API\_CALLS, SMS\_TEXT\_MESSAGE, CONTACTS\_1000, CONTRACT\_FEE, TRANSFER\_FEE, REACTIVATION\_FEE, RECIPIENT, ADDITIONAL\_1000\_CONTACTS\_BLOCK, SCHEDULE\_PLAN, EMAILS\_1000, MOBILE\_DEVICE, PAYSLIP, PAYSLIP\_CORRECTION, STORE, WEBSITE, EPAPER, PAGE, POSTAGE\_AND\_PRINT, INTERNATIONAL\_POSTAGE\_AND\_PRINT, TIER1\_TOP\_LEVEL\_DOMAIN, TIER2\_TOP\_LEVEL\_DOMAIN, DEDICATED\_IP, ENABLELCM, MAXCOMPONENTS, DATA\_MANAGEMENT\_USER, SPECIALIST\_USER, PROFESSIONAL\_USER, MATERIALITY\_MATRIX, STAKEHOLDER\_MANAGEMENT, SCORECARD, STANDARD\_MAPPING, DONATION\_MANAGEMENT, DOCUMENT, PACKAGE\_SMALL, PACKAGE\_LARGE, MEMBER, ATTENDEE, MAILING, RESPONSE, EXTERNAL\_INVOICE\_FEE, CLIENT\_TEST, IMAGE\_TRANSFORMATION, TOTAL\_IMAGE, LICENSE, MAILBOX, FREE\_40\_INCH\_HDTV\_PC, FREE\_46\_INCH\_HDTV\_PC, FREE\_46\_INCH\_HDTV\_PC\_MOUNTING, EMPLOYEE\_PER\_WEEK, REGISTER, END\_USER, CORE, DEVICE, PORT, MEASURER, PUBLISHED\_MEASUREMENT, NODE, SERVER\_RULE, VPN\_LP, PROXY\_LP, DESKTOP\_CONNECT\_LP, CAMERA, MAIN\_SOUND\_ZONE, SUB\_SOUND\_ZONE, POST, REPORT, BOX, SESSION, DISPLAY, TRUCKROLL, TRANSACTION\_FEE, SENDING\_API\_CALL, LOOKUP\_API\_CALL, or ANALYTICS\_API\_CALL. | | orderLine.quantity | Numeric | The quantity for order line item. | | orderLine.price | Numeric | The price per unit for order line item. | | orderLine.percentage | Numeric | The percentage (e.g., tax) associated with order line item. | | orderLine.totalPrice | Numeric | The total price for order line item. | | orderLine.description | String | The description of order line item. | | order.oneTimeOrders | Array | An array of any one time order listings. | | oneTimeOrders.oneTimeOrder | Object | An object representing a one time order. | | oneTimeOrder.paymentPlan | String | A link to the payment plan for the one time order. | | oneTimeOrder.id | String | The one time order provided by the channel. | | oneTimeOrder.startDate | String | The one time order start date. | | oneTimeOrder.endDate | String | The one time order end date. | | oneTimeOrder.nextBillingDate | String | The next billing date for the one time order. | | oneTimeOrder.endOfDiscountDate | String | The end date for the one time order discount, if applicable. | | oneTimeOrder.status | String Enum | The status of the subscription order; can be INITIALIZED, PENDING\_USER\_APPROVAL, PENDING\_REMOTE\_CREATION, FREE\_TRIAL, ACTIVE, FINISHED, ONE\_TIME, CANCELLED, SUSPENDED, FREE\_TRIAL\_EXPIRED, FREE\_TRIAL\_CANCELLED, DELETED, FAILED, UPCOMING, PENDING\_MIGRATION\_ACTIVATION. | | oneTimeOrder.frequency | String | The frequency of billing, in this case ONE\_TIME. | | oneTimeOrder.currency | String | The currency for the one time order; may be USD, CAD, EUR, JPY, GBP, KRW, CHF, SEK, SGD, MYR, AUD, MXN, INR, BRL, DKK, NZD, NOK, ZAR, PHP | | oneTimeOrder.type | String | The subscription type for the one time order; may be NEW, MIGRATION, ADOPTION, METERED\_USAGE, FREE\_TRIAL\_ACTIVATION, BUNDLED, TERMINATION\_FEE, END\_OF\_CONTRACT\_MIGRATION, REFUND, CREDIT, ONE\_TIME\_FEE, ADDITIONAL\_FEE. | | oneTimeOrder.totalPrice | Numeric | The total price of the one time order. | | oneTimeOrder.user | String | A link to the user to which the one time order is associated. | | oneTimeOrder.salesSupportUser | String | A link to the sales support user to which the one time order is associated. | | oneTimeOrder.company | String | A link to the company to which the one time order is associated. | | order.parameters | Array | An array of optional parameters required in order to create a subscription to a product. Some products will require additional information that can be passed through this attribute. | | parameters.name | String | The name of the parameter to be passed. | | parameters.value | String | The value of the parameter to be passed. | --- # Use cases Once a company, user and payment instrument have been created, you may create subscriptions for the user through the AppDirect API. Doing so is the equivalent of purchasing a product through the AppDirect UI. Beyond the most basic case of creating a subscription, it is possible to create several types of subscriptions, depending on the product and its available editions. For instance, you may wish to create a free trial subscription, a discounted subscription, a tiered subscription, a subscription with contract terms, a subscription that uses per unit pricing, or a subscription that charges taxes. The differences in the requests are minimal - often just a different pricing plan - but the responses will contain different information. Additionally, subscription creation may take place through reseller management rather than through the marketplace. --- # Manage discounts The AppDirect Discount API is designed to provide the same options that are available through the user interface. You can use this API allows to create and manage discount codes that can be applied to various marketplace editions or applications. This section contains the following topics: * [List discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/list-discounts.md) * [Retrieve discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/retrieve-discounts.md) * [Create discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/create-discounts.md) * [Update discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/update-discounts.md) * [Configure retainable discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/configure-retainable-discounts.md) * [Delete discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/delete-discounts.md) --- # Configure retainable discounts *Retainable discounts* are discounts that are retained when you change the payment plan of a product or edition of a product. For example, when you change the number of users of an edition or product, or if you change the type of product edition, the payment plan changes. You set the retainable property when you create a discount for a product. See [Create discounts](/user-guides/billing-and-subscription/rest-api/manage-discounts/create-discounts.md). Discounts apply to the subscription that is created when someone purchases a product and enters a discount code, or if you set the discount to automatically apply during checkout. Set `retainable = true` to keep the discount when payment plans change. The discount is only retainable if the discount is still in effect for the product, edition, and payment plan. The retainable property has no effect on the following: * If you change only the number of units in an edition, the retainable property does not affect the discount because the payment plan does not change. * When you extend a contract that has a discount that is still in effect, the discount is retained regardless of how the retainable property is set. You can have only one discount on an edition at a time. If you enter a discount on an edition that already has a retainable discount, the second discount replaces the first. You must configure the second discount to be retainable to keep it if you change the payment plan or edition. To configure retainable discounts, set the `retainable` property to `true` in one of the following API requests: * [Create discounts](/rest.md#tag/Discount/operation/resource_Other_createDiscount_POST) * [Update discounts](/rest.md#tag/Discount/operation/resource_Other_updateDiscount_PUT) **Example: Create a retainable discount** ``` curl -X post \ https://example.byappdirect.com/api/channel/v1/discounts -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "code": "Holiday12345", "type": "FIXED_PRICE", "price": 25, "description": "$25 holiday discount", "expirationDate": 1551330000000, "autoApply": false, "retainable": true }' ``` **Response** ``` { "id": 822, "code": "Holiday12345", "redemptions": 0, "maxRedemptions": null, "createdOn": 1548943564888, "startDate": null, "expirationDate": 1551330000000, "type": "FIXED_PRICE", "percentage": null, "price": 25, "description": "$25 holiday discount", "applicationName": null, "applicationId": null, "editionId": null, "paymentPlanId": null, "autoApply": false, "billingCycles": null, "retainable": true, "redemptionRestriction": "NONE", "vendorSharePercentage": 0, "partnerSharePercentage": 100, "basePartnerSharePercentage": 0, "unit": null, "minUnits": 0, "maxUnits": 0, "resellerCompanyId": null, "industryId": null } ``` --- # Create discounts You can create a discount through the API with the following endpoint: * [Create discounts](/rest.md#tag/Discount/operation/resource_Other_createDiscount_POST) The following example shows a discount creation request that includes only the required properties. Additional attributes are available, as documented [here](/rest.md#tag/Discount). The unique discount identifier in the response is required for any further API calls to manage the discount. Example: Create a discount with required properties ``` curl -X post \ https://example.byappdirect.com/api/channel/v1/discounts -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "autoApply": "false", "code": "Only required attributes", "description": "autoApply attribute is true", "type": "FIXED_PRICE", "price": "5" } ``` **Response** ``` { "id": "27", "code": "Only required attributes", "redemptions": "0", "type": "FIXED_PRICE", "price": "5", "description": "autoApply attribute is true", "autoApply": "false", "retainable": "false", "redemptionRestriction": "NONE", "vendorSharePercentage": "0", "partnerSharePercentage": "100", "basePartnerSharePercentage": "0", "unit": "USER", "minUnits": "0", "maxUnits": "0" } ``` The following example discount creation request that includes several other commonly used properties, such as the start date and expiration date. **Example: Create a discount with common properties** ``` curl -X post \ https://example.byappdirect.com/api/channel/v1/discounts -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "code": "ILOVEAPPDIRECT", "description": "A discount for those who love AppDirect", "type": "PERCENTAGE", "percentage": "50", "autoApply": "false", "startDate": "2015-05-06", "expirationDate": "2015-10-11" } ``` **Response** ``` { "id": "2", "code": "ILOVEAPPDIRECT", "redemptions": "0", "startDate": "2015-05-06T00:00:00-06:00", "expirationDate": "2015-10-11T00:00:00-06:00", "type": "PERCENTAGE", "percentage": "50.0", "description": "A discount for those who love AppDirect", "autoApply": "false", "retainable": "false", "redemptionRestriction": "NONE", "vendorSharePercentage": "0", "partnerSharePercentage": "100", "basePartnerSharePercentage": "0", "unit": "USER", "minUnits": "0", "maxUnits": "0" } ``` Note the following about the response: * Attributes that you do not specify in the request receive default values in the response. * The `id` is the unique identifier that is generated upon creation. * The `redemptions`, `vendorSharePercentage`, `minUnits`, and `maxUnits` properties all have default values of `0`. * The `partnerSharePercentage` property has a default value of `100`. * The `retainable` property has a default value of `false`. * The `redemptionRestriction` property has a default value of `NONE`. * The unit property has a default value of `USER`. * The `maxRedemptions`, `startDate`, `expirationDate`, `applicationName`, `applicationID`, `paymentPlanId`, and `billingCycles` have default values of `null` and are not returned in the response unless you provide them in the request. * You must use the `price` property if you set `type` to `FIXED_PRICE`, or the `percentage` property if you set `type` to `PERCENTAGE`. --- # Delete discounts You can delete discounts as required with the following endpoint: * [Delete discounts](/rest.md#tag/Discount/operation/resource_Other_deleteDiscount_DELETE) The response is a 204 status code. There is no response object. **Example** ``` curl -X delete \ https://example.byappdirect.com/api/channel/v1/discounts/22 -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ ``` **Response** ``` 204 No Content ``` --- # List discounts You can list all available discounts through the API with the following endpoint: * [List all discounts](/rest.md#tag/Discount/operation/resource_Other_readDiscounts_GET) Example ``` curl -X get \ https://example.byappdirect.com/api/channel/v1/discounts -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ ``` Response ``` { [ { "id": "1", "code": "100PERCENT", "redemptions": "0", "createdOn": "2014-06-02T16:20:02-06:00", "type": "PERCENTAGE", "percentage": "100.0000000000", "description": "For 100% discount testing", "autoApply": "false", "retainable": "false", "redemptionRestriction": "NONE", "unit": "USER", "minUnits": "0", "maxUnits": "0" }, { "id": "2", "code": "ILOVEAPPDIRECT", "redemptions": "0", "createdOn": "2015-06-04T12:39:51-06:00", "startDate": "2015-05-06T00:00:00-06:00", "expirationDate": "2015-10-11T00:00:00-06:00", "type": "PERCENTAGE", "percentage": "50.0000000000", "description": "A discount for those who love AppDirect", "autoApply": "false", "retainable": "false", "redemptionRestriction": "NONE", "unit": "USER", "minUnits": "0", "maxUnits": "0" } ] } ``` --- # Retrieve discounts After you create a discount, you can read it through the API with the [Retrieve discounts](/rest.md#tag/Discount/operation/resource_Other_readDiscount_GET) endpoint. ``` GET https://www.example.com/api/channel/v1/discounts/{discountId} ``` where *discountId* is the unique identifier of the discount to change. Example request: ``` GET https://appdirect.com/api/channel/v1/discounts/2 Content-Type: application/json Authorization: OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="1oeaqyLgZoDN94B", oauth_timestamp="1433443191", oauth_consumer_key="appdirect-91", oauth_signature="O7twFnWyJ9ME2v8sF6C7j9LJkX8%3D" ``` Example response body: ``` Status Code: 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Length: 756 Content-Type: application/json;charset=UTF-8 Date: Thu, 04 Jun 2015 19:02:44 GMT Expires: 0 Pragma: no-cache Server: Apache-Coyote/1.1 X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block x-content-type-options: nosniff { "id": "2", "code": "ILOVEAPPDIRECT", "redemptions": "0", "createdOn": "2015-06-04T12:39:51-06:00", "startDate": "2015-05-06T00:00:00-06:00", "expirationDate": "2015-10-11T00:00:00-06:00", "type": "PERCENTAGE", "percentage": "50.0000000000", "description": "A discount for those who love AppDirect", "autoApply": "false", "retainable": "false", "redemptionRestriction": "NONE", "vendorSharePercentage": "0.0000000000", "partnerSharePercentage": "100.0000000000", "basePartnerSharePercentage": "0.0000000000", "minUnits": "0.0000000000" } ``` --- # Update discounts After you create a discount, you can update it with the following endpoint: * [Update discounts](/rest.md#tag/Discount/operation/resource_Other_updateDiscount_PUT) **Example** ``` curl -X put \ https://example.byappdirect.com/api/channel/v1/discounts/22 -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "id": "22", "code": "ILOVEAPPDIRECT", "description": "A discount for those who love AppDirect", "type": "PERCENTAGE", "percentage": "80", "autoApply": "false", "startDate": "2015-05-06", "expirationDate": "2016-05-06" }' ``` **Response** ``` { "id": "22", "code": "ILOVEAPPDIRECT", "redemptions": "0", "startDate": "2015-05-06T00:00:00-06:00", "expirationDate": "2016-05-06T00:00:00-06:00", "type": "PERCENTAGE", "percentage": "80.0", "description": "A discount for those who love AppDirect", "autoApply": "false", "retainable": "false", "redemptionRestriction": "NONE", "vendorSharePercentage": "0", "partnerSharePercentage": "100", "basePartnerSharePercentage": "0", "unit": "USER", "minUnits": "0", "maxUnits": "0" } ``` --- # Metered usage V1 note This topic is about Metered usage V1. Marketplaces use the metered usage V1 API, metered usage V2 API, or both, to support metered usage billing. See also: **[Metered usage V2](/user-guides/product-integration/rest-api/metered-usage-v2/.md)**. AppDirect marketplaces support metered usage billing, also known as usage-based billing, which is how marketplaces or Developers charge users for their variable use of a product during each billing period. Developers configure metered usage through pricing settings for each product edition and add-on product. Typically, you use the unit that you set within the pricing settings to measure and charge for usage, for example each gigabyte, hour, or user license that a user uses. When you enable metered usage pricing, AppDirect marketplaces expose an API endpoint that you can use to report usage to the marketplace that owns the user's (customer's) account. For example, you can report the number of gigabytes of storage that users use, and the marketplace charges them for it based on the preconfigured or custom price that you define per gigabyte. You can report usage as often as necessary during a billing period, with one usage event per call. The marketplace adds all the usage that you send for the edition or add-on product unit type (such as gigabyte, hour, or user license), and invoices users for the total number of units, by unit type, on one invoice. All usage is attributed to and invoiced for the billing period *in which you report it*. Although you can report usage for suspended and canceled subscriptions, the outcomes differ and some constraints exist: * **Suspended subscriptions**: When subscriptions are suspended, metered usage can still be submitted. If there is an active contract for the subscription, the submitted usage is invoiced with the next billing cycle. If there is not an active contract for the subscription, the submitted usage is included on the next invoice. * **Canceled subscriptions**: When a user cancels a subscription during the billing cycle, they are still invoiced on their scheduled invoice date. You can report usage until the end of the billing period during which the user cancels a subscription, to include it on the invoice. Important After the end of the final billing period, any attempts to report usage for a canceled subscription are rejected and not invoiced. Therefore, we strongly recommend that you report usage as soon as possible. There are two types of metered usage, preconfigured and custom, and you can call the API for both of them. See [Preconfigured and custom metered usage](/user-guides/product-integration/rest-api/metered-usage-v1/pre-configured-and-custom.md). --- # Metered usage prerequisites note This topic is about Metered usage V1. Marketplaces use the metered usage V1 API, metered usage V2 API, or both, to support metered usage billing. See also: **[Metered usage V2](/user-guides/product-integration/rest-api/metered-usage-v2/.md)**. You must complete the following prerequisites before you can send a user's metered usage to a marketplace. ## Configure products for metered usage[​](#configure-products-for-metered-usage "Direct link to Configure products for metered usage") * To configure a product pricing plan or add-on product for preconfigured metered usage (the Metered usage setting) or custom metered usage (the Allow custom usage setting), refer to the following topics: * For product editions, see [Add recurring editions](https://help.appdirect.com/products/Default.htm#DevCenter/Prod-Add-Recurring-Edition.html) or [Add tiered editions](https://help.appdirect.com/products/Default.htm#DevCenter/Prod-Add-Tiered-Edition.html). * For add-on products, see [Edit recurring revenue model pricing](https://help.appdirect.com/products/Default.htm#DevCenter/addonsV2recurringRevModel.html) or [Edit tiered revenue model pricing](https://help.appdirect.com/products/Default.htm#DevCenter/addonsV2TieredRevModel.html). ## Locate the marketplace base URL[​](#locate-the-marketplace-base-url "Direct link to Locate the marketplace base URL") To locate the base URL for the AppDirect-powered marketplace that hosts the user's account, look at the \ element in events that the marketplace sent to you. For example, a SUBSCRIPTION\_ORDER. You can also find it from the OpenID URL of the users who are members of this customer company account. To report usage, POST an XML document to this endpoint URL: `{base marketplace URL}/api/integration/v1/billing/usage`. See [Authorize inbound API requests](https://help.appdirect.com/producthelp/Configprodintegrationsecurity/Sepcredentialsauthorization/authorizeinboundapi) for information on how to securely access product APIs. --- # Send custom metered usage note This topic is about Metered usage V1. Marketplaces use the metered usage V1 API, metered usage V2 API, or both, to support metered usage billing. See also: **[Metered usage V2](/user-guides/product-integration/rest-api/metered-usage-v2/.md)**. **Description**—Send usage data for custom metered usage to the AppDirect marketplace that hosts the user account. For a description of custom metered usage, see [Preconfigured and custom metered usage](/user-guides/product-integration/rest-api/metered-usage-v1/pre-configured-and-custom.md). **Endpoint URL**—`{base marketplace URL}/api/integration/v1/billing/usage` The `{base marketplace URL}` is the base URL for the marketplace that hosts the user account. (See [Locate the marketplace base URL](/user-guides/billing-and-subscription/rest-api/metered-usage-v1/metered-usage-prereqs.md#locate-the-marketplace-base-url).) **Request operation**—POST **Mandatory parameters in the request** * **account**—User account that incurred the usage. * **accountIdentifier**—Unique identifier that associates a vendor (ISV), customer company, and subscription. Represents company entitlement. Provided by the vendor when the subscription is purchased. Marketplace Managers can locate it in the user interface Integration Event logs; for SUBSCRIPTION\_ORDER events, it is the account ID that appears in the Identifiers column (see [View integration events](https://help.appdirect.com/platform/Default.htm#MarketplaceManager/viewIntegrationEvents.html)). This is the same as the accountId that is used in the Metered usage V2 API. * **quantity**—Number of units of usage in the stated unit of measure incurred by the user. * **price**—Custom price per unit. * **description**—Custom description of this charge. The unit parameter is optional. Whether you send it determines how events appear on invoices (when you send custom units, events are aggregated by unit type on invoices; see the custom metered usage section in [Preconfigured and custom metered usage](/user-guides/product-integration/rest-api/metered-usage-v1/pre-configured-and-custom.md). The following example JSON request illustrates how to send custom metered usage to a marketplace. In this example, the marketplace is notified to charge the user for a quantity of 34, at a price of $0.15 each, with a custom description. As a best practice, we recommend that you name the unit applicable to the usage in the description. **JSON example** ``` { "account": { "accountIdentifier": "MY_ACCOUNT" }, "items": [ { "quantity": "34", "price": "0.15", "description": "Aaron, this month you used 34 gigabytes." } ] } ``` --- # Send preconfigured metered usage note This topic is about Metered usage V1. Marketplaces use the metered usage V1 API, metered usage V2 API, or both, to support metered usage billing. See also: **[Metered usage V2](/user-guides/product-integration/rest-api/metered-usage-v2/.md)**. ## Send preconfigured metered usage[​](#send-preconfigured-metered-usage-1 "Direct link to Send preconfigured metered usage") **Description:** Send usage data for preconfigured metered usage to the AppDirect marketplace that hosts the user account. For a description of preconfigured metered usage, see [Preconfigured and custom metered usage](/user-guides/product-integration/rest-api/metered-usage-v1/pre-configured-and-custom.md). **Endpoint URL:** `{base marketplace URL}/api/integration/v1/billing/usage` The `{base marketplace URL}` is the base URL for the marketplace that hosts the user account. **Request operation:** POST **Mandatory parameters in the request:** * **account**—User account that incurred the usage. * **accountIdentifier**—Unique identifier that associates a vendor (ISV), customer company, and subscription. Represents company entitlement. Provided by the vendor when the subscription is purchased. Marketplace Managers can locate it in the user interface Integration Event logs; for SUBSCRIPTION\_ORDER events, it is the account ID that appears in the Identifiers column (see [View integration events](https://help.appdirect.com/platform/Default.htm#MarketplaceManager/viewIntegrationEvents.html)). This is the same as the accountId that is used in the Metered usage V2 API. * **unit**—Unit type that you preconfigured, for which you are sending metered usage. For supported units, see [Supported metered usage units](/user-guides/product-integration/rest-api/metered-usage-v1/supported-metered-usage-units.md). * **quantity**—Number of units of usage in the stated unit of measure incurred by the user. Following is an example JSON request to send preconfigured metered usage to a marketplace. In this example scenario, you configured metered usage for unit type *gigabyte*, and unit type *hour*, and a price for each. Now, you POST the following JSON or XML to tell the marketplace to charge the user for usage of 34 gigabytes, and three hours. **JSON example** ``` { "account": { "accountIdentifier": "MY_ACCOUNT" }, "items": [ { "unit": "GIGABYTE", "quantity": "34" }, { "unit": "HOUR", "quantity": "3" } ] } ``` --- # Supported metered usage units note This topic is about Metered usage V1. Marketplaces use the metered usage V1 API, metered usage V2 API, or both, to support metered usage billing. See also: **[Metered usage V2](/user-guides/product-integration/rest-api/metered-usage-v2/.md)**. The AppDirect platform supports many preconfigured usage units. See [PricingUnit](https://developer.appdirect.com/rest#tag/Integration) in the API reference documentation. If you require additional unit types, contact your AppDirect technical representative. --- # Payment.js library Developers who want to handle payments off-platform or collect payment information themselves can use AppDirect's payment.js library to build their own payment method solutions. The library supports marketplaces on which AppDirect itself is the identity provider (IdP), as well as marketplaces that use external IdPs integrated with AppDirect. This document describes how to use payment.js to create payment methods on the AppDirect platform. There are two ways to do so, depending on your authorization scenario: * Use a public developer key to obtain a token, and create a payment method using the token. * Use a user-scoped client token to create a payment method by sending payment method information to the platform directly. The payment.js library is the first component of a larger AppDirect.js library, which will include checkout item and shopping cart JavaScript libraries as well. The complete AppDirect.js library will enable developers to implement a complete off-platform checkout experience. --- # Payment.js authorization The payment.js library supports two types of authorization. Before you implement the payment.js library, you must determine which type you want to use, because each authorization scenario gives access to different methods in the library. Both methods reduce your PCI DSS compliance scope to [SAQ A-EP](https://www.pcisecuritystandards.org/documents/PCI-DSS-v3_2-SAQ-A_EP-rev1_1.pdf) by handling payment method data securely. The two types of authorization are: 1. Use a public developer key (PDK) to generate a token, which you can use to tokenize payment method details before they are sent to the payment gateway. 2. Use a user-scoped client OAuth token to send payment details to the payment gateway directly. This method might be desirable if you already have an integration that retrieves user-scoped tokens. --- # Choose your authorization method The payment.js library supports two different methods of payment method creation, each of which has its own requirements and advantages: 1. You can generate a payment method through tokenization, which requires a public developer key. 2. You can generate a payment method by sending payment details directly with a user-scoped OAuth token. The following sections provide instructions for each scenario. --- # Method 1: Create payment methods with a public developer key You can use a public developer key (PDK) with payment.js to obtain tokens from payment gateways, which you can then use to create payment methods. You must obtain the PDK from AppDirect. Contact your AppDirect technical representative for more information. --- # Create payment methods with tokens After you obtain a token with a PDK, create the payment method with the `pmToken`, as well as the user and company IDs. ``` adPayment.createPaymentMethod(pmToken, userUUID, companyUUID) .then(function(response) { // return a summary of the payment method created }) .error(function(error) { // handle the error }); ``` **Response** ``` { "id": "e35c2f85-ef92-4a8f-89f0-45b62fb95fa7", "accountDisplay": "1111", "default": true, "paymentMethodType": "CARD", "properties": { "cardHolderName": "Bob Dylan", "expirationMonth": "5", "expirationYear": "2019", "brand": "VISA", "number": "1111" }, "billingAddress": { "street1": "279 Prince St", "city": "Montreal", "state": "Quebec", "country": "CA", "zip": "H3C 2N4" } } ``` --- # Create tokens Create a token by passing the `paymentMethod` to the `createToken` method. The `paymentMethod` can be a JSON object or an `HTMLFormElement`. It must contain all of the required information. See [Create the paymentMethod object](/user-guides/billing-and-subscription/rest-api/payment-js-library/create-payment-method-object.md). Tokens expire after 15 minutes. Use the following template to create tokens: ``` const pmToken = undefined; adPayment.createToken(paymentMethod) .then(function(response) { // response.paymentMethod.accountDisplay // save the token for later or use it immediately pmToken = response.result.paymentMethod.id; }) .error(function(error) { // handle the error }); ``` **Response object** The `response` object has the following structure. The token is value of the `"id"` property. ``` { "id": "pm_0838a859-dfa6-4863-aa38-042d50a9e69a", "expiration": "2018-04-112T19:15:00Z", "paymentMethod": { "accountDisplay": "1111", "paymentMethodType": "CARD", "properties": { "cardHolderName": "John Doe", "expirationMonth": "1", "expirationYear": "2021", "brand": "VISA", "number": "1111" }, "billingAddress": { "street1": "123 Main St.", "city": "Springfield", "state": "MA", "country": "US", "zip": "20156" } } } ``` **Error object** The error object has the following structure. ``` { "status": 400, "code": "VALIDATION_ERROR", "message": "Missing required parameters" } ``` --- # Initialize adPayment In the public developer key scenario, you require the following: * The host URL. We recommend that you use your test marketplace initially. * A PDK from AppDirect. ``` const adPayment = AppDirect.payment.configure({ pdk: 'pdk_of_developer', host: 'https://example.byappdirect.com' }); ``` --- # Method 2: Create payment methods with client-based tokens You can create payment methods by using client-based tokens for authentication and then sending payment method information directly. To do so, you must first create an OAuth 2.0 API client in the AppMarket user interface. See [Create API clients](https://help.appdirect.com/platform/Default.htm#MarketplaceManager/api-client-create.html). We recommend that you use either the Implicit or Authorization Code grant type, depending on your use case. For more information, see [API authentication](/user-guides/api-usage/api-auth/.md). For further inquiries about obtaining tokens, contact your AppDirect technical representative. --- # Create payment methods directly To create a payment method using user-scoped authorization, pass the `paymentMethod` object as well as the user and company IDs. The `paymentMethod` can be a JSON object or an `HTMLFormElement`. It must contain all of the required information. See [Create the paymentMethod object](/user-guides/billing-and-subscription/rest-api/payment-js-library/create-payment-method-object.md). ``` adPayment.createPaymentMethod(paymentMethod, userUUID, companyUUID) .then(function(response) { // return a summary of the payment method created }) .error(function(error) { // handle the error }); ``` **Response** ``` { "id": "e35c2f85-ef92-4a8f-89f0-45b62fb95fa7", "accountDisplay": "1111", "default": true, "paymentMethodType": "CARD", "properties": { "cardHolderName": "Bob Dylan", "expirationMonth": "5", "expirationYear": "2019", "brand": "VISA", "number": "1111" }, "billingAddress": { "street1": "279 Prince St", "city": "Montreal", "state": "Quebec", "country": "CA", "zip": "H3C 2N4" } } ``` --- # Initialize adPayment In the user-scoped token scenario, you require the following: * The host URL. We recommend that you use your test marketplace initially. * A client token provided by your server. ``` const adPayment = AppDirect.payment.configure({ client_token: 'user_scoped_oauth_token', host: 'https://examplebaseurl.byappdirect.com' }); ``` --- # List payment methods After you create a payment method for a user, use the following method to retrieve it. ``` adPayment.listPaymentMethods(userUUID, companyUUID) .then(function(response) { // return a summary of the payment methods }) .error(function(error) { // handle the error }); ``` **Response** ``` [ { "id": "b8e44163-6542-4408-a6e7-eb8b8a88f23f", "paymentMethodType": "CARD", "properties": { "cardHolderName": "John Doe", "expirationMonth": "12", "expirationYear": "2022", "brand": "VISA", "number": "1111" }, "billingAddress": { "street1": "279 Prince St", "street2": "", "city": "Montreal", "country": "CA", "state": "Quebec", "zip": "H3C 2N4", "phone": "8889871234" }, "default": true } ] ``` --- # Collect payment method information Before you can use payment.js to create a payment method, you must collect the purchaser's payment method details through a form or page in your checkout user interface. The required information varies by payment method type. Currently, only credit cards are supported. You must collect the information listed in the following tables and map the information to the indicated fields, which you will use during payment method creation. AppDirect does not perform field validation on the collected information (phone numbers, credit card numbers, and so on); you must incorporate such validation into your front end. note All of the fields in the following tables are required. ## Required fields for credit cards[​](#required-fields-for-credit-cards "Direct link to Required fields for credit cards") **Credit card information** | Field | Description | Example | | --------------- | -------------------------------------- | ------------------- | | cardHolderName | First and last name | John Doe | | number | Card number | 4111-1111-1111-1111 | | securityCode | Three to four-digit card security code | 321 | | expirationMonth | Card expiration month (number) | 6 | | expirationYear | Card expiration year (number) | 2025 | **Billing address information** | Field | Description | Example | | ------- | ------------------------------- | --------------- | | city | City or town | Boston | | country | Country code in ISO-3166 format | US | | state | State, province, or region | MA | | street1 | First line of a street address | 123 Main Street | | zip | ZIP or postal code | 02125 | --- # Create the paymentMethod object The `paymentMethod` object contains all of the payment method information that the end user provides (see [Collect payment method information](/user-guides/billing-and-subscription/rest-api/payment-js-library/collect-information.md)), and is required for both authorization scenarios. It is your responsibility to validate the data. note When you use the payment.js library, you can only store one payment method per user. When you create a new payment method, it overwrites the existing payment method. There is no way to manage multiple payment methods and designate one as the default, which you can do with the Payment Methods API or through the AppMarket user interface. ``` const paymentMethod = { paymentMethodType: "CARD", currency: "USD", accountDisplay: "", properties: { number: "4111111111111111", securityCode: "111", cardHolderName: "John Doe", expirationMonth: "1", expirationYear: "2021", brand: "VISA" }, billingAddress: { firstName: "John", lastName: "Doe", street1: "123 Main St.", city: "Springfield", state: "MA", country: "US", zip: "20156" } }; ``` --- # Payment.js GitHub repository The payment.js library and examples are available on GitHub in the following repository: --- # Include payment.js Include the following code on your page to access payment.js: ``` ``` --- # Retrieve supported payment method types Before you can create a payment method with payment.js, use the `getSupportedPaymentMethodTypes` method to determine which payment method types your marketplace supports. note Currently, credit cards are the only supported payment method types. Example ``` adPayment.getSupportedPaymentMethodTypes() .then(function(response) { // render a form with the payment method definition }) .error(function(error) { // handle the error }); ``` --- # Retrieve user and company IDs To create payment methods, you need the user and company ID of the future payment method owner. To retrieve the IDs, use the Payment Method REST API. The following endpoints return all marketplace users and companies, respectively. * GET /api/account/v2/users * GET /api/account/v2/companies ## Retrieve user IDs[​](#retrieve-user-ids "Direct link to Retrieve user IDs") Use the [List all users](/rest.md#tag/User/operation/resource_User_readAllUsers_GET) request to list all marketplace users. ``` GET /api/account/v2/users ``` You can search the results for the desired user's name. In the response, the `uuid` property contains the user ID that you need for subsequent API requests. **Example** ``` curl -X GET \ https://example.byappdirect.com/api/account/v2/users\ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ ``` **Response (some fields omitted for brevity)** ``` { "links": [], "content": [ { "uuid": "2f93cb24-f7b9-433f-875e-bb0dd9b0f1c1", "email": "jsmith@example.com", "userName": "jsmith@example.com", "firstName": "John", "lastName": "Smith", ... "openId": "https://example.byappdirect.com/openid/id/2f93cb24-f7b9-433f-875e-bb0dd9b0f1c1", }, ... } ``` ## Retrieve company IDs[​](#retrieve-company-ids "Direct link to Retrieve company IDs") Use the [List all companies](/rest.md#tag/Companies/operation/resource_Company_readAllCompanies_GET) request to list all marketplace companies. ``` GET /api/account/v2/companies ``` You can search the results for the desired company by name. In the response, the first `uuid` property contains the company ID that you need for subsequent API requests. **Example** ``` curl -X GET \ https://example.byappdirect.com/api/account/v2/companies \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ ``` **Response (some fields omitted for brevity)** ``` { "links": [], "content": [ ... { "uuid": "6b4bd452-895d-4098-aa56-e6046b238e0f", "name": "Appdirect", "enabled": true, "address": { "street1": "50 Grove St.", "street2": "", "city": "Somerville", "state": "MA", "zip": "02114", "country": "US" }, ... } ], "page": { "size": 100, "totalElements": 2171, "totalPages": 22, "number": 0 }, ... } ``` --- # Test the library We recommend that you use your test marketplace to test your payment.js implementation before deploying it to production. --- # Checkout [Checkout](https://help.appdirect.com/platform/Checkout/) provides a way for customers to make purchases. AppDirect’s Checkout APIs can be leveraged to build transactional flows, without having to integrate or rely on AppDirect’s frontend so you can craft ordering flows that fit your needs. AppDirect Checkout uniquely supports a wide range of pricing scenarios (one-time, subscription, contract) and many features designed to support complex digital products. ## The checkout flow[​](#the-checkout-flow "Direct link to The checkout flow") In order to use Checkout APIs to extend cart management functions, it is essential to configure authentication, set up a user and account/company base, and add products so that this foundation can be used to call the checkout APIs. If you look at the entire end-to-end flow for Checkout, the first phase involves setting up user and account details. This information is then used to work with various cart-specific APIs. The following conceptual diagrams provide a breakdown of the various steps involved and why they are important in how checkout flows work end-to-end. ### User and account creation[​](#user-and-account-creation "Direct link to User and account creation") ![](/assets/images/headlessuserandaccountcreationfinal-1b4fd2a011ab044129bcf0865f1dd4e3.png) ### Headless checkout flow[​](#headless-checkout-flow "Direct link to Headless checkout flow") ![](/assets/images/headlesscheckoutnew-121d02d051a39b1f3250cbfea1a825f2.png) --- # Error handling GraphQL queries and mutations can generate errors that fall into two categories - developer errors and user errors. Developer errors occur when you try to customize applications that use our GraphQL APIs. They indicate that something went wrong during the request, which could be due to a server issue such as a server exception, dependency issues, or an issue in the developer's integration such as unauthorized access or an entity not found. Such errors can occur with both queries and mutations. We’ve tried to cover some of these errors in this section. | Error type/description | Extension code | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | | Input Format Errors - *Example: An empty string is provided as an input for `cartId`* | `BAD_REQUEST` | | Graphql syntax errors - *Example: Sub-fields of an object are not provided for a query/mutation* | `GRAPHQL_VALIDATION_FAILED` | | Entity not found - *Example: The client lacks valid authentication credentials but requests a field which at a minimum requires authentication* | `NOT_FOUND` | | Authentication or authorization issues - *Example: The client lacks valid authentication credentials but requests a field which at a minimum requires authentication* | `UNAUTHORIZED` | | Client has insufficient authorization permissions to perform an action - *Example: The bearer token provided in the authorization header doesn’t have necessary permissions to perform a action* | `FORBIDDEN` | | Query cost limit exceeded - *Example: The client has exceeded the allowed limit for a single request* | `RESOURCE_LIMIT_EXCEEDED` | | Rate limit exceeded - *The client has exceeded the allowed limit for multiple requests during a given period of time* | `RATE_LIMIT_EXCEEDED` | | Server errors\* | `INTERNAL_SERVER_ERROR` | **For example:** Mutation: ``` mutation applyDiscountToCart($input: ApplyDiscountInput!) { applyDiscountToCart(input: $input) { cart { id items { id } } } } ``` Input: ``` { "input": { "cartId": "", "discountCode": "FOOBAR" } } ``` Output: ``` { "errors": [ { "message": "cartId cannot be empty", "path": [ "applyDiscountToCart" ], "extensions": { "code": "BAD_REQUEST" } } ], "data": { "applyDiscountToCart": null } } ``` ### Other errors[​](#other-errors "Direct link to Other errors") In addition to some of the common errors mentioned above, you may also encounter other errors based on your inputs and due to validation issues related to business rules. For instance, if you try to apply an invalid discount code while placing an order, the mutation will return an error. We've covered some of these errors as well in the respective sections for mutations. --- # Getting started Before you can get started with Checkout APIs to manage carts and create a personalized checkout experience, you must ensure that the following prerequisites are in place. ## Prerequisites[​](#prerequisites "Direct link to Prerequisites") 1. Join an AppDirect marketplace and ensure that you have the Marketplace Manager user role. 2. Ensure that the products required for purchase are already set up in the marketplace. . 3. Create [API clients](https://help.appdirect.com/platform/MarketplaceConfiguration/IntegrateExtrnalSyswithMrktplc/APIClients/). 4. [Fetch the access token](#how-to-fetch-the-access-token-using-a-client-id-and-secret). 5. [Create a new user](https://developer.appdirect.com/rest#tag/AppResellerAccount/operation/resource_AppResellerAccountV1UserApi_post_POST) and an [account/company](https://developer.appdirect.com/rest#tag/AppResellerAccount/operation/resource_AppResellerAccountV1CompanyApi_post_POST). Fetch the userId and accountId subsequently. Or Use [queries](https://developer.appdirect.com/user-guides/user-companies/rest/readuserdetails#read-users-graphql) for existing user and account details to call Checkout APIs. 6. [Assign users to an account/company](https://developer.appdirect.com/user-guides/user-companies/rest/createcompanyaccountmemberships#create-an-account-membership-graphql). For more information on how to use user and account management functions, refer to the [help](https://developer.appdirect.com/user-guides/user-companies/rest/). 7. Obtain a new access token or use one that is already generated (please see step 4). This access token is included in the header section of each query and mutation as defined below: `Authorization:Bearer access_token` ## Checkout authentication[​](#checkout-authentication "Direct link to Checkout authentication") As part of the authentication process for checkout, you have to first generate a client Id and secret. ### How to generate a Client Id and secret?[​](#how-to-generate-a-client-id-and-secret "Direct link to How to generate a Client Id and secret?") 1. Log in to an AppDirect Marketplace with the Marketplace Manager role. 2. Go to **Manage** > **Marketplace** > **Settings** > Integration|**API Clients**. The **API Clients** page opens. ![](/assets/images/APIclientsnew-d533d3d0e5da6a91f09b8ecbbffd6779.png) 3. Click **Create API Client**. The **API Client Settings** dialog opens. ![](/assets/images/APIclientsettingsnew-a381c90134ed959fd061d67da69693e6.png) 4. Enter a name for the API client. Fill out other information as shown in the image below. 5. Under **Client Type**, select **Non-interactive application**. 6. Under **Allowed scopes**, in the **System-level scopes** field, select **Read and write**. ![](/assets/images/Allowedscopes-220d4a234e959e4024266ab97a7a257f.png) 7. Click **Save settings** to generate the Client Id and secret. These are used to fetch the access token that is required to call Checkout APIs. ![](/assets/images/APIclients2-1d9db0fac93644b8cac8d76e100babfd.png) ### How to fetch the access token using a Client Id and secret?[​](#how-to-fetch-the-access-token-using-a-client-id-and-secret "Direct link to How to fetch the access token using a Client Id and secret?") Use the Client Id and secret to retrieve an access token. Send a POST request with the Client id and secret as parameters. See request details below: **Method:** `POST` **URL:** `https://marketplace-url/oauth2/token` **Query parameters:** ``` grant_type:client_credentials client_id: client_secret: scope:ROLE_PARTNER ``` **Response**: ``` { "access_token": "oGbdEBNJ6vKQip5RTQ0mgXGj48kvxjTMWNRPc6r-kRfYig", "token_type": "bearer", "expires_in": 43199, "scope": "ROLE_PARTNER" } ``` --- # Checkout APIs Checkout GraphQL APIs can be executed by sending an `HTTP POST` request to the following URL: ``` https:///api/graphql ``` Send requests using the URL with a query/mutation and variables, or a GraphQL client library. **Method:** `POST` **URL:** `https://marketplace-url/api/graphql`

If the API is in preview phase, then use: `https://marketplace-url/api/graphql/preview`

**Headers:** ``` Authorization: Bearer Content-Type: application/json ``` Here's an example of a request payload in json: ``` { "query": "mutation addItemsToCart($input: AddItemsInput!) {\n addItemsToCart(input: $input) {\n cart {\n id\n items {\n id\n product {\n name\n }\n }\n pricingTotal {\n amountDueAfterTax\n totalTaxAmount\n }\n }\n }\n}\n", "variables": { "input": { "items": [ { "pricingPlanId": "ae1acd7c-e161-4dc1-8b35-1865138874ce" } ], "userId": "95cce1ea-37fb-431d-9f5a-7df387b7e8e4", "accountId": "9faf88c2-9e58-4f5b-a009-5dc9094fe2a0" } } } ``` ## List of APIs[​](#list-of-apis "Direct link to List of APIs") Use the various GraphQL and REST APIs described in this section of the guide to extend the capabilities of Checkout to build and manage customized workflows. * [Fetch the details of an active cart](https://developer.appdirect.com/user-guides/checkout/graphql/fetchdetailsactive) * [Add items to a cart](https://developer.appdirect.com/user-guides/checkout/graphql/additemstocart) * [Remove items from a cart](https://developer.appdirect.com/user-guides/checkout/graphql/removeitemsfromacart) * [Apply/remove discount codes](https://developer.appdirect.com/user-guides/checkout/graphql/applyremovediscount) * [Get the cart fields](https://developer.appdirect.com/user-guides/checkout/graphql/getcartfields) * [Update cart details](https://developer.appdirect.com/user-guides/checkout/graphql/updatecartdetails) * [Add/edit payment details](https://developer.appdirect.com/user-guides/checkout/graphql/addeditpaymentdetails) * [Fetch, add, and modify shipping details for a cart](https://developer.appdirect.com/user-guides/checkout/graphql/fetchaddmodifyshipping) * [Validate cart details](https://developer.appdirect.com/user-guides/checkout/graphql/validatecartdetails) * [Finalize a cart](https://developer.appdirect.com/user-guides/checkout/graphql/finalizeacart) * [Fetch checkout settings](https://developer.appdirect.com/user-guides/checkout/graphql/fetchcheckoutsettings) --- # Add/edit payment details Use the following REST APIs to add or edit payment details and methods such as bank accounts, card details, and so on. Currently, only REST APIs exist to support these functions. 1. Use the [paymentMethodTypes](https://developer.appdirect.com/rest#tag/Payment-Methods/operation/getPaymentMethodTypes) API to retrieve all the supported payment method types on the Marketplace: ``` {marketplaceBaseUrl}/api/appMarket/v2/paymentMethodTypes ``` 2. Use the [list paymentMethods](/rest.md#tag/Payment-Methods/operation/getPaymentMethods) API to retrieve previously saved payment methods: ``` {marketplaceBaseUrl}/api/appMarket/v2/paymentMethods ``` 3. Use the [set default payment method](/rest.md#tag/Payment-Methods/operation/setDefaultPaymentMethod) API to set a default payment method from the existing list of payment methods: ``` {marketplaceBaseUrl}/api/appMarket/v2/paymentMethods/defaults ``` 4. Use the [create new payment method](/rest.md#tag/Payment-Methods/operation/createPaymentMethod) to create a payment method and set it as the default payment method: ``` {marketplaceBaseUrl}/api/appMarket/v2/paymentMethods ``` **Example:** Creating a payment method by providing the payment details for a card. **Method**: `POST` **URL**: `{marketplaceBaseUrl}/api/appMarket/v2/paymentMethods` **Input payload:** ``` { "companyId": "9faf88c2-9e58-4f5b-a009-5dc9094fe2a0", "ownerId": "df053b59-7ed7-4b88-9e69-02dd3223a0a3", "paymentMethodType": "CARD", "billingAddress": { "city": "Somerville", "country": "US", "state": "MA", "street1": "50 Grove St.", "zip": "02114", "phone": "4158523919" }, "properties": { "brand": "VISA", "cardHolderName": "Vikram", "expirationMonth": "02", "expirationYear": "2026", "number": "4321161213479781", "securityCode": "123" } } ``` **Response:** ``` { "id": "45759137-b74f-4770-af87-04e56b179979", "accountDisplay": "1111", "paymentMethodType": "CARD", "properties": { "expirationYear": "2026", "emailAddress": "dummy@appdirect.com", "cardHolderName": "Vikram", "expirationMonth": "02", "brand": "VISA" }, "billingAddress": { "street1": "50 Grove St.", "city": "Somerville", "country": "US", "state": "MA", "zip": "02114", "phone": "4158523919" }, "partyType": "COMPANY", "partyId": "2201698", "companyUuid": "9faf88c2-9e58-4f5b-a009-5dc9094fe2a0", "userUuid": "df053b59-7ed7-4b88-9e69-02dd3223a0a3", "gatewayKey": "{\"vaultedShopperId\":\"47574695\"}", "status": "ACTIVE", "default": true } ``` --- # Add items to a cart Use the [addItemsToCart](https://developer.appdirect.com/graphql-docs/additemstocart.doc) API to add an item(s) to a cart. It creates a new cart if no active carts are available. Items are instead added to an active cart, if one exists already. **Mutation**: ``` mutation addItemsToCart($input: AddItemsInput!) { addItemsToCart(input: $input) { cart { id items { id product { name } } pricingTotal { amountDueAfterTax totalTaxAmount } } } } ``` **Sample arguments:** *For a normal product* ``` { "input":{ "items": [ { "pricingPlanId":"ae1acd7c-e161-4dc1-8b35-1865138874ce" } ], "userId": "95cce1ea-37fb-431d-9f5a-7df387b7e8e4", "accountId": "9faf88c2-9e58-4f5b-a009-5dc9094fe2a0" } } ``` *For a domain product* ``` { "input":{ "items": [ { "pricingPlanId":"ae1acd7c-e161-4dc1-8b35-1865138874c", "domain":"meter.io" } ], "userId": "95cce1ea-37fb-431d-9f5a-7df387b7e8e4", "accountId": "9faf88c2-9e58-4f5b-a009-5dc9094fe2a0" } } ``` *For an associated addon product* ``` { "input":{ "items": [ { "pricingPlanId":"ae1acd7c-e161-4dc1-8b35-1865138874ce", "associations": { "pricingPlanId": "60ec4489-5bd0-4d98-8e13-8fafb31", "type": "ADDON" } } ], "userId": "95cce1ea-37fb-431d-9f5a-7df387b7e8e4", "accountId": "9faf88c2-9e58-4f5b-a009-5dc9094fe2a0" } } ``` **Sample output** ``` { "data": { "addItemsToCart": { "cart": { "id": "6512b7ff875fe104e5fde6da", "items": [ { "id": "b7ec8290-d984-4608-bca6-f31191e61f05", "product": { "name": "Tag and Track device 1" } }, { "id": "5dc0fe86-b66c-450d-bd6b-9c4a5e19e061", "product": { "name": "Stacked Web App (DO NOT EDIT OR CHANGE)" } } ], "pricingTotal": { "amountDueAfterTax": 474.1, "totalTaxAmount": 34.1 } } } } } ``` ## Common errors[​](#common-errors "Direct link to Common errors") For information on some of the common errors related to this mutation, refer to the section on [Error handling](/user-guides/checkout/errorhandling/.md). --- # Apply/remove discount codes Use the [applyDiscountToCart](https://developer.appdirect.com/graphql-docs/applydiscounttocart.doc) and [removeDiscountFromCart](https://developer.appdirect.com/graphql-docs/removediscountfromcart.doc) mutations to apply or remove eligible discounts from a cart before finalizing a purchase. Marketplace Managers create and manage discounts. For more information on discounts, refer to the [help](https://help.appdirect.com/platform/GettingStarted/Addproducts/merchandizeprod/create-discount). **Mutation**: ``` mutation applyDiscountToCart($input: ApplyDiscountInput!){ applyDiscountToCart(input: $input) { cart { id items { id product { name } discount { id code } } pricingTotal { amountDueAfterTax totalTaxAmount } } } } ``` ``` mutation removeDiscountFromCart($input: RemoveDiscountCodeInput!){ removeDiscountFromCart(input: $input){ cart { id items { id product { name } } pricingTotal { amountDueAfterTax totalTaxAmount } } } } ``` **Sample arguments** ``` { "input":{ "cartId": "95cce1ea-37fb-431d-9f5a-7df387b7e8e4", "discountCode": "FLAT_50_OFF" } } ``` **Sample output** ``` { "data": { "applyDiscountToCart": { "cart": { "id": "6512b7ff875fe104e5fde6da", "items": [ { "id": "b7ec8290-d984-4608-bca6-f31191e61f05", "product": { "name": "Tag and Track device 1" }, "discount": { "id": "33ec8290-d984-4608-bca3-f31191e61f12", "code": "FLAT_50_OFF } }, { "id": "5dc0fe86-b66c-450d-bd6b-9c4a5e19e061", "product": { "name": "Stacked Web App (DO NOT EDIT OR CHANGE)" }, "discount": null } ], "pricingTotal": { "amountDueAfterTax": 474.1, "totalTaxAmount": 34.1 } } } } } ``` ## Error handling:[​](#error-handling "Direct link to Error handling:") The above mentioned mutations for discounts return errors if a request is made with invalid data or headers. For more information on errors and how to handle them, refer to. The `applyDiscontToCart` can result in an error of type `InvalidDiscountCodeError`, if an invalid discount is provided as input. **Example** *Arguments:* ``` { "input": { "cartId": "6512b7ff875fe104e5fde6da", "discountCode": "RANDOM_DISCOUNT" } } ``` *Output:* ``` { "data": { "applyDiscountToCart": { "cart": null, "userErrors": [ { "__typename": "InvalidDiscountCodeError", "message": "Discount RANDOM_DISCOUNT does not exist or is expired.", "path": [ "input", "discountCode" ] } ] } } } ``` --- # Fetch, add, and modify shipping details for a cart Use the following REST APIs to add shipping details such as address and other related shipping information for any physical products in a cart. 1. Save or replace an existing shipping (delivery) address: **Method**:`POST` **URL**:`{marketplaceBaseUrl}/api/appMarket/v2/fulfillments` **Payload:** ``` { "shoppingCartId": "6512b7ff875fe104e5fde6da", "deliveryAddress": { "name": "Vikram", "city": "Somerville", "addressLine1": "50 Grove St1.", "countryCode": "US", "subdivisionCode": "MA", "postalCode": "02114" }, "sameAsBillingAddress": false } ``` **Sample response:** ``` { "content": [ { "originAddressSnapshotUuid": "dcaa0613-5384-472b-b33a-97cfe281cab3", "deliveryAddressSnapshotUuid": "f6e12f18-709d-417d-8f8a-899a5c1aa73b", "channelUuid": "3a772922-83a5-4c14-aff2-d68c7b1c6d45", "shoppingCartId": "6512b7ff875fe104e5fde6da", "sameAsBillingAddress": false, "state": "validated", "date": { "created": "2023-09-27T05:35:34.671Z", "updated": "2023-09-27T07:23:14.925Z" }, "uuid": "115fc7b4-43f6-4261-8ad7-a205502b17bb", "entityType": "fulfillment", "cartItemDetails": [ { "fulfillmentItemId": "1f50b9a6-b1e0-437a-aa28-8ff11e6489e2", "productId": "283573", "pricingPlanId": "53237150-1704-43bc-934e-81c91140a934", "cartItemId": "b7ec8290-d984-4608-bca6-f31191e61f05", "quantity": 1, "active": false, "shippers": [], "quantityShipped": 0, "quantityCancelled": 0, "isSupplierRejection": false, "isPartialRejection": false } ], "shipments": [], "shipmentRequests": [], "shippingQuotesExpiryDate": "2121-01-01T00:00:00.000Z", "shippingQuotes": [ { "name": { "en-US": "Free Shipping Standard" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "81087333-4e66-4d34-871a-62b13996d593", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "56a9cfeb-2ca7-422e-8a0e-1b9a9aa0fc9e" }, { "name": { "en-US": "FREE" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "7784aafe-ab3d-4343-a1c2-a4f8e0bea44d", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2" } ], "shippingCostEnabled": true, "defaultShipping": true, "companyUuid": "9faf88c2-9e58-4f5b-a009-5dc9094fe2a0", "currency": "USD", "shippingFee": { "shippingFeeId": "6eec217f-0f38-43bd-b7a6-59c9262fad6a", "shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2", "shoppingCartFeeId": "8be34b89-1aa5-468f-8663-ad725221dd43" }, "shoppingCartAmount": "440.0000000000", "userUuid": "1b6a48ea-98f6-49c6-9544-c6bb6936556b", "deliveryAddress": { "id": "c29dba53-f049-42bc-be24-52d4b82a9f04", "snapshot": "f6e12f18-709d-417d-8f8a-899a5c1aa73b", "name": "Vikram", "addressLine1": "50 Grove St1.", "street1": "50 Grove St1.", "city": "Somerville", "state": "MA", "stateCode": "MA", "subdivisionCode": "MA", "countryCode": "US", "country": "US", "postalCode": "02114", "zip": "02114", "created": "2023-09-27T05:35:33.099Z", "modified": "2023-09-27T05:35:33.099Z" }, "originAddress": { "id": "c8684631-aefd-4eeb-aeb7-b119636ab54e", "snapshot": "dcaa0613-5384-472b-b33a-97cfe281cab3", "name": "AppDirect (Please ensure that you are using a valid, US-based address)", "addressLine1": "651 California Street Floor 25", "addressLine2": "", "city": "San Francisco", "subdivisionCode": "CA", "countryCode": "US", "postalCode": "94108", "email": "", "phone": "", "created": "2019-09-07T16:50:19Z", "modified": "2023-08-10T09:55:36.274Z" }, "pendingFulfillmentItems": [ { "productId": "283573", "pricingPlanId": "53237150-1704-43bc-934e-81c91140a934", "fulfillmentItemId": "1f50b9a6-b1e0-437a-aa28-8ff11e6489e2", "cartItemId": "b7ec8290-d984-4608-bca6-f31191e61f05", "status": "PENDING_SUBSCRIPTION", "type": "MANUAL", "quantity": 1 } ], "fulfilledItems": [], "fulfillmentStatus": "UNFULFILLED" } ], "page": { "size": 50, "totalElements": 1, "totalPages": 1, "number": 1 } } ``` 1. Fetch previously saved shipping details such as delivery address, shipping fee options (Quotes), and so on. **Method**:`GET` **URL**:`{marketplaceBaseUrl}/api/appMarket/v2/fulfillments` **Query parameters**:`shoppingCartId={#cartId}` For example, `shoppingCartId= 6512b7ff875fe104e5fde6da` **Sample response:** ``` { "content": [ { "originAddressSnapshotUuid": "dcaa0613-5384-472b-b33a-97cfe281cab3", "deliveryAddressSnapshotUuid": "f6e12f18-709d-417d-8f8a-899a5c1aa73b", "channelUuid": "3a772922-83a5-4c14-aff2-d68c7b1c6d45", "shoppingCartId": "6512b7ff875fe104e5fde6da", "sameAsBillingAddress": false, "state": "validated", "date": { "created": "2023-09-27T05:35:34.671Z", "updated": "2023-09-27T07:23:14.925Z" }, "uuid": "115fc7b4-43f6-4261-8ad7-a205502b17bb", "entityType": "fulfillment", "cartItemDetails": [ { "fulfillmentItemId": "1f50b9a6-b1e0-437a-aa28-8ff11e6489e2", "productId": "283573", "pricingPlanId": "53237150-1704-43bc-934e-81c91140a934", "cartItemId": "b7ec8290-d984-4608-bca6-f31191e61f05", "quantity": 1, "active": false, "shippers": [], "quantityShipped": 0, "quantityCancelled": 0, "isSupplierRejection": false, "isPartialRejection": false } ], "shipments": [], "shipmentRequests": [], "shippingQuotesExpiryDate": "2121-01-01T00:00:00.000Z", "shippingQuotes": [ { "name": { "en-US": "Free Shipping Standard" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "81087333-4e66-4d34-871a-62b13996d593", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "56a9cfeb-2ca7-422e-8a0e-1b9a9aa0fc9e" }, { "name": { "en-US": "FREE" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "7784aafe-ab3d-4343-a1c2-a4f8e0bea44d", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2" } ], "shippingCostEnabled": true, "defaultShipping": true, "companyUuid": "9faf88c2-9e58-4f5b-a009-5dc9094fe2a0", "currency": "USD", "shippingFee": { "shippingFeeId": "6eec217f-0f38-43bd-b7a6-59c9262fad6a", "shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2", "shoppingCartFeeId": "8be34b89-1aa5-468f-8663-ad725221dd43" }, "shoppingCartAmount": "440.0000000000", "userUuid": "1b6a48ea-98f6-49c6-9544-c6bb6936556b", "deliveryAddress": { "id": "c29dba53-f049-42bc-be24-52d4b82a9f04", "snapshot": "f6e12f18-709d-417d-8f8a-899a5c1aa73b", "name": "Vikram", "addressLine1": "50 Grove St1.", "street1": "50 Grove St1.", "city": "Somerville", "state": "MA", "stateCode": "MA", "subdivisionCode": "MA", "countryCode": "US", "country": "US", "postalCode": "02114", "zip": "02114", "created": "2023-09-27T05:35:33.099Z", "modified": "2023-09-27T05:35:33.099Z" }, "originAddress": { "id": "c8684631-aefd-4eeb-aeb7-b119636ab54e", "snapshot": "dcaa0613-5384-472b-b33a-97cfe281cab3", "name": "AppDirect (Please ensure that you are using a valid, US-based address)", "addressLine1": "651 California Street Floor 25", "addressLine2": "", "city": "San Francisco", "subdivisionCode": "CA", "countryCode": "US", "postalCode": "94108", "email": "", "phone": "", "created": "2019-09-07T16:50:19Z", "modified": "2023-08-10T09:55:36.274Z" }, "pendingFulfillmentItems": [ { "productId": "283573", "pricingPlanId": "53237150-1704-43bc-934e-81c91140a934", "fulfillmentItemId": "1f50b9a6-b1e0-437a-aa28-8ff11e6489e2", "cartItemId": "b7ec8290-d984-4608-bca6-f31191e61f05", "status": "PENDING_SUBSCRIPTION", "type": "MANUAL", "quantity": 1 } ], "fulfilledItems": [], "fulfillmentStatus": "UNFULFILLED" } ], "page": { "size": 50, "totalElements": 1, "totalPages": 1, "number": 1 } } ``` 1. Update the shipping fee option: **Method**: `POST` **URL**:`{marketplaceBaseUrl}/api/appMarket/v2/fulfillments/{#fulfillmentUuid}/shippingFees` Example URL: **Payload**: ``` {"shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2"} ``` *fullfillmentUuid & shippingQuoteId can be retrieved from the api response of fetching or saving shipping address mentioned earlier* **Sample response:** ``` { "originAddressSnapshotUuid": "dcaa0613-5384-472b-b33a-97cfe281cab3", "deliveryAddressSnapshotUuid": "a39f2d45-d264-4fff-b246-d8f84fa9a4a4", "channelUuid": "3a772922-83a5-4c14-aff2-d68c7b1c6d45", "shoppingCartId": "6512b7ff875fe104e5fde6da", "sameAsBillingAddress": false, "state": "validated", "date": { "created": "2023-09-27T05:35:34.671Z", "updated": "2023-09-27T07:23:14.925Z" }, "uuid": "115fc7b4-43f6-4261-8ad7-a205502b17bb", "entityType": "fulfillment", "cartItemDetails": [ { "fulfillmentItemId": "61ea0ba5-a3d2-4246-a155-cbe8336c8885", "productId": "283573", "pricingPlanId": "53237150-1704-43bc-934e-81c91140a934", "cartItemId": "b7ec8290-d984-4608-bca6-f31191e61f05", "quantity": 1, "active": false, "shippers": [], "quantityShipped": 0, "quantityCancelled": 0, "isSupplierRejection": false, "isPartialRejection": false } ], "shipments": [], "shipmentRequests": [], "shippingQuotesExpiryDate": "2121-01-01T00:00:00.000Z", "shippingQuotes": [ { "name": { "en-US": "Free Shipping Standard" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "81087333-4e66-4d34-871a-62b13996d593", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "56a9cfeb-2ca7-422e-8a0e-1b9a9aa0fc9e" }, { "name": { "en-US": "FREE" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "7784aafe-ab3d-4343-a1c2-a4f8e0bea44d", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2" } ], "shippingCostEnabled": true, "defaultShipping": true, "processedShoppingCarts": { "a98134f83ef0b838d1869170c6a9f2b1": { "shippingQuotes": [ { "name": { "en-US": "Free Shipping Standard" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "81087333-4e66-4d34-871a-62b13996d593", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "56a9cfeb-2ca7-422e-8a0e-1b9a9aa0fc9e" }, { "name": { "en-US": "FREE" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "7784aafe-ab3d-4343-a1c2-a4f8e0bea44d", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2" } ], "subtotalWithoutFees": "430.0000000000", "cartItemDetails": [ { "fulfillmentItemId": "1f50b9a6-b1e0-437a-aa28-8ff11e6489e2", "productId": "283573", "pricingPlanId": "53237150-1704-43bc-934e-81c91140a934", "cartItemId": "b7ec8290-d984-4608-bca6-f31191e61f05", "quantity": 1, "active": false, "shippers": [] } ], "isCalculatedQuotes": false, "expiry": 1695800136842 }, "eed309a70e8827515e88939e137fcc77": { "shippingQuotes": [ { "name": { "en-US": "Free Shipping Standard" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "81087333-4e66-4d34-871a-62b13996d593", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "56a9cfeb-2ca7-422e-8a0e-1b9a9aa0fc9e" }, { "name": { "en-US": "FREE" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "7784aafe-ab3d-4343-a1c2-a4f8e0bea44d", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2" } ], "subtotalWithoutFees": "440.0000000000", "cartItemDetails": [ { "fulfillmentItemId": "1f50b9a6-b1e0-437a-aa28-8ff11e6489e2", "productId": "283573", "pricingPlanId": "53237150-1704-43bc-934e-81c91140a934", "cartItemId": "b7ec8290-d984-4608-bca6-f31191e61f05", "quantity": 1, "active": false, "shippers": [] } ], "isCalculatedQuotes": false, "expiry": 1695806594912 }, "328f086d6c4f8328572651c9df9a586c": { "shippingQuotes": [ { "name": { "en-US": "Free Shipping Standard" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "81087333-4e66-4d34-871a-62b13996d593", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "56a9cfeb-2ca7-422e-8a0e-1b9a9aa0fc9e" }, { "name": { "en-US": "FREE" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "7784aafe-ab3d-4343-a1c2-a4f8e0bea44d", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2" } ], "subtotalWithoutFees": "440.0000000000", "cartItemDetails": [ { "fulfillmentItemId": "1af7c574-28b3-4d75-a1bd-c049c5151ebd", "productId": "283573", "pricingPlanId": "53237150-1704-43bc-934e-81c91140a934", "cartItemId": "b7ec8290-d984-4608-bca6-f31191e61f05", "quantity": 1, "active": false, "shippers": [] } ], "isCalculatedQuotes": false, "expiry": 1695824259352 }, "3dabdf0ef5ed050b1b1420d8b7ee77cb": { "shippingQuotes": [ { "name": { "en-US": "Free Shipping Standard" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "81087333-4e66-4d34-871a-62b13996d593", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "56a9cfeb-2ca7-422e-8a0e-1b9a9aa0fc9e" }, { "name": { "en-US": "FREE" }, "shippingCostMethod": "TOTAL_ITEMS_COST", "shippingRateId": "7784aafe-ab3d-4343-a1c2-a4f8e0bea44d", "serviceType": "STANDARD", "currency": "USD", "cost": 0, "isFree": true, "shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2" } ], "subtotalWithoutFees": "440.0000000000", "cartItemDetails": [ { "fulfillmentItemId": "61ea0ba5-a3d2-4246-a155-cbe8336c8885", "productId": "283573", "pricingPlanId": "53237150-1704-43bc-934e-81c91140a934", "cartItemId": "b7ec8290-d984-4608-bca6-f31191e61f05", "quantity": 1, "active": false, "shippers": [] } ], "isCalculatedQuotes": false, "expiry": 1695824338095 } }, "companyUuid": "9faf88c2-9e58-4f5b-a009-5dc9094fe2a0", "currency": "USD", "shippingFee": { "shippingFeeId": "bc468e33-ebc2-4710-8375-399990f2d84c", "shippingQuoteId": "e3c98671-7e3a-41ee-be52-a662634192e2", "shoppingCartFeeId": "2f45cafe-524c-46df-8ac9-bc954bd4fdec" }, "shoppingCartAmount": "440.0000000000", "userUuid": "1b6a48ea-98f6-49c6-9544-c6bb6936556b", "pendingFulfillmentItems": [ { "productId": "283573", "pricingPlanId": "53237150-1704-43bc-934e-81c91140a934", "fulfillmentItemId": "61ea0ba5-a3d2-4246-a155-cbe8336c8885", "cartItemId": "b7ec8290-d984-4608-bca6-f31191e61f05", "status": "PENDING_SUBSCRIPTION", "type": "MANUAL", "quantity": 1 } ], "fulfilledItems": [], "fulfillmentStatus": "UNFULFILLED" ``` --- # Fetch checkout settings Use the [checkoutSettings](https://developer.appdirect.com/graphql-docs/checkoutsettings_query.doc) query to fetch certain marketplace settings that can be leveraged during the Checkout process. Here are some of the marketplace settings that are relevant to Checkout: | Setting name | Description | | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | | `tenant` | A unique code or identifier of the marketplace. | | `marketplaceBaseUrl` | The base URL of the marketplace. | | `supportEmail` | The email ID of support in different locales. | | `supportPhone` | The contact number of support. | | `supportedLocales` | Represents the locales supported by the marketplace. | | `defaultLocale` | Represents the default locale configured on the Marketplace. | | `marketplaceLogoUrl` | A unique code or identifier of the marketplace. | | `marketplaceFaviconUrl` | The URL of the favicon image uploaded in the marketplace. | | `marketplaceTermsAndConditionsUrl` | The URL for the marketplace terms and conditions in different locales. | | `marketplacePrivacyUrl` | The URL of the marketplace privacy policy in different locales. | | `flatTaxRate` | The flat tax rate that is applied to prices. | | `allowDiscountCredit` | The setting to determine If the total order price is less than the applied fixed-price discount value. Anything extra will be credited to the customer. | | `shippingCostEnabled` | Indicates if the Marketplace Manager has enabled or defined the shipping costs based on total value of the order. | **Query:** ``` query checkoutSettings { checkoutSettings { allowDiscountCredit defaultLocale marketplaceBaseUrl flatTaxRate marketplaceFaviconUrl marketplaceLogoUrl shippingCostEnabled supportPhone supportedLocales tenant supportEmail { locale value } marketplaceTermsAndConditionsUrl { locale value } marketplacePrivacyUrl { locale value } } } ``` **Sample output:** ``` { "data": { "checkoutSettings": { "allowDiscountCredit": false, "defaultLocale": "en-US", "marketplaceBaseUrl": "https://engage19billing.test.devappdirect.me/", "flatTaxRate": 0.0775, "marketplaceFaviconUrl": "https://d33na3ni6eqf5j.cloudfront.net/marketplace_favicon/img2215763989268234956.jpg?291f565d5f467161bc179ef74050d2d4", "marketplaceLogoUrl": "https://d33na3ni6eqf5j.cloudfront.net/marketplace_logo/img5456757645046230491.jpg?2b1671c50b21fb5f91e434dbdf00a7d7", "shippingCostEnabled": true, "supportPhone": "(403) 999-9999", "supportedLocales": [ "en-US", "it-CH", "fr-CA" ], "tenant": "ENGAGE19BILLING", "supportEmail": [ { "locale": "en-US", "value": "supportenus@example.com" }, { "locale": "it-CH", "value": "supportitch@example.com" }, { "locale": "fr-CA", "value": "supportfrca@example.com" } ], "marketplaceTermsAndConditionsUrl": [ { "locale": "en-US", "value": "https://www.example.com/?terms&test=2" }, { "locale": "it-CH", "value": "https://www.example.com/it-ch/terms" }, { "locale": "fr-CA", "value": "https://www.example.com/fr-ca/terms" } ], "marketplacePrivacyUrl": [ { "locale": "en-US", "value": "https://www.example.com/privacy1" }, { "locale": "it-CH", "value": "https://www.example.com/it-ch/privacy" }, { "locale": "fr-CA", "value": "https://www.example.com/fr-ca/privacy" } ] } } } ``` ## Common errors[​](#common-errors "Direct link to Common errors") For information on some of the common errors related to this mutation, refer to the section on [Error handling](/user-guides/checkout/errorhandling/.md). --- # Fetch the details of an active cart Use the [activeCartOfUser](https://developer.appdirect.com/graphql-docs/activecartofuser_query.doc) query to fetch the active cart of a user in a marketplace. It can be used at any point during the checkout process, such as, after adding items to a cart, removing items from a cart, and updating cart items, to fetch the latest cart data. **Query:** ``` query activeCartOfUser($input: ActiveCartOfUserInput!) { activeCartOfUser(input: $input) { createdOn currency id items { id edition { id code name } product { id name } units { quantity unit } } pricingTotal { amountDueAfterTax amountDueBeforeTax shippingFeeAmount recurringTotals { totalSalePrice totalSalePriceTaxIncluded billingCycle { dayOfMonth period } } taxSummary { description taxAmount } totalTaxAmount } } } ``` **Sample arguments:** ``` { "input": { "userId": "58dc8384-a60c-4a32-a949-80bf06cbc40a", "accountId": "54df8520-2605-4b8f-96b7-f84adef2898a" } } ``` **Sample output:** ``` { "data": { "activeCartOfUser": { "createdOn": "2023-09-25T12:28:08.000Z", "currency": "USD", "id": "65117cd8ce3df31e68af9446", "items": [ { "id": "8dff5f47-60ed-40cf-9c29-133a52cf3d86", "edition": { "id": "c424c2cc-ec60-4747-b347-3ac0dd41ddd3", "code": "CFQ7TTC0LF8Q:0001", "name": "Office 365 Enterprise E1" }, "product": { "id": "21cd2a44-213c-40bc-8d38-1c3117b4b7e4", "name": "Office 365 for Enterprises" }, "units": [ { "quantity": 10, "unit": "LICENSE" } ] } ], "pricingTotal": { "amountDueAfterTax": 90.51, "amountDueBeforeTax": 84, "shippingFeeAmount": null, "recurringTotals": [], "taxSummary": [ { "description": "Flat Tax", "taxAmount": 6.51 } ], "totalTaxAmount": 6.51 } } }, } ``` ## Common errors[​](#common-errors "Direct link to Common errors") For information on some of the common errors related to this mutation, refer to the section on [Error handling](/user-guides/checkout/errorhandling/.md). --- # Finalize a cart Use the [finalizeCart](https://developer.appdirect.com/graphql-docs/finalizecart.doc) mutation to finalize a purchase and place an order. This is the last step in the end-to-end Checkout process. **Mutation**: ``` mutation finalizeCart($input: FinalizeCartInput!) { finalizeCart(input: $input) { purchaseDetails { purchaseId purchaseNumber } userErrors { ... on DetailedUserError { __typename blockingErrors { code itemId message messageParameters { key value } } errorCode message path status } } } } ``` **Sample arguments:** ``` { "input": { "cartId": "643d307d312f6e1ffbb17efd", "agreeToTerms": true } } } ``` **Sample output:** ``` { "data": { "finalizeCart": { "purchaseDetails": { "purchaseId": "25f7dcee-325c-40f9-98ee-019b7d4bc985", "purchaseNumber": "024283" } } } } ``` ## Error handling[​](#error-handling "Direct link to Error handling") In addition to the common errors that result from requests with invalid data or headers, this mutation can also result in specific user errors when there's a failure in one of the business rules. **Example output:** ``` { "data": { "finalizeCart": { "purchaseDetails": null, "userErrors": [ { "__typename": "DetailedUserError", "message": "Payload is not valid", "path": [], "status": 400, "blockingErrors": [ { "code": "REQUIRED_FIELD_VALIDATION_ERROR", "message": "Required field 'UserPrincipleName' has failed validation: The specified username is not valid (contains invalid characters, is 'admin' or is unavailable).", "itemId": "2719df25-2599-48c0-a0c1-924d06b02c27", "messageParameters": [ { "key": "REQUIRED_FIELD_KEY", "value": "UserPrincipleName", }, { "key": "REQUIRED_FIELD_ERROR_MESSAGE", "value": "Required field 'UserPrincipleName' has failed validation: The specified username is not valid (contains invalid characters, is 'admin' or is unavailable). ", }, ] } ] } ] } } } ``` | Error code | Description | | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | | `SUBSCRIPTION_CUSTOM_ATTRIBUTE_VALIDATIONS_ERROR` | This error occurs if the details of the subscription custom attributes are invalid. | | `PURCHASE_CUSTOM_ATTRIBUTE_VALIDATIONS_ERROR` | This error occurs if the details of the purchase custom attributes are invalid. | | `REQUIRED_FIELD_VALIDATION_ERROR` | This error occurs if the details of the product fields are invalid. | | `INVALID_ITEM_QUANTITIES` | This error occurs if the unit quantity value is invalid. | | `DAILY_SPEND_LIMIT_EXHAUSTED` | This error occurs if the daily spend limit is enabled and the cart value exceeds the limit. | | `THIRTY_DAYS_SPEND_LIMIT_EXHAUSTED` | This error occurs if the monthly spend limit is enabled and the cart value exceeds the limit for the month. | | `DEFAULT_PAYMENT_METHOD_NOT_FOUND` | These errors occur if a default payment method is required but is missing. | | `PURCHASE_PRE_AUTH_FAILED` | This error occurs if the Payment Authorization fails. | --- # Get cart fields Use the [cartFields](https://developer.appdirect.com/graphql-docs/cartfields_query.doc) query to fetch the definitions of certain attributes related to cart or cart items. These are either configured by the ISV or by the Marketplace Manager or both. It fetches 3 types of fields: * `productFields` * `subscriptionCustomAttributes` * `purchaseCustomAttributes` These field definitions can be used to construct form fields so that necessary data can be captured. **Query:** ``` query cartFields($cartId: ID!, $locale: Locale!) { cartFields(cartId: $cartId, locale: $locale) { productFields { itemId forms { title subTitle fields { fieldType inputCode inputTitle tooltip subTitle validations { expression maxLength minLength readOnly required } } } } purchaseCustomAttributes { fieldType inputCode inputTitle tooltip subTitle validations { expression maxLength minLength readOnly required } } subscriptionCustomAttributes { fieldType inputCode inputTitle subTitle tooltip validations { expression maxLength readOnly required minLength } } } } ``` **Sample arguments** ``` { "cartId": "65117cd8ce3df31e68af9446", "locale": "en-US" } ``` **Sample arguments** ``` { "input":{ "cartId": "95cce1ea-37fb-431d-9f5a-7df387b7e8e4", "discountCode": "FLAT_50_OFF" } } ``` **Sample output** ``` { "data": { "cartFields": { "productFields": [ { "itemId": "8dff5f47-60ed-40cf-9c29-133a52cf3d86", "forms": [ { "title": "Additional Information", "subTitle": "Additional information required by platform", "fields":[ { "fieldType": "TEXT", "inputCode": "SubDomain", "inputTitle": "Your Microsoft tenant name", "tooltip": "The name of your Microsoft primary domain - otherwise known as tenant. This cannot be changed once provisioned, however you can change to a custom domain later.", "subTitle": "", "validations": { "expression": "^[a-zA-Z0-9.]{1,}$", "maxLength": 255, "minLength": 1, "readOnly": false, "required": true } }, { "fieldType": "TEXT", "inputCode": "UserPrincipleName", "inputTitle": "Username", "tooltip": "The username you will use to sign in to Office 365. A separate admin username will be provisioned, per Microsoft requirements.", "subTitle": "", "validations": { "expression": "^(?=.*[a-zA-Z0-9]{1,})(?!\\s*$)(?!\\b([a-zA-ZÀ-ǿ0-9!#$%&.'*/=?^_`{|}~-])\\1\\1+\\b)(?:[a-zA-ZÀ-ǿ0-9!#$%&.'*/=?^_`{|}~-]+(?:\\.[a-zA-ZÀ-ǿ0-9!#$%&.'*/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e\\x1f\\x21\\x23\\x5b\\x5d\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e\\x7f])*\")$", "maxLength": 255, "minLength": 1, "readOnly": false, "required": true, "validationType": null } }, { "fieldType": "EMAIL", "inputCode": "AlternateEmail", "inputTitle": "Alternate email address", "tooltip": "An email address that you currently use. Your new Office 365 account information and notifications will be sent to it.", "subTitle": "", "validations": { "expression": "^(?:[a-zA-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?!.*\\.microsoft.com|microsoft.com)(?:(?:[a-zA-z0-9](?:[a-zA-z0-9-]*[a-zA-z0-9])?\\.)+[a-zA-z0-9](?:[a-zA-z0-9-]*[a-zA-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-z0-9-]*[a-zA-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$", "maxLength": 255, "minLength": 2, "readOnly": false, "required": true } }, { "fieldType": "TEXT", "inputCode": "FirstName", "inputTitle": "First name", "tooltip": "", "subTitle": "", "validations": { "expression": "^[A-Za-zÀ-ǿ\\u0E00-\\u0E7F]+(((\\'|\\-|\\.(\\s)?|\\,(\\s)?|\\s)?([A-Za-zÀ-ǿ\\u0E00-\\u0E7F.'-])+))*$", "maxLength": 255, "minLength": 2, "readOnly": false, "required": true } }, "fieldType": "TEXT", "inputCode": "LastName", "inputTitle": "Last name", "tooltip": "", "subTitle": "", "validations": { "expression": "^[A-Za-zÀ-ǿ\\u0E00-\\u0E7F]+(((\\'|\\-|\\.(\\s)?|\\,(\\s)?|\\s)?([A-Za-zÀ-ǿ\\u0E00-\\u0E7F.'-])+))*$", "maxLength": 255, "minLength": 1, "readOnly": false, "required": true } }, { "fieldType": "COUNTRY", "inputCode": "Address/ISO3Country", "inputTitle": "Country", "tooltip": "", "subTitle": "", "validations": { "expression": "^[A-Za-z]{2}$", "maxLength": 3, "minLength": 2, "readOnly": false, "required": true } }, { "fieldType": "TEXT", "inputCode": "Address/Line1", "inputTitle": "Address line 1", "tooltip": "", "subTitle": "", "validations": { "expression": "^[A-Za-zÀ-ǿ0-9\\u0E00-\\u0E7F]+(((\\'|\\-|\\.|\\s)?([A-Za-zÀ-ǿ0-9\\u0E00-\\u0E7F.', -\\/])+))*(\\.)?$", "maxLength": 255, "minLength": 1, "readOnly": false, "required": true } }, { "fieldType": "TEXT", "inputCode": "Address/City", "inputTitle": "City", "tooltip": "", "subTitle": "", "validations": { "expression": "^[A-Za-zÀ-ǿ\\u0E00-\\u0E7F]+(((\\'|\\-|\\.(\\s)?|\\,(\\s)?|\\s)?([A-Za-zÀ-ǿ\\u0E00-\\u0E7F.'-])+))*$", "maxLength": 255, "minLength": 1, "readOnly": false, "required": true } }, { "fieldType": "STATE", "inputCode": "Address/State", "inputTitle": "State", "tooltip": "", "subTitle": "", "validations": { "expression": "^[A-Za-zÀ-ǿ0-9\\u0E00-\\u0E7F]+(((\\'|\\-|\\.(\\s)?|\\,(\\s)?|\\s)?([A-Za-zÀ-ǿ0-9\\u0E00-\\u0E7F])+))*$", "maxLength": 255, "minLength": 1, "readOnly": false, "required": true } }, { "fieldType": "ZIP_CODE", "inputCode": "Address/PostalCode", "inputTitle": "ZIP/Postal code", "tooltip": "", "subTitle": "", "validations": { "expression": "^[a-zA-ZÀ-ǿ0-9]+([- \\s]?[a-zA-ZÀ-ǿ0-9])*$", "maxLength": 255, "minLength": 1, "readOnly": false, "required": true, "validationType": null } }, { "fieldType": "PHONE_NUMBER", "inputCode": "Address/PhoneNumber", "inputTitle": "Phone number", "tooltip": "", "subTitle": "", "validations": { "expression": "^[+]?[0-9]+([- ]?[0-9]+)*$", "maxLength": 255, "minLength": 1, "readOnly": false, "required": true } }, ] } ] } ], "purchaseCustomAttributes": [ { "fieldType": "TEXT", "inputCode": "testID", "inputTitle": "Purchase Custom VO", "tooltip": null, "subTitle": "Enter value here", "validations": { "expression": null, "maxLength": null, "minLength": null, "readOnly": false, "required": false } } ], "subscriptionCustomAttributes": [ { "fieldType": "TEXT", "inputCode": "testID", "inputTitle": "subscription VO", "subTitle": "", "tooltip": null, "validations": { "expression": null, "maxLength": null, "readOnly": false, "required": false, "minLength": null } } ] } }, } ``` ## Common errors[​](#common-errors "Direct link to Common errors") For information on some of the common errors related to this mutation, refer to the section on [Error handling](/user-guides/checkout/errorhandling/.md). --- # Remove items from a cart Use the [removeItemsFromCart](https://developer.appdirect.com/graphql-docs/removeitemsfromcart.doc) mutation to remove items from an existing cart. To remove items,`cartId` and `itemId` must be specified as input parameters. `cartId` is a unique identifier for the cart from which the products are to be removed and itemId represents the item/product that is to be removed. **Mutation**: ``` mutation removeItemsFromCart($input: RemoveItemsInput!) { removeItemsFromCart(input: $input) { cart { id items { id product { name } } pricingTotal { amountDueAfterTax totalTaxAmount } } } ``` **Sample arguments** ``` { "input":{ "cartId": "64c8c666e7977d2ffef9d97d", "itemIds": ["5f339a9a-ce68-4bab-931c-e6ee45035241"] } } ``` **Sample output** ``` { "data": { "removeItemsFromCart": { "cart": { "id": "6512b7ff875fe104e5fde6da", "items": [ { "id": "b7ec8290-d984-4608-bca6-f31191e61f05", "product": { "name": "Tag and Track device 1" } }, { "id": "5dc0fe86-b66c-450d-bd6b-9c4a5e19e061", "product": { "name": "Stacked Web App (DO NOT EDIT OR CHANGE)" } } ], "pricingTotal": { "amountDueAfterTax": 474.1, "totalTaxAmount": 34.1 } } } } } ``` ## Common errors[​](#common-errors "Direct link to Common errors") For information on some of the common errors related to this mutation, refer to the section on [Error handling](/user-guides/checkout/errorhandling/.md). --- # Update cart details Use the mutations described in this topic to make updates to cart items and specific custom attributes at both cart and cart item level. ## Update cart items[​](#update-cart-items "Direct link to Update cart items") Use the [updateCartItems](https://developer.appdirect.com/graphql-docs/updatecartitems.doc) mutation to modify details of items in your cart. You can also update the following item level fields before completing a purchase. * Units * `pricingPlanId` You can update single or multiple items in the cart through a single request. **Mutation:** ``` mutation updateCartItems($input: UpdateCartItemsInput!) { updateCartItems(input: $input) { cart { id items { pricingPlan { id } units { quantity unit } } } } userErrors { ... on UnitQuantityMinError { __typename message path } ... on UnitQuantityMaxError { __typename message path } ... on UnitQuantityIncrementError { __typename message path } } } ``` **Sample arguments** ``` { "input": { "cartId": "668be7d341fe9e7a04bbbb53", "items": [{ "id": "33e7ac1a-fcaf-484c-9d17-eccb77153152", "units": { "quantity": "3", "unit": "USER" }, "pricingPlanId": "ae2665ca-84fa-4dd4-ac61-0c36fe8a1fe1" }] } } ``` **Sample output** ``` { "data": { "updateCartItems": { "cart": { "id": "668be7d341fe9e7a04bbbb53", "items": [ { "pricingPlan": { "id": "ae2665ca-84fa-4dd4-ac61-0c36fe8a1fe1" }, "units": [ { "quantity": 3, "unit": "USER" } ] } ] } } } } ``` ### Error handling:[​](#error-handling "Direct link to Error handling:") The `updateCartItems` mutation returns errors if invalid data is provided as input. One or more of the following (see table below) `userErrors` are returned if invalid unit quantities are provided while updating the values. | Error code | Description | Example | | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `UnitQuantityMinError` | This error occurs if the unit quantity value provided is lesser than the minimum allowed value. | `json {"data": { "updateCartItems": {"cart": null, "userErrors": [{ "__typename":"UnitQuantityMinError", "message": "Minimum allowed value for unit: MEGABYTE of item with id: d1407aa6-d43c-4479-8043-15c9a956f399 is 0.5. Please provide value greater than or equal to 0.5.","path": ["input","items","0","units","2","quantity" ]},]}}` | | `UnitQuantityMaxError` | This error occurs if the unit quantity value provided is more than maximum allowed value. | `json{"data": {"updateCartItems": {"cart": null,"userErrors": [{ "__typename": "UnitQuantityMaxError","message": "Maximum allowed value for unit: USER_LICENSE of item with id: d1407aa6-d43c-4479-8043-15c9a956f399 is 9. Please provide value lesser than or equal to 9.", "path": ["input","items","0","units","2","quantity"]}]}}` | | `UnitQuantityIncrementError` | This error occurs if the unit quantity value provided is not in line with the increment value configured for the unit. | `json{"data": {"updateCartItems": { "cart": null,"userErrors": [{"__typename": "UnitQuantityIncrementError","message": "Only value in increments of 1 is allowed for unit: MEGABYTE of item with id: d1407aa6-d43c-4479-8043-15c9a956f399.", "path": ["input","items","0","units","1","quantity"]}]}}` | ## Update cart custom attributes[​](#update-cart-custom-attributes "Direct link to Update cart custom attributes") Use this mutation to [update custom attribute](https://developer.appdirect.com/graphql-docs/updatecartcustomattributes.doc) values cart and cart item level. You can use this mutation to update the following fields at any point before purchase completion: * Subscription custom attribute fields values * Product field values * Purchase custom attribute fields values Subscription custom attributes and Product fields are item level fields whereas Purchase custom attribute fields are cart level fields. **Mutation:** ``` mutation updateCartCustomAttributes($input: UpdateCartCustomAttributesInput!) { updateCartCustomAttributes(input: $input) { cart { id customAttributes { purchaseCustomAttributes { key value } } items { id customAttributes { subscriptionCustomAttributes { key value } productFields { key value } } } } } } ``` **Sample arguments** ``` { "input": { "cartId": "668be7d341fe9e7a04bbbb53", "customAttributes": { "purchaseCustomAttributes": [{ "key": "testID", "value": "test purchase value" }] }, "items": [{ "id": "33e7ac1a-fcaf-484c-9d17-eccb77153152", "customAttributes": { "subscriptionCustomAttributes": [{ "key": "testID", "value": "test subscription value" }], "productFields": [ { "key": "test", "value": "test value 1" }, { "key": "dropdown", "value": "dropdownvalue1" } ] } }] } } ``` **Sample response** ``` { "data": { "updateCartCustomAttributes": { "cart": { "items": [ { "id": "33e7ac1a-fcaf-484c-9d17-eccb77153152", "customAttributes": { "subscriptionCustomAttributes": [ { "key": "testID", "value": [ "test subscription value" ] } ], "productFields": [ { "key": "test", "value": [ "test value 1" ] }, { "key": "dropdown", "value": [ "dropdownvalue1" ] } ] } } ], "customAttributes": { "purchaseCustomAttributes": [ { "key": "testID", "value": [ "test purchase value" ] } ] } } } } } ``` ### Common errors[​](#common-errors "Direct link to Common errors") For information on some of the common errors related to this mutation, refer to the section on [Error handling](/user-guides/checkout/errorhandling/.md). --- # Validate cart details The [validateCart](https://developer.appdirect.com/graphql-docs/validatecart.doc) mutation triggers different validations for the cart. Use this mutation to validate cart items individually or collectively. Any asynchronous validations that cannot be completed within time are returned as pending validations. They can be fetched using a cart validation query at a later point in time. Cart validation query can be called periodically after running the [validateCart](https://developer.appdirect.com/graphql-docs/validatecart.doc) mutation until all the pending validation are completed. The validations can be performed at two levels: * `PRE_FINALIZE` -use this validation If there needs to be a pre-validation check for the item(s) and rest of the fields prior to saving the billing and shipping details. * `PREVENT_FINALIZE` - use this option to validate the cart before completing the purchase as it validates everything needed to complete the purchase. **Mutation**: ``` mutation validateCart($input: CartValidationInput!) { validateCart(input: $input) { cartValidation { id blockingErrors { itemId code message messageParameters { key value __typename } __typename } warnings { itemId message __typename } info pendingValidations __typename } __typename } } ``` **Sample arguments:** ``` { "input": { "cartId": "6512b7ff875fe104e5fde6da", "level": "PRE_FINALIZE", "itemIds": ["cf39a936-efe1-434b-a7d4-79b61b6b97ca"], "locale": "en-US" } ``` **Sample output:** ``` { "data": { "validateCart": { "cartValidation": { "id": "d837a6c5-659c-4d5c-9c46-50230dc02cd1", "blockingErrors": [ { "itemId": "cf39a936-efe1-434b-a7d4-79b61b6b97ca", "code": "REQUIRED_FIELD_VALIDATION_ERROR", "message": "Required field 'firstName' has failed validation: Missing information", "messageParameters": [ { "key": "REQUIRED_FIELD_KEY", "value": "firstName", "__typename": "CartValidationMessageParameter" } ] } ] } } } } ``` ## The cartValidation query[​](#the-cartvalidation-query "Direct link to The cartValidation query") Use the [cartValidation](https://developer.appdirect.com/graphql-docs/cartvalidation_query.doc) query to get the details of the validation triggered previously by the validateCart mutation. This is useful when there are pending validations. Polling can be done at specific intervals until these pending validations are completed. **Query:** ``` query cartValidation($input: CartValidationRequest!) { cartValidation(input: $input) { id blockingErrors { itemId code message messageParameters { key value __typename } __typename } warnings { itemId message __typename } info pendingValidations __typename } __typename } ``` **Sample arguments:** ``` { "input": { "cartId": "6512b7ff875fe104e5fde6da", "level": "PRE_FINALIZE", "itemIds": ["cf39a936-efe1-434b-a7d4-79b61b6b97ca"], "locale": "en-US" } ``` **Sample output:** ``` { "data": { "cartValidation": { "id": "d837a6c5-659c-4d5c-9c46-50230dc02cd1", "blockingErrors": [ { "itemId": "cf39a936-efe1-434b-a7d4-79b61b6b97ca", "code": "REQUIRED_FIELD_VALIDATION_ERROR", "message": "Required field 'firstName' has failed validation: Missing information", "messageParameters": [ { "key": "REQUIRED_FIELD_KEY", "value": "firstName", "__typename": "CartValidationMessageParameter" } ] } ] } } } } ``` ## Common errors[​](#common-errors "Direct link to Common errors") For information on some of the common errors related to this mutation, refer to the section on [Error handling](/user-guides/checkout/errorhandling/.md). --- # Custom pricing ## Overview[​](#overview "Direct link to Overview") By default, a product displays the list price that has been set by the developer in the product definition. This list price allows for revenue shares to be divided between all stakeholders: the developer, AppDirect, the marketplace owner, and resellers affiliated with the marketplace. However, the list price is only a suggested price. Marketplace owners are free to mark it up to increase their own revenue share, or to reduce their own share in order to encourage sales of the product by offering a discount to their own customers and/or resellers. ## Getting Started[​](#getting-started "Direct link to Getting Started") 1. Select the appropriate grant types and scopes for your use case. See [Grant types](/user-guides/api-usage/api-auth/grant-type/.md) and [Scopes](/user-guides/api-usage/api-auth/scopes.md). 2. Create an API client to use with the AppDirect API. See [API clients](https://help.appdirect.com/platform/Default.htm#MarketplaceManager/mm-set-integ-api.htm). 3. Authenticate your client. See [API Authentication](/user-guides/api-usage/api-auth/.md). 4. Test your API calls with your access token using a third-party API IDE, for example Postman. ## Working with Custom pricing APIs[​](#working-with-custom-pricing-apis "Direct link to Working with Custom pricing APIs") Use our Hosted GraphQL Explorer to test your queries and mutations. Manage marketplace sale price and reseller wholesale price. ## API Reference[​](#api-reference "Direct link to API Reference") * [GraphQL API](/graphql-docs/docs) --- # Custom pricing guide Important This feature is currently in Early Availability (EA) status. For more information, see **[GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md)**. By default, a product displays the list price that has been set by the developer in the product definition. This list price allows for revenue shares to be divided between all stakeholders: the developer, AppDirect, the marketplace owner, and resellers affiliated with the marketplace. However, the list price is only a suggested price. Marketplace owners are free to mark it up to increase their own revenue share, or to reduce their own share in order to encourage sales of the product by offering a discount to their own customers and/or resellers. The marketplace offers several mechanisms for offering such custom prices. For a given product edition, marketplace owners can create or set the following: * **Marketplace Sale Price**—The general price displayed on the marketplace. * **Wholesale Price**—The default price shown to reseller users only. * **Reseller Company Wholesale Price**—A customized price offered to a specific reseller or resellers. * **Price books**—Sets of customized product edition prices offered to specific customers, or to customers who belong to a specific segment. You can set custom prices for individual components within a product edition pricing plan: flat fees, recurring fees, setup fee, price per unit, and so on. This guide explains how to use the GraphQL API to set these custom prices. Important When adjusting prices on the marketplace, remember that the marketplace owner bears responsibility for meeting financial obligations: * The difference between a custom price and the Developer List Price accrues to the marketplace owner. If the price is higher, the marketplace owner receives the extra amount; but if it is lower, that difference comes out of the marketplace owner's share. * It is the responsibility of the marketplace owner to remit any applicable taxes to the correct tax authorities. ## Marketplace and Wholesale prices[​](#marketplace-and-wholesale-prices "Direct link to Marketplace and Wholesale prices") In the marketplace UI, a Marketplace Manager can specify the Marketplace Sale Price and Wholesale Price for each product edition in the catalog. The GraphQL API offers this same function through a set of mutations. See [Set Marketplace Prices](/user-guides/custom-pricing/graphql-api/marketplace-prices.md) for more information. Similarly, a Reseller Manager can use the marketplace UI to set the Reseller Wholesale Price offered to Resellers for product editions, or use the GraphQL API to do so. See [Set Reseller Wholesale Prices](/user-guides/custom-pricing/graphql-api/reseller-wholesale-prices.md) for more information. ## Price books[​](#price-books "Direct link to Price books") The overall sequence of steps is as follows. See the topics for mutation examples: 1. [Create price books](/user-guides/custom-pricing/graphql-api/create-price-books.md) 2. [Create price book conditions](/user-guides/custom-pricing/graphql-api/create-price-books-conditions.md) 3. [Create price book entries](/user-guides/custom-pricing/graphql-api/create-price-books-entries.md) ## Prerequisites[​](#prerequisites "Direct link to Prerequisites") Before you create custom prices through the GraphQL API: * In the user interface, a Marketplace Manager must [create an API client](https://help.appdirect.com/platform/Default.htm#MarketplaceManager/Create-Web-ServerApp-API-Client.htm) with the following settings: * **Client Type**: Web server application * **Grant Types**: Authorization Code and Password * **Redirect URL(s)**: `/oauth2/redirect` and `https://oauth.pstmn.io/v1/callback` * Under **Allowed scopes**: * **OpenID Connect scopes**: ID Token and Basic user information * **User-level scopes**: Marketplace Manager, or Reseller Manager (to set Reseller Wholesale Price only) * Retrieve the ID of the product whose prices you want to customize. For example, use the [products](/graphql-docs/products_query.doc.html) query (or the REST [List all products](/rest.md#tag/Product/operation/resource_Product_readAppListing_GET) API command) to list all products on the marketplace, and note the value of the `id` for the desired product. Alternatively, you can use the vendor ID with the [productsByVendorId](/graphql-docs/productsbyvendorid_query.doc.html) query (or REST [List all products by vendor](/rest.md#tag/Product/operation/resource_Product_readVendorProducts_GET) API command) to find products offered by a specific vendor. * With the id, use the [product](/graphql-docs/product_query.doc.html) query (or REST [Retrieve a product](/rest.md#tag/Product/operation/resource_Product_readProduct_GET) API command) to retrieve the product details. Note the `uuid` value in the `editions` array. The edition UUID is known as the `pricingPlanId` in the price book API. to retrieve the product details * Similarly, use the [accounts](/graphql-docs/accounts_query.doc.html) or [accountByExternalId](/graphql-docs/accountbyexternalid_query.doc.html) query (or REST [List all companies](/rest.md#tag/Companies/operation/resource_Company_readAllCompanies_GET) API) to retrieve the UUIDs of the companies that will have custom prices for the product, and note the `uuid` values for those companies. * The user who sends price book API requests must have the Marketplace Manager role (`ROLE_CHANNEL_ADMIN` scope). --- # Create price books Use the `createPriceBook` mutation to create an empty price book. You will use other mutations to add conditions and entries. Ensure that you request the price book `id` in the response because you need it to create conditions and entries. **Mutation** ``` mutation createPriceBook($createPriceBookInput: CreatePriceBookInput!) { createPriceBook(input: $createPriceBookInput) { priceBook { id name description } userErrors { __typename ... on UserError { message } } } } ``` **Variables** ``` { "createPriceBookInput": { "name": "Acme price book", "description": "This is the price book for Acme Corp.", "createdBy": "john.smith@example.com" } } ``` **Response** ``` { "data": { "createPriceBook": { "priceBook": { "id": "6beab4df-d944-4e52-8694-8bcf5b514015", "name": "Acme price book", "description": "This is the price book for Acme Corp." }, "userErrors": null } } } ``` --- # Create price book conditions After you create a price book, set conditions with the `createPriceBookCondition` mutation. In the Preview release, the only supported condition is company ID. That is, you can only use price books to set custom prices for specific companies. To use this mutation, you need two unique identifiers: * The `priceBookId`, which is the `id` value returned when you created the price book (see [Create price books](/user-guides/custom-pricing/graphql-api/create-price-books.md)). * One or more company UUIDs, which you can retrieve with the [List all companies](/rest.md#tag/Companies/operation/resource_Company_readAllCompanies_GET) REST API request. **Mutation** ``` mutation createPriceBookCondition($createPriceBookConditionInput: CreatePriceBookConditionInput!) { createPriceBookCondition(input: $createPriceBookConditionInput) { condition { id name description conditions { property values } } userErrors { ... on UserError { __typename message } } } } ``` **Variables** ``` { "createPriceBookConditionInput": { "priceBookId": "6beab4df-d944-4e52-8694-8bcf5b514015", "name": "Company ID condition", "createdBy": "john.smith@example.com", "conditions": [ { "property": "COMPANY_ID", "values": [ "6b4bd452-895d-4098-aa56-e6046b238e0f" ] } ] } } ``` **Response** ``` { "data": { "createPriceBookCondition": { "condition": { "id": "18333f2b-f87a-4501-ac2b-62e6e6d34c58", "name": "Company ID condition", "description": null, "conditions": [ { "property": "COMPANY_ID", "values": [ "6b4bd452-895d-4098-aa56-e6046b238e0f" ] } ] }, "userErrors": null } } } ``` --- # Create price book entries Price book entries contain the custom pricing details that apply when the price book conditions are met. In this example, the entry applies to any companies specified in [Create price book conditions](/user-guides/custom-pricing/graphql-api/create-price-books-conditions.md). To use the `createPriceBookEntry` mutation, you need two unique identifiers: * The `priceBookId`, which is the `id` value returned when you created the price book (see [Create price books](/user-guides/custom-pricing/graphql-api/create-price-books.md)). * The `pricingPlanId`, also known as the edition UUID. To retrieve it: 1. Use the REST API to retrieve the ID of the product whose price you want to customize. For example, use [List all products](/rest.md#tag/Product/operation/resource_Product_readAppListing_GET) and note the value of the `id` for the desired product. 2. Use the product ID to retrieve the product details with the [Retrieve a product](/rest.md#tag/Product/operation/resource_Product_readProduct_GET) request. Note the `uuid` value in the `editions` array. Enter this value as the `pricingPlanId`. In the following example, the product price is reduced by 50 percent. **Mutation** ``` mutation createPriceBookEntry($createPriceBookEntryInput: CreatePriceBookEntryInput!) { createPriceBookEntry(input: $createPriceBookEntryInput) { priceBookEntry { id priceBookId pricingPlanId setupFee { percentage prices { currency price } } contractFee { percentage prices { currency price } } units { unit priceRanges { minUnits maxUnits percentage prices { currency price } } } } userErrors { ... on UserError { __typename message } } } } ``` **Variables** ``` { "createPriceBookEntryInput": { "priceBookId": "6beab4df-d944-4e52-8694-8bcf5b514015", "pricingPlanId": "b4b981e8-2c39-48d8-bc7a-82f5e2b677ab", "createdBy": "john.smith@example.com", "units": [ { "unit": "USER", "priceRanges": [ { "minUnits": 1, "maxUnits": null, "percentage": true, "prices": [ { "currency": "USD", "price": -50 } ] } ] } ] } } ``` **Response** ``` { "data": { "createPriceBookEntry": { "priceBookEntry": { "id": "5a31e443-4b70-45ab-9c97-fb6781d92d81", "priceBookId": "6beab4df-d944-4e52-8694-8bcf5b514015", "pricingPlanId": "b4b981e8-2c39-48d8-bc7a-82f5e2b677ab", "setupFee": null, "contractFee": null, "units": [ { "unit": "USER", "priceRanges": [ { "minUnits": 1, "maxUnits": null, "percentage": true, "prices": [ { "currency": "USD", "price": 0.500000000000 } ] } ] } ] }, "userErrors": null } } } ``` --- # Set Marketplace Prices Important This part of the GraphQL API is currently in Early Availability status. For more information, see **[GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md)**. A Marketplace Manager can use the following mutations to set the Marketplace Sales Price or Wholesale Price for product editions: * [setMarketplacePrice](/graphql-docs/setmarketplaceprice.doc.html)—Specifies the Marketplace Sale Price or the Wholesale Price for a single pricing plan. * [triggerSetMarketplacePricesProcess](/graphql-docs/triggersetmarketplacepricesprocess.doc.html)—Specifies the Marketplace Sale Price or the Wholesale Price for one or more products, in a bulk action. * [removeMarketplacePrice](/graphql-docs/removemarketplaceprice.doc.html)—Removes an established Marketplace Sale Price or Wholesale Price from a pricing plan. The price then defaults to the price defined in the product. In each of these mutations, the markupPricingType value specifies whether the change applies to the Marketplace Sale Price (CHANNEL) or Wholesale Price (CHANNEL\_RESELLER). Only one of these types of prices can be changed at a time. Changing both requires two separate API calls. The triggerSetMarketplacePricesProcess API starts a job to modify prices for a specific product, for several specified products, or all products. If the job is very large—for example, if you apply a price change to all products on the marketplace—it may take a while to complete. Marketplace Managers can check on the status of this job with the following query: * [setMarketplacePricesProcess](/graphql-docs/setmarketplacepricesprocess_query.doc.html)—Tracks the progress of a bulk action that has been started with triggerSetMarketplacePricesProcess. --- # Set Reseller Wholesale Prices Important This part of the GraphQL API is currently in Early Availability status. For more information, see **[GraphQL API policy](/user-guides/api-usage/graphql/graqhql-policy.md)**. A Marketplace Manager or Reseller Manager can use the following mutations to set the Reseller Wholesale Price for product editions: * [setResellerCompanyPrice](/graphql-docs/setresellercompanyplaceprice.doc.html)—Specifies the Reseller Wholesale Price for a single pricing plan. * [triggerSetResellerCompanyPricesProcess](/graphql-docs/triggersetresellercompanypricesprocess.doc.html)—Specifies the Reseller Wholesale Price for one or more products, in a bulk action. * [removeResellerCompanyPrice](/graphql-docs/removeresellercompanyprice.doc.html)—Removes an established Reseller Wholesale Price from a pricing plan. The price then defaults to the price defined in the product. The triggerSetResellerCompanyPricesProcess API starts a job to modify prices for a specific product, for several specified products, or all products. If the job is very large, it may take a while to complete. Marketplace Managers can check on the status of this job with the following query: * [setResellerCompanyPricesProcess](/graphql-docs/setresellercompanypricesprocess_query.doc.html)—Tracks the progress of a bulk action that has been started with triggerSetResellerCompanyPricesProcess. --- # Overview Dev Center 2.0 is a program manager UI framework which provides ecosystem marketplace operators with the necessary tools to run their own developer partner onboarding program. The Dev Center is a dedicated hub where ecosystem partners can access resources and tools to build, test, and publish their applications in a marketplace. The Dev Center allows ecosystem partners to integrate their solutions with minimal involvement from the marketplace owner. This shortens timelines and improves developer satisfaction. This framework enables marketplace operators to create a customizable Dev Center experience to onboard developers. You can use the program manager to: * Customize partner onboarding - A customizable survey that gathers role-specific data to drive uniquely tailored onboarding experiences. * Manage applicants - A comprehensive Applicant Management System for the marketplace managers to effectively capture, display, and manage applicants generated from various onboarding questionnaires across multiple programs with configurable email notifications. * Edit developer homepage - Editable Developer dashboards tailored to fit developer’s onboarding needs within the marketplace. * Customize login page - Customizable login pages that reflect the marketplace operator's branding. This creates a more personalized and engaging user experience, improves user satisfaction, and helps attract potential users looking for brand-centric solutions. The user interface (UI) integrates seamlessly with the storefront builder's what-you-see-is-what-you-get (WYSIWYG) editor. Also, advanced end-to-end automation is possible with an event-driven architecture and integration with the existing Webhooks feature. > 📝 **Note:** This feature is enabled by default. If it is not active in your marketplace, contact your AppDirect technical representative to request it. --- # Customize partner onboarding You can optimize partner onboarding for your ecosystem specifically for companies with Developer or Reseller access from within your marketplace. You can create customized onboarding forms using: * JSON editor * Drag and drop visual editor The customizable form allows you to: * Customize the onboarding questionnaires using the intuitive drag and drop interface to gather required data from partners during signup. * Adjust design elements and add various question types to create a branded, personalized experience. * Support both gated (approval-based) and open registration models. * Include email verifications to prevent spam and maintain security. * Preview the entire flow before it goes live. --- # Action menu option The action menu allows you to do the following: Click the ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAADAFBMVEUAAAAAAFUAAKoAAP8AJAAAJFUAJKoAJP8ASQAASVUASaoASf8AbQAAbVUAbaoAbf8AkgAAklUAkqoAkv8AtgAAtlUAtqoAtv8A2wAA21UA26oA2/8A/wAA/1UA/6oA//8kAAAkAFUkAKokAP8kJAAkJFUkJKokJP8kSQAkSVUkSaokSf8kbQAkbVUkbaokbf8kkgAkklUkkqokkv8ktgAktlUktqoktv8k2wAk21Uk26ok2/8k/wAk/1Uk/6ok//9JAABJAFVJAKpJAP9JJABJJFVJJKpJJP9JSQBJSVVJSapJSf9JbQBJbVVJbapJbf9JkgBJklVJkqpJkv9JtgBJtlVJtqpJtv9J2wBJ21VJ26pJ2/9J/wBJ/1VJ/6pJ//9tAABtAFVtAKptAP9tJABtJFVtJKptJP9tSQBtSVVtSaptSf9tbQBtbVVtbaptbf9tkgBtklVtkqptkv9ttgBttlVttqpttv9t2wBt21Vt26pt2/9t/wBt/1Vt/6pt//+SAACSAFWSAKqSAP+SJACSJFWSJKqSJP+SSQCSSVWSSaqSSf+SbQCSbVWSbaqSbf+SkgCSklWSkqqSkv+StgCStlWStqqStv+S2wCS21WS26qS2/+S/wCS/1WS/6qS//+2AAC2AFW2AKq2AP+2JAC2JFW2JKq2JP+2SQC2SVW2Saq2Sf+2bQC2bVW2baq2bf+2kgC2klW2kqq2kv+2tgC2tlW2tqq2tv+22wC221W226q22/+2/wC2/1W2/6q2///bAADbAFXbAKrbAP/bJADbJFXbJKrbJP/bSQDbSVXbSarbSf/bbQDbbVXbbarbbf/bkgDbklXbkqrbkv/btgDbtlXbtqrbtv/b2wDb21Xb26rb2//b/wDb/1Xb/6rb////AAD/AFX/AKr/AP//JAD/JFX/JKr/JP//SQD/SVX/Sar/Sf//bQD/bVX/bar/bf//kgD/klX/kqr/kv//tgD/tlX/tqr/tv//2wD/21X/26r/2////wD//1X//6r////qm24uAAAACXBIWXMAAAk6AAAJOgHwZJJKAAAAB3RJTUUH6QQWBw02AjazOAAAADRJREFUGJVj+I8BGEgTmjQJXeg2A8NtwqqINJ5BBd2s2yoqGKpgavCblYvNqRiqyHYqAgAApuY228q7lDEAAAAASUVORK5CYII=) icon in the upper right corner of the Developer Program page to select the required option: * **Download JSON** - Click this option to download the JSON file to your local machine to work locally in your editor of choice. You can copy the onboarding flow to any other environment. This helps you save time and avoid recreating the form from scratch * **Copy from URL** - Click this option to copy the page URL after the changes to the form are complete. You can include the link directly in your marketplace using the Storefront Theme editor or place it in a separate website. * **JSON editor** - Questionnaires are defined using JSON. You can also customize the onboarding form using JSON. This makes questionnaire content easy to modify even if you do not have editor software installed on your machine. This is a toggle option between JSON editor and Visual editor. Click this option to edit the form in JSON, and click Visual editor from the JSON editor to view the changes and to come back to Visual editor. * **Reset to default** - Click this option to reset all the changes done to the form. A message box appears, click Reset to default. > 📝 **Note:** Any changes done to the form will be reset to default and this action cannot be reversed. --- # Customize theme for the form You can customize the background colors for your form. **To customize the theme**: 1. On the Developer Program page click **Theme**. 2. The **Page background** option appears in the left pane. 3. Click in the **Page background** field.
The color pallet opens. ![](/assets/images/VisualFormBuilderTheme-5b3d7a752fbb5924b610340b7d427afc.PNG) 4. Select the required color. You can set the background color as a solid color or as a gradient and set other settings as required. 5. Click the Copy icon in the **Page background** field.
The selected colour is updated as the background for the forms. --- # Customize partner onboarding form using visual editor The questionnaire is designed to be simple and intuitive. The flow includes email verification to prevent spams. **To create an onboarding form using the visual editor**: 1. Click the **Programs** tab.
The Program Manager page opens. 2. Click **Customize** in the relevant dialog box to create an onboarding form for Developer/ISV program or Reseller program.
The Developer Program page opens. ![](/assets/images/VisualFormBuilder-2b423087ecf5ee5b88f7952fe82c1b2f.PNG) 3. Default step options are available in the left pane. Click the step you want to edit. It opens in the center workspace. 4. You can add more fields to the default step from the tool bar on the right by clicking any of the following options: | Icon | Description | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | | ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAABsSURBVFhH7dTBCQAxCERRm0kzFmYbqSg1TfC4A4GAsBiYB17lHxINTSiEKYQphCmEKYS9FRIRcPfy5J6Tq5AxBsysPLnn5CpkrYU5Z3lyz4keK1MIeyukza9pc0faXNY/KIQphCmEKYQp5AvYq4oYvGu20usAAAAASUVORK5CYII=) | Short answer: click this icon to insert a field that requires a short answer. | | ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAhCAYAAADOHBvaAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAB3SURBVFhH7ZWxDQAhDAOzCaMwBuMwAiNRMpZf+ZpUkWyKnOTWJySLGESUmEaJaVzFYwz03tPxnoiruLUGM0vHeyKu4nMO9t7peE9EjetnrYU5ZzreE/HWuGQvZlDj+pGNS/ZXM3hLLDsSsnHJxAxKTKPENERi4AN1q4wrH/0+0QAAAABJRU5ErkJggg==) | Long answer: click this icon to insert a field that requires a long answer. | | ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAHKSURBVFhH7ZU9j0FBFIY1PqP0megkOrWSH0FUKtFqlQoK8Rc0fgNRiAK9SnwUotERRKHEu5mTY1diZvauNZst7pOcZO6ZOec+mTuT68A/wpZRYcuosGVU2DIqtDK1Wg3pdPpt0Wg0uLMcrUw4HIbD4XhbRKNR7ixHKxMKhahJu93GcDh8OUS96CP66dDKBAIBajKfzznzGrPZjPoEg0HOyLFlVGhlRPE7ZHa7HarVKprNJmfk/MnOWEUrc79Ni8WCMz/jcrkgm82i2+1yRo+xnbler8jn81TvcrkwGAx4Ro0RmdvthkKhQLX38Hg8GI/HvEKOEZlSqUR1brcbnU4HuVyOnn0+HyaTCa96Ritz/x0sl0vOWKNer8Pv92M0GtGz2KlisYhYLIbpdEo5GcYO8PF45NEX+/2eR3KMHeBXMCIjPmsmk8HpdOIM0Ov16HaJ667C0mey8tder9dcBSSTSapLpVI4n8/o9/twOp2Ua7VavOoZrUwkEqEGVqJSqXAVsFqt6LCKvBDyer00FrdMHGYVWhnxgscX6uJRRrDZbBCPxz/ny+Uyz6jRyvyW7XaLRCLxJKrCqIzgcDjw6HuMy/wEW0aFLSMH+ACpLWtp7VpwCgAAAABJRU5ErkJggg==) | Dropdown list: click this icon to insert a drop-down list. | | ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAiCAYAAADVhWD8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAHxSURBVFhH7ZbPygFRFMCHlTX5U9bKUllLlghla2nnBbBSylsIsbCw8gDiGeRfNp5BsVGcr3O6d8zlTnONoe/7ml+dmrkz98zPueeO0eAX4cqY4cqY4cqY8T9k2u02aJpmK8rlMssiYlsmn89LH6QSkUiEZRGxLZPL5Shxs9mE+XyuFIPBgOaEQiGWRcS2TDabpcT4AFVWqxXNCQaDbETk78l0Oh1Ip9NC+P1+ShyPx5+uGWM6nbIsAJvNhua8tUzYcJjEThSLRZbFIRksKyap1WrQarWUolQq0RzcdZz1ek1jby0Tl8FkqvR6PZqDu47jSM+oylwuF5jNZnTc7/dpjuOVwTXGJNvtlo08cz6fIZPJ0H1YFZmMoz3DZRaLBVyvVzpGTqcTpFIpuicajcLhcPhcZYwyk8kEvF4vVCoVuN1ucDweIZlM0nXcdSiCfKxnAoGALjMej8Hj8dB5tVqFRCKhi+z3ezbj3jOxWEzfYbgbceytZTLKIMPhUBfiyY0iCJeRRTgcZneJvCSz2+3YyH0ZsOTYmI9wGXxTP76V8fNDxksyj7++2+3CcrlkZyKyBrZCSYb/DxkrY4Wsga14qTKj0Uj6nSKLer3+mcrwrW0nCoUCy2KNkkyj0ZA+yCp8Ph+9l1RRkvkWrowZrowcgB/KpgJwJkxhVQAAAABJRU5ErkJggg==) | Multiple choice: click this icon to insert a multiple choice option. | | ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAYAAABWk2cPAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAMPSURBVEhL7ZXNK3xhFMcnQpGXQiQjKykLedtMGSKavOZtYycpJbaYmvwPpFhQlqKkpqSIDRZSMk2KIoTkbWEhke+vc+bcuXM995mxoN/Gp07TfJ9zzve59z4vDvwH/kx/lW+bbm9vY2xsDDU1NXA6nUhISODf2tpaeL1e7OzsSGZsYpoeHx+jvr4eDocjZjQ1NeH09FQq9UQ1XV5eRkpKSrhpdnY2BgYGMDs7i7W1NczMzPD/zMzMcE5aWhqPRUNrurS0FG6Uk5OD+fl5fHx8yKiV9/d3noBhHhcXh/X1dRlVsTUNBAJITEzkBhUVFbi5uZGR6FxeXqKkpITrUlNTcX5+LiNWbE1pcVAhLZT7+3tRQ2xubqK5uZkXFP3SAovk6uoKWVlZXN/b2yuqFcV0b2+PCygiV+Td3R1aW1vDY5HR0dGBp6cnyQRWVlbCY3ZPq5iOjo5yMhkYfH5+8ms2GtkFPXkk5eXlrE9OTopiopi6XC5OpoVhsLq6ajHQxe7urlQAPp+Pta6uLlFMFNOioiKlQX9/v6W5LujwMDAmWllZKYqJYpqXl8fJR0dHogBtbW2W5rqIfKqDgwPWCgoKRDFRTEtLSzl5a2tLFGBwcNDSXBfDw8NSAWxsbLBG3/Yriml7ezsnR35Tv99vaa4L2k4GU1NTrHV3d4tiophOT09zcmNjoyih1WusRl243W7JDlFdXc363NycKCaK6fX1Nd8gVHB4eCgqcHt7C4/HYzEyoqenB4+Pj5IJXoSkJyUl4eHhQVQTxZQYGRnhIpr91/OWTiC6ylpaWjAxMYH9/X0ZCfH6+oqysjKuHx8fF9WKrSnNurCwkAv7+vq0B/1X3t7e0NnZyXXFxcV4eXmRESu2pkQwGER6ejo3qKuri3lP0harqqrifLoCz87OZERFa0rQXsvIyOBG8fHx/O0WFxd5OxmxsLDAr5pyKHJzc/nij0ZUU+Lk5IRfsXHV6SI5ORlDQ0O4uLiQSj0xTQ2en595O9G1l5+fz5Og06ahoYG3he772fFt05/kz/QXAf4BHeqjC4SyhBIAAAAASUVORK5CYII=) | Single choice radio button: click this icon to insert a radio button. | | ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAdCAYAAACwuqxLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAABwSURBVEhL7dHBDQAREIXhKYqzNpSgAOpTgZpmQ1xkJI9N9rTvSyYSwn8g+jEGIAYgE0gpaQjhevq9HRNwzqmIXI/3fr6wMoHWmtZazcQYx0N93Z33ezvHf5BzHoFSytw5wwDEAMQAxAD0o8BbDACqDxo2HD49+yk1AAAAAElFTkSuQmCC) | Rich text: click this icon to insert a rich text field. | 5. On adding the additional fields you can do the following: * Update the field name as required by editing the Label. * Reposition the step by holding the cursor on the ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAADAFBMVEUAAAAAAFUAAKoAAP8AJAAAJFUAJKoAJP8ASQAASVUASaoASf8AbQAAbVUAbaoAbf8AkgAAklUAkqoAkv8AtgAAtlUAtqoAtv8A2wAA21UA26oA2/8A/wAA/1UA/6oA//8kAAAkAFUkAKokAP8kJAAkJFUkJKokJP8kSQAkSVUkSaokSf8kbQAkbVUkbaokbf8kkgAkklUkkqokkv8ktgAktlUktqoktv8k2wAk21Uk26ok2/8k/wAk/1Uk/6ok//9JAABJAFVJAKpJAP9JJABJJFVJJKpJJP9JSQBJSVVJSapJSf9JbQBJbVVJbapJbf9JkgBJklVJkqpJkv9JtgBJtlVJtqpJtv9J2wBJ21VJ26pJ2/9J/wBJ/1VJ/6pJ//9tAABtAFVtAKptAP9tJABtJFVtJKptJP9tSQBtSVVtSaptSf9tbQBtbVVtbaptbf9tkgBtklVtkqptkv9ttgBttlVttqpttv9t2wBt21Vt26pt2/9t/wBt/1Vt/6pt//+SAACSAFWSAKqSAP+SJACSJFWSJKqSJP+SSQCSSVWSSaqSSf+SbQCSbVWSbaqSbf+SkgCSklWSkqqSkv+StgCStlWStqqStv+S2wCS21WS26qS2/+S/wCS/1WS/6qS//+2AAC2AFW2AKq2AP+2JAC2JFW2JKq2JP+2SQC2SVW2Saq2Sf+2bQC2bVW2baq2bf+2kgC2klW2kqq2kv+2tgC2tlW2tqq2tv+22wC221W226q22/+2/wC2/1W2/6q2///bAADbAFXbAKrbAP/bJADbJFXbJKrbJP/bSQDbSVXbSarbSf/bbQDbbVXbbarbbf/bkgDbklXbkqrbkv/btgDbtlXbtqrbtv/b2wDb21Xb26rb2//b/wDb/1Xb/6rb////AAD/AFX/AKr/AP//JAD/JFX/JKr/JP//SQD/SVX/Sar/Sf//bQD/bVX/bar/bf//kgD/klX/kqr/kv//tgD/tlX/tqr/tv//2wD/21X/26r/2////wD//1X//6r////qm24uAAAACXBIWXMAAAk6AAAJOgHwZJJKAAAAB3RJTUUH6QQWBRYnwjSMPgAAAHpJREFUGJV1kNERBCEIQymGZiyGZiiGZlIMB8Fx3bk7f6KPgUQk6yxZLSYLJUIi4pleYheyEd2oy5GJEaIM72vCKETvQwSAjzgodNxV9A5hHUuY7w8q9+5ANZ4Qe27icfwVwllH4ISouTPrfEjH0S9H+15OBTOuULnJD4oE6KyVav6KAAAAAElFTkSuQmCC) icon and moving it up or down as required. * Duplicate the step, delete it or move the step to another page of the form by clicking the ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAADAFBMVEUAAAAAAFUAAKoAAP8AJAAAJFUAJKoAJP8ASQAASVUASaoASf8AbQAAbVUAbaoAbf8AkgAAklUAkqoAkv8AtgAAtlUAtqoAtv8A2wAA21UA26oA2/8A/wAA/1UA/6oA//8kAAAkAFUkAKokAP8kJAAkJFUkJKokJP8kSQAkSVUkSaokSf8kbQAkbVUkbaokbf8kkgAkklUkkqokkv8ktgAktlUktqoktv8k2wAk21Uk26ok2/8k/wAk/1Uk/6ok//9JAABJAFVJAKpJAP9JJABJJFVJJKpJJP9JSQBJSVVJSapJSf9JbQBJbVVJbapJbf9JkgBJklVJkqpJkv9JtgBJtlVJtqpJtv9J2wBJ21VJ26pJ2/9J/wBJ/1VJ/6pJ//9tAABtAFVtAKptAP9tJABtJFVtJKptJP9tSQBtSVVtSaptSf9tbQBtbVVtbaptbf9tkgBtklVtkqptkv9ttgBttlVttqpttv9t2wBt21Vt26pt2/9t/wBt/1Vt/6pt//+SAACSAFWSAKqSAP+SJACSJFWSJKqSJP+SSQCSSVWSSaqSSf+SbQCSbVWSbaqSbf+SkgCSklWSkqqSkv+StgCStlWStqqStv+S2wCS21WS26qS2/+S/wCS/1WS/6qS//+2AAC2AFW2AKq2AP+2JAC2JFW2JKq2JP+2SQC2SVW2Saq2Sf+2bQC2bVW2baq2bf+2kgC2klW2kqq2kv+2tgC2tlW2tqq2tv+22wC221W226q22/+2/wC2/1W2/6q2///bAADbAFXbAKrbAP/bJADbJFXbJKrbJP/bSQDbSVXbSarbSf/bbQDbbVXbbarbbf/bkgDbklXbkqrbkv/btgDbtlXbtqrbtv/b2wDb21Xb26rb2//b/wDb/1Xb/6rb////AAD/AFX/AKr/AP//JAD/JFX/JKr/JP//SQD/SVX/Sar/Sf//bQD/bVX/bar/bf//kgD/klX/kqr/kv//tgD/tlX/tqr/tv//2wD/21X/26r/2////wD//1X//6r////qm24uAAAACXBIWXMAAAk6AAAJOgHwZJJKAAAAB3RJTUUH6QQWBRYnwjSMPgAAAHpJREFUGJV1kNERBCEIQymGZiyGZiiGZlIMB8Fx3bk7f6KPgUQk6yxZLSYLJUIi4pleYheyEd2oy5GJEaIM72vCKETvQwSAjzgodNxV9A5hHUuY7w8q9+5ANZ4Qe27icfwVwllH4ISouTPrfEjH0S9H+15OBTOuULnJD4oE6KyVav6KAAAAAElFTkSuQmCC) icon and selecting the required action.
![](/assets/images/AdditionalStep-2-9935dbeb93a117613cb4cef71a09d82e.png) 6. Click **Next**, to move to the next step. Edit as required. 7. To add, duplicate, or delete a step, click the gear icon that appears on the upper right corner of the existing step in the left pane. 8. To reposition a step in the form, hold the cursor on the step in the left pane and move it up or down. > 📝 **Note:** The following steps are mandatory in the form and cannot be deleted or repositioned: * Additional Information step * Email Verification step * Magic link expiry step * Thank you step 9. Click **Theme** to set the background for the form. For more information on how to set a theme, see [Customize theme for the form](/user-guides/DevCenter2.0/CustomizePartnerOnboarding/Customize-theme-for-form.md). 10. Click **Preview** to view the form as it will appear for the Developer or Reseller. 11. Click **Save** and **Publish**.
The form is saved and published. --- # Manage developer applicants Applicant Management System is a comprehensive system within the marketplace to effectively capture, display, and manage applicants. It also supports gated & open signup experiences. The system provides Marketplace managers the ability to: * View and filter your developer leads. * Track the application status through the onboarding process * Perform program-specific actions such as approving applicants or sending invitations to join the marketplace. **To manage the applicants** 1. Click the **Programs** tab. The Program Manager page opens. 2. Click **Manage** in the relevant dialog box to manage the applicants for Developer/ISV program.The Manager page opens and the list of applicants with the following details is displayed: * **Company name** - The applicant company name. * **Contact** - Contact person’s name from the applicant company. * **Email** - The email address of the applicant. * **Submitted** - The date when the application was submitted. * **Status** - The application status. ![](/assets/images/ManageApplicant_DevCenter2.0-832724248625593957f410e1935b7245.PNG) 3. Click ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAADAFBMVEUAAAAAAFUAAKoAAP8AJAAAJFUAJKoAJP8ASQAASVUASaoASf8AbQAAbVUAbaoAbf8AkgAAklUAkqoAkv8AtgAAtlUAtqoAtv8A2wAA21UA26oA2/8A/wAA/1UA/6oA//8kAAAkAFUkAKokAP8kJAAkJFUkJKokJP8kSQAkSVUkSaokSf8kbQAkbVUkbaokbf8kkgAkklUkkqokkv8ktgAktlUktqoktv8k2wAk21Uk26ok2/8k/wAk/1Uk/6ok//9JAABJAFVJAKpJAP9JJABJJFVJJKpJJP9JSQBJSVVJSapJSf9JbQBJbVVJbapJbf9JkgBJklVJkqpJkv9JtgBJtlVJtqpJtv9J2wBJ21VJ26pJ2/9J/wBJ/1VJ/6pJ//9tAABtAFVtAKptAP9tJABtJFVtJKptJP9tSQBtSVVtSaptSf9tbQBtbVVtbaptbf9tkgBtklVtkqptkv9ttgBttlVttqpttv9t2wBt21Vt26pt2/9t/wBt/1Vt/6pt//+SAACSAFWSAKqSAP+SJACSJFWSJKqSJP+SSQCSSVWSSaqSSf+SbQCSbVWSbaqSbf+SkgCSklWSkqqSkv+StgCStlWStqqStv+S2wCS21WS26qS2/+S/wCS/1WS/6qS//+2AAC2AFW2AKq2AP+2JAC2JFW2JKq2JP+2SQC2SVW2Saq2Sf+2bQC2bVW2baq2bf+2kgC2klW2kqq2kv+2tgC2tlW2tqq2tv+22wC221W226q22/+2/wC2/1W2/6q2///bAADbAFXbAKrbAP/bJADbJFXbJKrbJP/bSQDbSVXbSarbSf/bbQDbbVXbbarbbf/bkgDbklXbkqrbkv/btgDbtlXbtqrbtv/b2wDb21Xb26rb2//b/wDb/1Xb/6rb////AAD/AFX/AKr/AP//JAD/JFX/JKr/JP//SQD/SVX/Sar/Sf//bQD/bVX/bar/bf//kgD/klX/kqr/kv//tgD/tlX/tqr/tv//2wD/21X/26r/2////wD//1X//6r////qm24uAAAACXBIWXMAAAk6AAAJOgHwZJJKAAAAB3RJTUUH6QQWBw02AjazOAAAADRJREFUGJVj+I8BGEgTmjQJXeg2A8NtwqqINJ5BBd2s2yoqGKpgavCblYvNqRiqyHYqAgAApuY228q7lDEAAAAASUVORK5CYII=) icon for the required applicant and you can do the following: * **View Profile** - Click this option to view the applicant profile details. * **Approve** - Click this option to approve the applicant, a confirmation message appears with the following options: * **Approve** - Click this to create a new user and company and to send an activation email. * **Approve & Do Not Activate** - Click this to approve the applicant but you can send the activation email later. * **Defer** - Click this option to defer the decision on the applicant. * **Decline** - Click this option to decline the applicant. You can always reconsider the decision and update the status accordingly at a later date. * **Delete** - Click this option to delete the applicant. --- # Add leads You can directly add a lead from the Developer Applicant section without needing to go through the onboarding flow. **To add a new lead** 1. Click the **Add Lead** button, the onboarding form opens in a new tab. 2. Provide the required information and click **Next**. Do this till the page shows the **Submit Application** button. 3. Click the **Submit Application** button.
The applicant entry is added to the **Developer Applicant** list and is in **Pending Review** status. The marketplace manager can now review the application and approve, decline, or defer the application. --- # Download applicant list You can download the list of applicants as a CSV file to perform the following advanced filtering on the downloaded data: * Sort and filter leads more effectively. * Apply lead scoring * Add custom lead notes in CSV-supported applications like Excel or Google Sheets. **To download the CSV file** 1. Click the **Download CSV** button.
The CSV file is downloaded to your local machine and includes the full questions and answers submitted by applicants. > 📝 **Note:** > > * Questions and answers are exported in the exact order they were submitted by each applicant. > * Optional questions that were left unanswered are exported with the answer left blank. > * The order of questions can vary over time when the applicant form is changed. --- # Search and filter data You can search the applicant list based on specific search criteria or filter the list based on submission date and status. You can show or hide the filter section by clicking on the filter icon. * To filter based on submission date, click the drop down in the **Submission Date** field and select from the following available options: * This week * This Month * This quarter * Custom date range * To filter based on statuses, click the drop down in the Status field and select the required status. * To search for a specific applicant, use the applicant search bar to search by company name, applicant name, or email address. The list is populated based on the filters applied or the search criteria given. --- # Elevating Your Marketplace Explore opportunities with our adaptable platform extensions, built to enrich your marketplace by enabling you to integrate custom functionalities with embedded React applications. [Get Started](/user-guides/extensions/getting-started.md) ### How to Guides By following these step-by-step tutorials, you'll learn how to create, publish, and manage platform extensions. [Creating a New Extension](/user-guides/extensions/how-tos/create-extension.md)[Publishing an Extension](/user-guides/extensions/how-tos/preview-publish.md)[Using the Marktplace Context Data](/user-guides/extensions/how-tos/marketplace-context.md)[Using Marketplace APIs](/user-guides/extensions/how-tos/marketplace-data.md)[Static Assets](/user-guides/extensions/how-tos/add-static-assets.md)[Localization](/user-guides/extensions/how-tos/localization.md) ### Developer Tools Use our powerful toolkit to install and edit your code, develop your extensions on a local machine and test in browser. [UI Toolkit](/user-guides/extensions/how-tos/installation.md)[Local Extension Development](/user-guides/extensions/how-tos/local-development.md) ### Component Library At AppDirect, we use [Mantine 7](https://mantine.dev/) to build powerful and accessible UIs. It's already ready to use in your extension, we also support a range of other libraries. [Components Library Reference](/user-guides/extensions/reference/components-library.md) ### External API Integration Integrate data from your own APIs and other 3rd party services in your platform extensions. [API Integration with Secure Tokens](/user-guides/extensions/how-tos/secure-token-for-api-integration/.md) ### Architecture Gain insight into the fundamental technologies behind platform extensions. [Extensions Reference Architecture](/user-guides/extensions/reference/architecture.md) --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Getting Started The platform extensions system is a powerful feature that allows 3rd party developers to build custom UI applications and embed them inside the marketplace. This documentation provides a comprehensive guide to building and uploading platform extensions to the platform. It includes step-by-step instructions, best practices, troubleshooting guidance, and examples. ## What is a platform extension?[​](#what-is-a-platform-extension "Direct link to What is a platform extension?") A platform extension is a front-end application that is built using the platform extensions system. platform extensions are built using web technologies such as React, CSS, and JavaScript. They can be embedded within our platform and interact with the marketplace APIs. * It can be a single-page or a multi-pages application. * It has a path (example: /app/my-extension) * It can be linked to the marketplace navigation. * You can control who can access it. For more information on platform extensions, refer to [extension reference architecture](/user-guides/extensions/reference/architecture.md). ### Core Technologies[​](#core-technologies "Direct link to Core Technologies") 1. [React](https://reactjs.org/) 2. [Styled Components](https://styled-components.com/) 3. [Webpack - Module Federation](https://webpack.js.org/concepts/module-federation/) ## Prerequisites[​](#prerequisites "Direct link to Prerequisites") Before you begin, you must have the following: * Access to your marketplace with the role Marketplace Manager * Be comfortable with the command line, and have Node.js 16+ installed ### Steps to get started[​](#steps-to-get-started "Direct link to Steps to get started") 1. [Install the toolkit](/user-guides/extensions/how-tos/installation.md). 2. [Create a new extension](/user-guides/extensions/how-tos/create-extension.md). 3. [Work locally](/user-guides/extensions/how-tos/local-development.md) on your new extension. 4. When ready, [upload](/user-guides/extensions/how-tos/upload-extension.md) and [publish](/user-guides/extensions/how-tos/preview-publish.md) your extension. ## Next Steps[​](#next-steps "Direct link to Next Steps") Discover the extensive possibilities offered by extensions, which harness the combined strength of the platform's marketplace APIs and the diverse ecosystem of npm packages. This enables the creation of custom UI applications that integrate seamlessly with the marketplace. --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Add Static Assets If you are developing an extension that requires static assets such as images, videos, or CSS files, you can easily add them to your extension and access them in your code. In order to add static assets to your extension, you need to follow these steps: ### Step 1: Add Your Static Assets[​](#step-1-add-your-static-assets "Direct link to Step 1: Add Your Static Assets") Add your static assets to the **static/assets** folder of your extension. You can add any type of static asset, such as images, videos, or CSS files. ``` . └── src └── static └── assets ├── myimage.png ├── styles.css └── video.mp4 ``` ### Step 2: Access Your Static Assets[​](#step-2-access-your-static-assets "Direct link to Step 2: Access Your Static Assets") You can access your static assets in your extension's code by using the `window.get_extension_assets function`. This function takes the filename of the asset you want to fetch as a parameter. For example, if you have an image named `myimage.png` in your **static/assets** folder, you can fetch it in your code like this: ``` const App = () => { const imageUrl = window.get_extension_assets('myimage.png'); return (
test img
); }; ``` This will return the URL of the image, which you can use to display the image in your extension. And that's it! By following these simple steps, you can easily add static assets to your extension and access them in your code. --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Create a new extension This documentation will walk you through the entire process of creating and configuring your extensions, ensuring that you have a smooth experience while expanding your marketplace's capabilities. Extensions are an excellent way to enhance your platform by adding new features, customizing pages, or even overriding existing pages to tailor them to your specific needs. Before you begin, make sure you've met the **following prerequisites**: * You have a **marketplace account with the proper role**. Creating a new extension requires you have the **marketplace manager** role. * You have the **toolkit installed**. If you haven't installed it yet, follow the [provided instructions](/user-guides/extensions/how-tos/installation.md). By following the instructions outlined below, you will successfully create a new extension in the marketplace and set it up with the toolkit. The steps are easy to follow, and you can always update the information later if needed: ## Step 1. Create a new extension in the marketplace[​](#step-1-create-a-new-extension-in-the-marketplace "Direct link to Step 1. Create a new extension in the marketplace") 1. Log in to the marketplace using your credentials. 2. Once logged in, navigate to the `/admin/extensions` section within the marketplace dashboard. 3. Locate the "Create an extension" button at the top-right corner of the page and click on it to proceed. 4. You will be directed to the "Create Extensions" form. Rest assured, any information entered in this form can be modified later if necessary. 5. Provide a unique and descriptive name for the extension, as well as the desired path where the extension will be stored. 6. Determine the extension type that best suits your needs. There are three options: a. **Unlinked Page**: A page accessible within the marketplace but not connected to a specific menu. b. **Linked Page**: Creates a new menu item accessible through the marketplace's navigation menus. 7. If you opt for a Linked Page, you will need to select the appropriate menu (secondary or tertiary) and provide a label for the extension. The new extension will only appear in the marketplace once it's published and enabled. 8. Establish the access role for the extension to control user accessibility: a. **Everyone**: Accessible to all users, including those who are logged out. b. **Logged-in users**: Accessible only to users who are logged in to the marketplace. c. **Specific roles**: Accessible exclusively to users with assigned roles. 9. Customize the page layout, if necessary. While it's generally recommended to keep the default platform layout, you can remove the header/footer or modify the background color to suit your needs. 10. After completing these steps, click "Save" to create the new extension. ## Step 2. Create a new extension using the UI Toolkit[​](#step-2-create-a-new-extension-using-the-ui-toolkit "Direct link to Step 2. Create a new extension using the UI Toolkit") With the extension now configured, the following steps will guide you through linking the extension to actual code using the UI Toolkit: 1. On the `/admin/extensions` page, locate your newly created extension in the table. It should be the first entry in the list. 2. Hover over the info icon under the `Status` column. A tooltip will pop up. 3. Copy the command displayed in the tooltip. You have the option to click the button to copy the command or to copy it manually. The command will resemble the following, adjusted with your extension's values: ``` sfb-toolkit create-extension ``` 4. Open a command-line window (i.e. a terminal or command prompt). 5. Navigate to the workspace folder you created with the UI Toolkit's `setup` command. 6. Execute the command that you copied earlier. 7. `cd` to your extension's directory, which should be found under `extensions/`. 8. Run `npm install` to install all of the extension's dependencies. (This might take some time). 9. Once the command has completed, your extension will have been successfully created! Congratulations! You've successfully created your first extension. Now that you have a basic understanding of the process, you can continue exploring our other guides to learn how to [work locally](/user-guides/extensions/how-tos/local-development.md) and [upload your first extension](/user-guides/extensions/how-tos/upload-extension.md). Happy coding! --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Install the UI Toolkit You can install the UI Toolkit on either macOS or Windows. The UI Toolkit has certain prerequisite programs that must be in place before you can install it. The Toolkit installation itself is performed from the command line. A video tutorial of an installation is available [here](https://drive.google.com/file/d/17dzkvmpUoXWe1Sz_t6Dxy1eQ1kJ1iV6N/view?usp=sharing). ## Prerequisites[​](#prerequisites "Direct link to Prerequisites") Before you can install and use the UI Toolkit, you must install certain third-party programs as prerequisites. These include the Node.js environment and the node-sass library. info For Node.js installation, we recommend that you use the Node Version Manager (`nvm`) application. This application is a version manager for node.js, designed to be installed per-user, and invoked per-shell. The `nvm` application works on any POSIX-compliant shell (sh, dash, ksh, zsh, bash), in particular on Unix, MacOS, and Windows WSL. ### Installing Node Version Manager[​](#installing-node-version-manager "Direct link to Installing Node Version Manager") To install `nvm`, run this command at the command line: ``` curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash ``` ### Other OS-Specific Prerequisites[​](#other-os-specific-prerequisites "Direct link to Other OS-Specific Prerequisites") After `nvm` is installed, you can continue with the prerequisites listed in the table below: | For MacOS | For Windows 10 | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 1. [Node.js 16](https://nodejs.org/en/). Cross-platform JavaScript runtime environment for servers and applications.
2. [Node-sass](https://www.npmjs.com/package/node-sass). This is a library that provides binding for Node.js to LibSass and it must be installed as a global dependency. To install it, run `npm -g install node-sass` from the command line.
3. Text editor—For code, markup, and prose, such as [Sublime Text](https://www.sublimetext.com/).
4. [Xcode](https://itunes.apple.com/us/app/xcode/id497799835?mt=12)—Development environment for macOS containing a suite of software development tools.
5.[Command line tools](#Xcode). Specifically for Xcode, it includes a package that enables UNIX-style development through Terminal by installing command-line tools and macOS SDK frameworks and headers.To download command line tools for Xcode1) Click **Xcode** in the top menu bar, then click **Open Developer Tool > More Developer Tools**. 2) Enter your Apple ID password. The Downloads for Apple Developers page opens. 3) Select and download the Command Line Tools that is compatible with your computer. You must download the package that is compatible with *both* your macOS and Xcode versions. 4) Open the Command Line Tools folder and download the file. | 1.[Node-sass](https://www.npmjs.com/package/node-sass). This is a library that provides binding for Node.js to LibSass and it must be installed as a global dependency. To install it, run `npm -g install node-sass` from the command line.
2. Text editor—For code, markup, and prose, such as [Sublime Text](https://www.sublimetext.com/). | ## Install the UI Toolkit[​](#install-the-ui-toolkit-1 "Direct link to Install the UI Toolkit") After you install the necessary third-party programs, you can install the UI Toolkit through the command line. To install the UI Toolkit, follow these steps: 1. Open a command-line window. 2. Run the command `npm install -g @appdirect/sfb-toolkit`. (This might take a few moments to finish). ## Set up your workspace[​](#set-up-your-workspace "Direct link to Set up your workspace") After the UI Toolkit has been installed, you should have access to the `sfb-toolkit` command. You'll be able to use this command to setup a workspace folder. This folder structure will contain a sample theme, which you can use as a starting point for your own theme. All extensions you create will be added to a folder named `extensions`. info During this setup you must specify the marketplace to which the toolkit will be linked. This enables you to draw on that marketplace for data during development. To set up your workspace folder, follow these steps: 1. Navigate to a folder in your file system where you want to setup your workspace folder. 2. Type `sfb-toolkit setup ` and press **Enter**. (The *``* is the top-level folder for your workspace which will contain the themes and extensions folders. 3. You'll be prompted to agree to the terms of [the license agreement](https://help.appdirect.com/sfb-eula.pdf). To continue, type `agree` and press **Enter**. 4. You'll be prompted to select one of the standard marketplace themes as a starting point for your first theme. The choices are *classic* and *Plaza*. This is a required step even for extensions when installing the toolkit for the first time. 5. Use the arrow keys to highlight the base theme you want, and press **Enter**. 6. Type a theme name and press **Enter**. A folder with the specified name is created on your computer. It includes all of the files required to create a custom theme. You are prompted to type the marketplace path. 7. Type your full marketplace URL. important Ensure that you include `https://` in the URL. Press **Enter**. You can now import data from the specified marketplace when you Use the developer toolbar in your browser. Congratulations! You have successfully installed the UI Toolkit, continue on by [creating your first extension](/user-guides/extensions/how-tos/create-extension.md). --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Local Extension Development Developing and testing your extension locally is an essential step before publishing it to the Marketplace. In this guide, we will take you through the necessary steps to get your extension up and running on your local machine. Before we get started, please ensure that you have the **following prerequisites** in place: * The UI Toolkit has been installed * An extension has been created ## Enable Developer Mode[​](#enable-developer-mode "Direct link to Enable Developer Mode") The first step in working locally is to enable developer mode. This mode allows you to run your extension on your local machine and test it before publishing it to the Marketplace. Developer mode can be found on the extensions listing page. Once enabled, you will have 8 hours to work on your extension from this computer. After 8 hours, you will need to re-enable developer mode. Here are the steps to enable developer mode: 1. Navigate to `/admin/extensions` on your Marketplace. 2. Locate the extension you want to modify and click on the three dots, then select "Enable Developer Mode". ![Enable Developer Mode](/assets/images/developer_mode-03ea3b31e55df44c4ffb0b236fb55891.png) 3. A message will confirm that developer mode has been enabled. caution **The developer mode will be enabled for 8 hours and for this user *only***. Each developer needs to login and enable developer mode for themselves to work on extensions locally. ## Start the UI Toolkit[​](#start-the-ui-toolkit "Direct link to Start the UI Toolkit") With developer mode enabled for your extension, it's time to start the UI Toolkit and work on your extension locally. Follow these steps: 1. Open a command-line window (i.e. a terminal or command prompt). 2. Navigate to the workspace folder you created with the UI Toolkit's `setup` command. 3. `cd` to your extension inside of the `extensions` directory. For example, if your extension is called `my-extension`, you'll have find it under `/extensions/my-extension`. 4. Run the command `npm run start` 5. The console should display a message indicating that the toolkit is running and the URL to access your extension locally. ``` Welcome to your extension development environment! You can view access your extension local version using the following URL: https://engage19billing.test.devappdirect.me/app/desiredPath?devMode=true&appName=microuits ``` 6. Open this URL in your Marketplace to see your extension running locally. 7. Any changes you make to your extension will automatically update in the browser. That's it! You are now set to work on your extension locally. --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Localization At AppDirect, we recognize the significance of localization for customers operating across various markets. Our platform extensions boilerplate app integrates [react-intl](https://formatjs.io/docs/react-intl), a widely-used localization library for React applications. This integration enables seamless localization of your front-end pages to cater to your audience's requirements. The comprehensive [react-intl API](https://formatjs.io/docs/react-intl) is accessible, granting you complete access to its features and capabilities. ## Adding a New String[​](#adding-a-new-string "Direct link to Adding a New String") To introduce a new string, modify one of the localization files in the `src/translation` folder of your platform extensions project. These files are organized by language, each containing key-value pairs representing the language-specific localized strings. 1. Open `en.json` in your preferred text editor. 2. Identify the file section corresponding to the component or feature where the new string is needed. If no such section exists, create a new one with a descriptive name. 3. Insert a key-value pair in the section, using a descriptive name for the key. 4. Ensure adherence to JSON best practices, including proper quoting and formatting. ``` { "myNewString": "This is my new string" } ``` To leverage this string in your code you can use the following code snippet: ``` import { FormattedMessage } from 'react-intl'; ``` ## Adding variables and HTML:[​](#adding-variables-and-html "Direct link to Adding variables and HTML:") Sometimes, you may need to include variables or HTML in your localized strings. To do this, you can use the `FormattedMessage` component provided by react-intl. 1. In the localization file, include the variable or HTML in the string, surrounded by curly braces or HTML tags, respectively. 2. In your code, import the `FormattedMessage` component from `react-intl`. 3. Use the `FormattedMessage` component with the `id` prop set to the key of your localized string and the `values` prop set to an object containing any variables or HTML you need to include. Adding variables and HTML to a string: ``` { "myNewString": "This is my new string with a variable {variable} and a link AppDirect" } ``` You can then use this string in your code like this: ``` ({chunks})}} /> ``` ## Adding a new locale:[​](#adding-a-new-locale "Direct link to Adding a new locale:") If you need to add a new locale, such as French or German, you can simply copy the `en.json` file and rename it to the appropriate locale code, such as `fr.json` or `de.json`. You can then translate the strings in this file to the appropriate language. To know the exact locale code to use, you can extract it from the marketplace context using the `useMarketplaceContext` hook provided by our SDK. ``` import useMarketplaceContext from "../../hooks/useMarketplaceContext"; const { bootstrap, tenant, locale } = useMarketplaceContext(); ``` --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Accessing Company, User, and Settings Data This guide concentrates on Bootstrap Data, a hook that grants access to various marketplace configurations and user details. Utilizing this data enables you to tailor a more personalized experience for your users. Let's get started! ## How to Access[​](#how-to-access "Direct link to How to Access") Included with the extensions is a hook that allows you to access an extensive array of marketplace configurations and user details. To retrieve this data, employ the `useMarketplaceContext` hook. ``` import useMarketplaceContext from "../../hooks/useMarketplaceContext"; const App = (): JSX.Element => { const { bootstrap, tenant, locale } = useMarketplaceContext(); }); ``` ## Bootstrap Data Contents[​](#bootstrap-data-contents "Direct link to Bootstrap Data Contents") The bootstrap data comprises a JSON object that includes the following details: * User information: Fundamental data about the logged-in user, including their name and email address. * Company information: Essential information about the user's company, like the company name and address. * Marketplace settings: Details about the marketplace, such as its name, active features, theme, and locale. ``` { "metaDescription": "Marketplace allows you to use and manage business applications in one simple and secure platform, from anywhere.", "metaKeywords": "Marketplace, saas, applications, marketplace, web-based apps, business apps", "metaNoIndex": false, "analyticsId": "UA-12234234838-2", "marketPlaceName": "AppDirect Marketplace", "theme": "appsmart", "locale": "en-US", "localeLanguage": "en", "dateFormat": "MM/DD/YY", "dateTimeFormat": "MM/DD/YY h:mm:ss a", "defaultCurrency": "USD", "defaultCountry": "US", "currencyFormats": { "USD": { "symbol": "$", "decimal": ".", "thousand": ",", "precision": 2, "format": "%s%v" } }, "UserInfo": { "profilePic": null, "name": "Name", "email": "my.email@company.com", "idpUuid": "6708c6a1-5f6a-4aeb-9b8a-79sdfsdf71b", "hasIdpAccountsMarketplace": false, "verified": true, "locale": "en_US", "tester": false, "currency": "USD", "ownedPartners": [], "user_id": "7dd3d02d-b269-4970-912c-d6asdasd97", "given_name": "John", "family_name": "Smith", "company_id": "3dc98547-47dd-47bb-9b01-4562342342342e6", "roles": [ "UPDATE_SUBSCRIPTION_WITH_UNPAID_INVOICE_FOR_SELF_SERVE", "BILLING_ADMIN", "CREATE_QUOTE", "USER" ], "attributes": {}, "customUserAttributes": {}, "customUserAttributesIds": {} }, "CompanyInfo": { "uuid": "3dc98547-47dd-47bb-9b01-4569be3412e6", "name": "AppDirect", "partner": "APPSMART", "contactInformation": { "street1": "3128 Highwoods Blvd", "street2": "Ste. 140", "city": "Raleigh", "state": "NC", "zip": "27604", "country": "US", "phone": "866-456-3211" }, "salesOpportunitiesEnabled": false, "salesLeadsEnabled": false, "resellersCanCreateCompanies": true, "resellersCanManageCustomers": true, "externalIdentifier": "d8dde0c9-1e34-4dd1-a352-81bb55e62601", "passwordPolicy": "password.policy", "passwordPolicyRegex": "(?=.{8,})((?=.*\\\\d)|(?=.*\\\\W))((?=.*[A-Z])|(?=.*[a-z])).*", "onlyAdminsCanBuy": true, "importAppsEnabled": true, "importAppsLimit": -1, "importedAppsCount": 110, "companyWideBilling": false, "channelAdmin": true, "vendor": true, "reseller": false, "allowMembershipCreationByMarketplaceUsers": false, "companySsoOverrideEnabled": true, "directoryConnectorEnabled": true }, "CHANNEL_SETTINGS": { "partner": "MYPARTNER", "linkedPartnerUrl": null, "companyName": "MyCompany", "allowSalesAgentEnterPaymentDetails": true, "accountInvoiceV2Enabled": true, "invoiceTemplatesEnabled": false, "approvesUserContent": true, "currency": "USD", "currencies": [ "USD" ], "hideAllUI": false, "hideQuestions": true, "hideSupportSection": false, "supportRequired": false, "featuresRequired": true, "identityProvider": false, "includeCaptchaInRegistration": false, "localeTags": [ "en-US" ], "defaultLocale": "en-US", "defaultLocaleCountry": "US", "defaultLocaleCountryIso3": "USA", "minimumReviewsForRating": 1, "oneClickTrialEnabled": false, "channelDecidesIfOnlyAdminsCanBuy": false, "allowExternalValidation": false, "collectPurchaseRequestDetails": true, "partnerName": "AppDirect", "recaptchaPublicKey": null, "reviewRequirePurchase": true, "displayTaxBreakdown": false, "displayTaxSubtotal": false, "flatTaxRate": null, "supportContactUrl": "https://support.appsmart.com/", "supportUrl": "https://support.appsmart.com/", "supportPhone": "833-427-7762", "supportEmail": "help@appdirect.com", "privacyPolicyUrl": "https://www.appdirect.com/legal/procurement/appdirect-marketplace-privacy-policy", "legalDetailsUrl": null, "termsUrl": "https://www.appdirect.com/legal/procurement/appdirect-marketplace-terms-and-conditions", "trustedProviders": [], "cmsCurrencies": [ "USD" ], "hideSignupLinks": false, "capabilities": [ "CHECKOUT", "NETWORK_CATALOG", "STORE_FRONT", "FULL_PRODUCT_INTEGRATION", "CHANNEL_MANAGEMENT", "CUSTOMER_APPLICATION_MANAGEMENT", "MIGRATION", "SECURITY_SETTINGS", "QUESTIONS_AND_ANSWERS", "RESELLER_SIGNUP", "CHANNEL_PAYMENT_GATEWAY", "DEVELOPER", "PRODUCT_BUNDLES", "DEVELOPER_NETWORK", "HOSTED_CHECKOUT", "RESELLER", "NETWORK_CATALOG_MANAGEMENT", "CUSTOMER_BILLING_MANAGEMENT", "PRODUCT_PURCHASE", "USER_MANAGEMENT" ], "hideCustomerInfoFromDevelopers": false, "supportedProductTypes": [ "WEB_APP", "CLOUD_SERVICES", "HARDWARE_SERVICE", "DOWNLOAD_WITH_FULL_PROFILE", "STATIC", "DOMAIN_RESELLER", "EXTERNAL", "EMBEDDED_VIDEO", "PHYSICAL_PRODUCT", "WEB_APP_MANUAL_SETUP", "WEB_APP_STACKED" ], "zipCodeValidationEnabled": false, "vatIdValidationEnabled": false, }, "SERVER_TIME_ZONE": "-04:00", "DATE_PICKER_FORMAT": "mm/dd/yy", "languages": { "da": "Dansk", "de": "Deutsch", "en-US": "English (United States)", } } ``` --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Using the Marketplace APIs ## Overview[​](#overview "Direct link to Overview") AppDirect's suite of APIs enables you to build custom UI applications that leverage the same APIs that underpin the AppDirect Marketplace. For instance, you can manage users, companies, and subscriptions using these APIs. Extensions can access these APIs without requiring OAuth clients, as they are rendered within the context of a logged-in user on the marketplace. Refer to the following for a complete list of marketplace APIs and their corresponding documentation: * [API User Guides](https://developer.appdirect.com/user-guides) * [Graphql API reference](/graphql-docs/docs) * [REST API reference](https://developers.appdirect.com/rest-api) ## Using Marketplace GraphQL API[​](#using-marketplace-graphql-api "Direct link to Using Marketplace GraphQL API") We recommend using the GraphQL API when possible, as it provides several advantages for our customers. GraphQL is a query language and runtime for APIs that enables efficient data retrieval and management. It delivers a thorough representation of the marketplace API data, allows clients to request only the data they need, and facilitates easier API adaptation over time. ### Using GraphQL APIs with React Query[​](#using-graphql-apis-with-react-query "Direct link to Using GraphQL APIs with React Query") The extension blank boilerplate includes a hook that leverages the marketplace GraphQL API, which can be a great starting point for your extension. The hook is built using [React Query](https://react-query.tanstack.com/), a data fetching library for React. React Query is a great choice for fetching data from APIs. The example below demonstrates a basic use case for fetching data from an API with React Query. For more detailed information and guidance on fetching, posting, and testing using React Query, refer to the [official documentation](https://tanstack.com/query/v4/docs/quick-start) or check out [Practical React Query](https://tkdodo.eu/blog/practical-react-query). ``` // hook const GET_ACCOUNT = gql` query { me { id firstName lastName email currentMembership { roles account { name id } } } } `; const fetch = async (): Promise => { return request("/graphql-docs/docs", GET_ACCOUNT); }; const useMarkeplaceAccount = (): UseQueryResult => useQuery([`account_me`], () => fetch(), { cacheTime: 0 }); export default useMarkeplaceAccount; // in a component const { data, isSuccess, isError, isLoading } = useMarkeplaceAccount(); console.log(data, isSuccess, isError, isLoading); ``` ## Posting Data Using our Rest APIs[​](#posting-data-using-our-rest-apis "Direct link to Posting Data Using our Rest APIs") Some of our REST APIs require a CSRF token to be passed in the header (`X-XSRF-TOKEN`). You can retrieve the CSRF token from the marketplace using the following code: ``` const cookie = document.cookie || ''; const getCookieValue = name => { const result = cookie.match(`(^|;)\\s*${name}\\s*=\\s*([^;]+)`); return result ? result.pop() : ''; }; const xsrfToken = getCookieValue('XSRF-TOKEN'); // then in the request if (xsrfToken) { headers['X-XSRF-TOKEN'] = xsrfToken; } ``` --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Extension Preview, Publication, and Enabling Developers utilizing our extension system create custom UI applications to augment the platform's capabilities. This document serves as a comprehensive guide to previewing, publishing, and enabling platform extensions, ensuring they are ready for users. Each action is a crucial component of the extension deployment process: 1. **Preview**: Test your extension in a live environment to identify and resolve potential issues before making it available to users. 2. **Publish**: Make the new extension version accessible to users after uploading it and verifying its functionality. 3. **Enable**: Make your extension available to users, separate from the publishing process, allowing you to enable or disable it at any time to streamline testing and validation. The following sections detail the step-by-step process for each of these essential actions. ## Previewing an Extension[​](#previewing-an-extension "Direct link to Previewing an Extension") Before publishing, preview the extension in a live environment to ensure it functions as expected: 1. Go to `/admin/extensions`, locate your extension, and click the eye icon. ![Preview Extension](/assets/images/preview-9ce58a211902a73650b8d2f01092de9d.png) 2. The extension will load in the same tab for review and validation. 3. After validation, click the X icon in the top-left corner to return to the extensions list. ![Preview Extension](/assets/images/preview2-1907938901d7802c4986e28154d9d005.png) ## Publishing an Extension[​](#publishing-an-extension "Direct link to Publishing an Extension") Publishing makes the new extension version available to users. After uploading a new version, its status becomes "unpublished." Review and validate the extension before publishing: 1. Go to `/admin/extensions` and locate your extension. 2. Click the 3 dots icon and select "Publish." ![Publish Extension](/assets/images/publish-e81847edce14b38a8a443423494b0fa7.png) 3. A confirmation message will appear, indicating successful publication. ### Troubleshooting[​](#troubleshooting "Direct link to Troubleshooting") If this is your first publication, the extension might not yet be enabled. Enable it as detailed in the next section. ## Enabling an Extension[​](#enabling-an-extension "Direct link to Enabling an Extension") Enabling makes your extension available to users, independent of the publication process. This separation allows enabling or disabling an extension at any time without publishing updates, simplifying testing and validation. To enable an extension: 1. Go to `/admin/extensions` and locate your extension. 2. Click the "Live Toggle" button to enable it. ![Enable Extension](/assets/images/enable-9a92f24d5fdeb0c2f1f4c66a51926fc0.png) 3. The toggle will turn green, accompanied by a confirmation message indicating successful enabling. Congratulations! Your first extension is now live on the marketplace. To verify its presence, click the extension path, which will redirect you to the extension itself. --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Integrate External APIs with Secure Tokens ## Introduction[​](#introduction "Direct link to Introduction") Our platform extension platform is designed for seamless integration with external APIs, outside of the marketplace. It ensures authenticated access to external APIs using Cross-Origin Resource Sharing (CORS) headers and JSON Web Tokens (JWT). This facilitates third-party integrations, data visualization, analytics, and more with custom data sources. ## Key Features[​](#key-features "Direct link to Key Features") 1. **Third-Party Integrations**: Enables integration of third-party applications or services into the existing platform extension, enabling a range of integrations like complex analytics dashboards and new user interface workflows. 2. **Security and Data Control**: Uses CORS headers and JWT for secure API communication and data protection. ## How it works[​](#how-it-works "Direct link to How it works") 1. In your platform extension, you use our special function that will fetch the JWT token from the marketplace and add it to your request to your API. 2. In your API you will need to validate the token to ensure that the request is coming from the marketplace. ## Helpful Links and Guides[​](#helpful-links-and-guides "Direct link to Helpful Links and Guides") 1. [How to - Fetch Tokens in the Platform Extension](/user-guides/extensions/how-tos/secure-token-for-api-integration/fetch-token.md): A guide on retrieving JWT tokens in the Platform Extension. 2. [How to - Validate Tokens in External APIs](/user-guides/extensions/how-tos/secure-token-for-api-integration/validate-token.md): Instructions for validating the JWT tokens for secure API communication. 3. [Reference - Understanding the Token System](/user-guides/extensions/reference/secure-token-system.md): A detailed explanation of the JWT and CORS setup in the platform. --- # Fetch Token Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. ## Overview[​](#overview "Direct link to Overview") This guide details the process of acquiring a JWT token from our API, which is essential for authenticating requests to your API. ## Step-by-Step Instructions[​](#step-by-step-instructions "Direct link to Step-by-Step Instructions") To simplify the use of our JWT token, you can utilize the `fetchExternalData` function, which automatically appends the token to the request header. 1. Begin by importing the `serviceAuthToken` object. ``` import serviceAuthToken from "../../functions/serviceAuthToken"; ``` 2. Call your external API using `serviceAuthToken.fetchExternalData`. This function issues a promise that resolves to an object containing the data from the external API. It automatically includes our `JWT token` in the `header` under `MP-Authorization`. ``` # Example curl command to demonstrate JWT token inclusion curl -X GET "http://example.com/api/auth/v1/sessions/userinfo" \ -H "Accept: application/json" \ -H "MP-Authorization: Bearer YOUR_JWT_TOKEN_HERE" ``` Example of the fetchExternalData usage: ``` const { errorMessage, status, response } = await serviceAuthToken.fetchExternalData( "http://example.com/api/auth/v1/sessions/userinfo", { method: "GET", credentials: "include", headers: { "Content-Type": "application/json", }}, 5000 ); ``` In this instance, `tokenInvalidTimer` is set to 5000ms, or 5 seconds. caution The external endpoint call defined by `url` is **NOT** cached. **Parameters:** 1. `url`: URL of the desired endpoint. 2. `fetchOptions`: an object structurally similar to the `fetch` API's input, including all its attributes. 3. `tokenInvalidTimer`: an optional parameter that sets the duration for JWT token caching in memory. note The `tokenInvalidTimer` can be set from 0ms to `180000ms` (3 minutes), with a default of `180000ms`. **Returned Object:** 1. `errorMessage`: any error message received. 2. `status`: the network error status (e.g., 200, 500). 3. `response`: the response from the `url` endpoint. ## Manually Fetching the JWT Token[​](#manually-fetching-the-jwt-token "Direct link to Manually Fetching the JWT Token") If you prefer to manually retrieve the token for use with your custom hooks, you can use the following `serviceAuthToken` functions: 1. [`getServiceAuthToken(tokenInvalidTimer)`](/user-guides/extensions/how-tos/secure-token-for-api-integration/fetch-token.md#1-getserviceauthtoken) 2. [`reset()`](/user-guides/extensions/how-tos/secure-token-for-api-integration/fetch-token.md#3-reset) ### 1. getServiceAuthToken[​](#1-getserviceauthtoken "Direct link to 1. getServiceAuthToken") Calling this function returns a promise resolving to an object with the JWT token. Example with `tokenInvalidTimer` set to 5000 milliseconds: ``` const { errorMessage, status, token } = await serviceAuthToken.getServiceAuthToken(5000); ``` **Parameters:** 1. `tokenInvalidTimer`: an optional parameter for setting the token cache duration in memory. note The `tokenInvalidTimer` can be a value from 0ms to `180000ms` (3 minutes), defaulting to `180000ms`. **Returned Object:** 1. `errorMessage`: any error message received. 2. `status`: the network error status (e.g., 200, 500). 3. `token`: the JWT token. ### 2. reset[​](#2-reset "Direct link to 2. reset") This function clears the cached JWT token. ## Complete Example[​](#complete-example "Direct link to Complete Example") ``` import React, { useState } from "react"; import serviceAuthToken from "../../functions/serviceAuthToken"; interface UserInfo { userName: string; email: string; } const App = (): JSX.Element => { const [userInfo, setUserInfo] = useState(); const callAPI = async (): Promise => { const { errorMessage, status, response } = await serviceAuthToken.fetchExternalData( "http://example.com/api/auth/v1/sessions/userinfo", // specify your endpoint URL { // specify your fetchOptions method: "GET", credentials: "include", headers: { "Content-Type": "application/json", }, }, 5000 // optional ); const { userName, email } = response; setUserInfo({ userName, email }); }; return (

Hello World!

Example API call to retrieve data:
Username: {userInfo?.userName}
Email: {userInfo?.email}
); }; export default App; ``` --- # Validate Token Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. After fetching the authentication token in your extension app, the token can now be included with the requests to your API. Before processing the request in your API, it is important to validate the token to ensure that the incoming request is initiated by a marketplace user that is using your extension app. This prevents unauthorized access to your APIs. ## Overview[​](#overview "Direct link to Overview") Here is an overview of the steps to validate the token on your API: 1. Get the JWT authentication token from the request. * See [JWT](/user-guides/extensions/reference/secure-token-system.md#jwt-json-web-token) reference for more details. 2. Pull the public key from the marketplace keys endpoint. * Every marketplace has a JWKS (JSON Web Key Set) endpoint that provides the public cryptographic keys that was used to sign, and that can be used to validate the token. 3. Use the public key to validate the authentication token. 4. If the token is valid, process the request. Otherwise, return an appropriate error response. ## Implementation details[​](#implementation-details "Direct link to Implementation details") The example below demonstrates how to validate the token using a middleware in Node.js with Express. Here are a few notable details: #### 1. Getting marketplace information[​](#1-getting-marketplace-information "Direct link to 1. Getting marketplace information") To validate that the request came from your marketplace, the `MARKETPLACE_BASE_URL` and `MARKETPLACE_TENANT` should be either defined in an environment variable, or obtained from the request. #### 2. Enabling CORS (Cross-Origin Resource Sharing)[​](#2-enabling-cors-cross-origin-resource-sharing "Direct link to 2. Enabling CORS (Cross-Origin Resource Sharing)") To allow requests from the marketplace to your API, CORS needs to be enabled on your API server. See [CORS](/user-guides/extensions/reference/secure-token-system.md#cors-cross-origin-resource-sharing) reference for details. #### 3. Getting and securing the auth token[​](#3-getting-and-securing-the-auth-token "Direct link to 3. Getting and securing the auth token") The auth token can be included in your extension app request, then obtained in your API server via the request header, such as the `MP-Authorization` header shown in this example. There are also other means to send token, such as via request body, query param, or cookie, but keep in mind the [security considerations](/user-guides/extensions/reference/secure-token-system.md#security-considerations). #### 4. Using a JWKS library to connect to public key endpoint[​](#4-using-a-jwks-library-to-connect-to-public-key-endpoint "Direct link to 4. Using a JWKS library to connect to public key endpoint") The `jwks-rsa` library is used to simplify the process of validating an auth token against a set of public keys from a JWKS endpoint. * A JWKS client is created to connect to the marketplace public keys endpoint. * Inside `getKey` function, the JWKS client is used to get the specific public key that matches the auth token's key identifier (`header.kid`), using `jwksClient.getSigningKey`. The `publicKey` is returned by the function. Alternatively, this can also be done without this library with these steps: fetch the keys from the endpoint, find the JWK that matches the token's `header.kid`, convert the JWK to PEM, then verify the token using that PEM. #### 5. Using a JWT library to validate the token[​](#5-using-a-jwt-library-to-validate-the-token "Direct link to 5. Using a JWT library to validate the token") The `jsonwebtoken` library is used to validate the token against the public key returned by the `getKey` function. `jwt.verify` returns decoded token and error, if any. * If token is invalid or expired, log error in `err` and return error message. * If tenant in decoded token does not match marketplace tenant, log error and return error message. #### 6. Processing request on successful validation[​](#6-processing-request-on-successful-validation "Direct link to 6. Processing request on successful validation") If token is valid, you can optionally use the user's information in the decoded token. Then you can continue processing the request, by calling `next()`. ## Node Validation Middleware Example[​](#node-validation-middleware-example "Direct link to Node Validation Middleware Example") ``` const jwt = require('jsonwebtoken'); const jwksRsa = require('jwks-rsa'); // can be obtained from env, or from request const MARKETPLACE_BASE_URL = 'https://your-marketplace-url' const MARKETPLACE_TENANT = 'TENANT' // connect to public keys endpoint of marketplace const jwksClient = jwksRsa({ jwksUri: `${MARKETPLACE_BASE_URL}/oauth2/certs` }); const validateToken = async (req, res, next) => { const token = req.header('MP-Authorization'); if (!token) { return res.status(401).send('No token provided'); } // function that gets matching public key from JWKS endpoint const getKey = (header, callback) => { jwksClient.getSigningKey(header.kid, (err, key) => { if (err) { console.error(`Error fetching public key from: ${MARKETPLACE_BASE_URL}`, err); return res.status(500).send('Error fetching public key'); } const publicKey = key.getPublicKey(); callback(null, publicKey); }); }; // validate token using public key from getKey function jwt.verify(token, getKey, (err, decoded) => { if (err) { console.error('Invalid auth token: ', err); return res.status(401).send('Invalid auth token'); } if (decoded?.tenant !== MARKETPLACE_TENANT) { console.error(`Invalid auth token: tenant in token ${decoded.tenant} does not match marketplace tenant ${MARKETPLACE_TENANT}`); return res.status(401).send('Invalid auth token'); } // optional: store user info in request object req.user = { name: decoded.name, tenant: decoded.tenant }; console.info('Token validated'); next(); }); }; module.exports = validateToken; ``` --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Uploading an Extension After developing your platform extension using the platform extensions system, the next step is to upload it to the platform. By following these simple steps, you will be able to upload your extension and make it available to our users. **Step 1: Build your extension**. First, navigate to your extension folder from your terminal. This folder should contain your extension code and assets. Once you are in the correct folder, run the command `npm run build` to build your extension. You should see a message in your terminal confirming that the extension has been successfully built. ![Build Extension](/assets/images/upload_build-c397a5041cfe463048f346b8b3b548cc.png) **Step 2: Locate your extension zip file**. After the build process is completed, navigate to the `/dist` folder within your extension folder. You should see a new zip file in this folder, which contains the latest version of your extension. If you have multiple zip files, look for the one with the latest creation date and time. At this point, the next steps must be completed in the marketplace UI. We currently do not offer a way to upload extensions using the toolkit. **Step 3: Login to the marketplace**. To upload your extension, you must log in to the marketplace where the extension will be hosted. Navigate to the marketplace login page and enter your credentials to access the dashboard. **Step 4: Navigate to the extensions section**. Once you are logged in, navigate to the `/admin/extensions` section of the marketplace dashboard. This is where you can manage your extensions and upload new versions. ![Build Extension](/assets/images/upload_list-3d62741285b7a3b064ce87528618547d.png) **Step 5: Select your extension and upload the new version**. From the extensions list, locate your extension and click on the three-dots menu on the right side of the list. This will open a dropdown menu with the option to "Upload extension." Click on this option, and an upload form will appear. Select the correct zip file that you located in step 2 and hit the upload button to start the upload process. ![Build Extension](/assets/images/upload_upload-631f752002009d1d1547f3996ba25d3e.png) **Step 6: Preview and publish your extension**. Once the upload is complete, you will be redirected to the extensions list page. You can preview the new version of your extension before publishing it to the marketplace. For more information on publishing and making your extension live, refer to the next section of this documentation. Congratulations! You have successfully uploaded your platform extension to our platform using the platform extensions system. You can now [preview](/user-guides/extensions/how-tos/preview-publish.md) and [publish](/user-guides/extensions/how-tos/preview-publish.md) your extension to make it available to our users. --- Important This feature is currently in Early Availability (EA) status. For more information, see our **[product lifecycle phases](https://help.appdirect.com/platform/Default.htm#mng-platform/product-lifecycle.htm)**. # Extensions Architecture ## Overview[​](#overview "Direct link to Overview") Behind our extensions architecture is a set of principles that we believe are key to building a successful ecosystem. ### Principles[​](#principles "Direct link to Principles") 1. Extensions are independent 2. Extensions leverage the same tooling that our internal teams use 3. Extensions are easy to build and test ### Core Technologies[​](#core-technologies "Direct link to Core Technologies") 1. [React](https://reactjs.org/) 2. [Styled Components](https://styled-components.com/) 3. [Webpack - Module Federation](https://webpack.js.org/concepts/module-federation/) All new UI applications within the marketplace utilize React and Styled Components. Styled Components is particularly beneficial in a micro frontend environment, as it prevents style leakage to other applications. Webpack Module Federation manages the loading and unloading of UI applications without page refreshes. ## How It Works[​](#how-it-works "Direct link to How It Works") Our extensions employ a micro front-end architecture, meaning each extension is a self-contained application integrated into a container application. The container application is responsible for loading extensions at runtime. ### Container Application[​](#container-application "Direct link to Container Application") The container manages shared logic across all extension applications. While it uses React, it can load apps developed with any technology (e.g., Angular). The container's responsibilities include: * Managing navigation components (header, footer, secondary navigation). * Handling routing to micro front-end applications. In the example below, all sections except the blue one are part of the container. The blue section represents an independently-loaded extension. ![](/assets/images/appdirect_ui-f26b069edc0fff81e3748607eca66acb.png) #### Leveraging Webpack Module Federation for Runtime Extension Dependency Management[​](#leveraging-webpack-module-federation-for-runtime-extension-dependency-management "Direct link to Leveraging Webpack Module Federation for Runtime Extension Dependency Management") We differentiate between local and remote modules. Local modules are standard modules included in the current build, while remote modules are not part of the current build and are loaded from a container at runtime. In this context, extensions serve as remote modules loaded within the container. ``` module.exports = { plugins: [ new ModuleFederationPlugin({ name: 'Container', remotes: { MyApps: 'MyApps@http://localhost:3001/remoteEntry.js', }, }), ``` Then we manage routing to extensions via a router. ``` const MyApps = lazy(() => import('MyApps')); const Routes = () => { return (
Loading MicroUI...
}>