Plans API
The Plans API is an integral component of the core service. As a result, all requests should be directed to: https://api.subsbase.io/core/v2/graphql.
The core service expects 2 headers, the X-SITE-ID and Authorization so the request would be:
POST https://api.subsbase.io/core/v2/graphql
Authorization: Bearer {server token}
X-SITE-ID: {your site id}Consuming the Plans API requires that a server token is used to authenticate the request. The server token is expected in the Authorization header.
Queries
Plans Query
query GetPlans($siteId: String!, $pagination: PaginationGQLInputType, $sorting: [SortingGQLInputType], $filter: FilterGQLInputType) {
plans(
siteId: $siteId
pagination: $pagination
sorting: $sorting
filter: $filter
) {
isSuccess
message
pagination {
page
perPage
totalRecords
}
data {
id
activeSubscribersCount
planCode
canBeDeleted
hostedPageUrl
name
billingModel
billingType
pricingModel
localizationDictionary
addOns {
billingModel
}
fixedPricing {
price
}
perUnitPricing {
pricePerUnit
unit
freeQuantity
}
variablePricing {
type
unit
tiers {
from
to
price
}
}
status
baseCurrency {
code
}
description
invoiceName
accountingCode
effectiveStartDate
effectiveEndDate
setupFee
trialPeriod {
duration
requiresCreditCard
unit
}
billingCycle {
duration
termLimit {
actionOnEnd
cycles
}
unit
}
}
}
}
#All properties are found in the PlanGQLType// Variables Sample:
{
"siteId": "test-site",
"pagination": {
"perPage": 20,
"page": 1
},
"sorting": [
{
"field": "name",
"direction": "Ascending"
}
]
}- Returns an array of plans.
- You can specify any of the fields detailed in the Plan Type Definition.
- For details about Pagination, Sorting, and Filtering Input Types, please check out PaginationGQLInputType, SortingGQLInputType, FilteringGQLInputType.
Plan Query
query GetPlan($siteId: String!, $planCode: String!) {
plan(siteId: $siteId, planCode: $planCode) {
id
data
planCode
name
canBeDeleted
billingModel
billingType
hostedPageUrl
pricingModel
hasActiveSubscribers
activeSubscribersCount
displaySettings
discountedFrom
data
localizationDictionary
taxProfile {
id
name
taxAuthority
}
dunningProfile {
id
name
}
narrativeTemplate {
id
name
}
planPausingDurations {
id
displayText
pausingValue {
unit
duration
}
}
planFutureStarts {
id
displayText
interval {
unit
duration
}
}
fixedPricing {
price
displayCurrencyConversion
taxInclusive
extraFees {
id
name
type
value
rule {
name
operation
value
valueType
}
}
}
perUnitPricing {
pricePerUnit
unit
freeQuantity
taxInclusive
displayCurrencyConversion
extraFees {
id
name
type
value
rule {
name
operation
value
valueType
}
}
rules {
values {
label
value
}
min
max
step
}
}
variablePricing {
type
unit
taxInclusive
displayCurrencyConversion
extraFees {
id
name
type
value
rule {
name
operation
value
valueType
}
}
tiers {
from
to
price
}
rules {
values {
label
value
}
min
max
step
}
}
status
baseCurrency {
code
displayText
symbol
}
displayCurrency {
code
displayText
symbol
}
billingCurrency {
code
displayText
symbol
}
description
imageUrl
invoiceName
accountingCode
effectiveStartDate
effectiveEndDate
setupFee
trialPeriod {
duration
requiresCreditCard
unit
}
billingCycle {
duration
termLimit {
actionOnEnd
cycles
}
unit
dueInvoiceDueSettings {
duration
unit
action
}
earlyInvoiceCreationSettings {
duration
unit
}
usageQuery {
codes
endpoint
customHeaders {
key
value
}
}
model
cycleStart {
startDayInMonth
startDay
startMonth
}
changeMode
}
infoFields {
name
label
type
validation
required
editable
disabled
associatedTo
}
planRules {
maxTotalAddonsQuantity
exactTotalAddonsQuantity
}
addOns {
id
data
name
code
description
accountingCode
imageUrl
status
hasActiveSubscribers
displaySettings
canBeDeleted
localizationDictionary
baseCurrency {
code
displayText
symbol
}
taxProfile {
id
name
taxAuthority
}
billingCycle {
duration
unit
}
billingType
billingModel
pricingModel
fixedPricing {
price
rules {
min
}
required
}
perUnitPricing {
pricePerUnit
unit
freeQuantity
rules {
values {
label
value
}
min
max
step
}
}
variablePricing {
type
unit
tiers {
from
to
price
}
rules {
values {
label
value
}
min
max
step
}
}
}
}
}
#All properties are found in the PlanGQLType// Variables Sample:
{
"planCode": "semi-annual-plan",
"siteId": "test-site"
}- Returns a specific plan.
- You can specify any of the fields detailed in the Plan Type Definition and Billing Cycle Info Type Definition.
Plan Mutations/Operations
Create Plan
- To create a plan, you need to use the following Mutation, it is advisable to use
variablesin this case since the input types are more complex than just strings:
mutation CreatePlan($siteId: String!, $plan: PlanGQLInputType!) {
plans(siteId: $siteId) {
create(plan: $plan) {
isSuccess
message
value {
id
#All properties are found in the PlanGQLType
}
}
}
}// Variables Sample:
{
"plan": {
"siteId": "test-site",
"name": "test17281q",
"planCode": "test17281q",
"billingModel": "PrePaid",
"description": "",
"data": "{}",
"pricingModel": "Fixed",
"fixedPricing": {
"price": 144,
"displayCurrencyConversion": null,
"taxes": null,
"extraFees": null
},
"variablePricing": null,
"perUnitPricing": null,
"setupFee": 12,
"status": "Active",
"displaySettings": "{\"description\":{},\"image\":{}}",
"discountedFrom": null,
"defaultCurrencyCode": "egp",
"displayCurrencyCode": null,
"trialPeriod": {
"duration": 0,
"unit": "Day"
},
"billingType": "Recurring",
"planPausingDurations": [],
"planFutureStarts": [],
"billingCycle": {
"unit": "Month",
"duration": 1,
"Model" : "StartImmediately",
"ChangeMode" : "ShiftBillingCycle",
"CycleStart" : "",
"termLimit": {
"cycles": 0,
"actionOnEnd": "renew"
},
"earlyInvoiceCreationSettings": {
"duration": 0,
"unit": "Day"
},
"dueInvoiceDueSettings": {
"duration": 3,
"unit": "Day",
"action": "DoNothing"
},
"usageQuery": null
},
"infoFields": [],
"planRules": {
"maxTotalAddonsQuantity": null
},
"addOns": []
},
"siteId": "test-site"
}- You can specify any of the fields detailed in the Plan Type Definition.
Update Plan
- To update a plan, you need to use the following Mutation:
mutation UpdatePlan($siteId: String!, $planId: String!, $plan: PlanGQLInputType!) {
plan(siteId: $siteId, planId: $planId) {
update(plan: $plan) {
isSuccess
message
value {
id
#All properties are found in the PlanGQLType
}
}
}
}// Variables Sample:
{
"plan": {
"siteId": "test-site",
"name": "12121",
"planCode": "12121",
"invoiceName": null,
"imageUrl": null,
"accountingCode": "accounting code",
"billingModel": "PrePaid",
"description": "",
"data": "{\"taxInvoicing\":{\"sku\":\"12365\",\"item-type\":\"213132\",\"unit-type\":\"432423\",\"integrationId\":\"685EFEA0-165F-42DC-ADB9-D325C51C216A\"},\"canBeChanged\":true,\"calculateCreditNote\":true,\"usageCalculationMode\":\"Both\"}",
"pricingModel": "Fixed",
"fixedPricing": {
"price": 12,
"displayCurrencyConversion": null,
"taxes": [
{
"type": "Percentage",
"name": "1212",
"value": 0.2
}
],
"extraFees": []
},
"variablePricing": null,
"perUnitPricing": null,
"setupFee": 12,
"status": "Active",
"displaySettings": "{\"image\":{},\"description\":{}}",
"discountedFrom": null,
"defaultCurrencyCode": "egp",
"displayCurrencyCode": null,
"trialPeriod": {
"duration": 0,
"unit": "Day",
"requiresCreditCard": false
},
"billingType": "Recurring",
"planPausingDurations": [],
"planFutureStarts": [],
"billingCycle": {
"unit": "Month",
"duration": 1,
"Model" : "StartImmediately",
"ChangeMode" : "ShiftBillingCycle",
"CycleStart" : "",
"termLimit": {
"cycles": 12,
"actionOnEnd": "Renew"
},
"earlyInvoiceCreationSettings": {
"duration": 0,
"unit": "Day"
},
"dueInvoiceDueSettings": {
"duration": 3,
"unit": "Day",
"action": "DoNothing"
},
"usageQuery": null
},
"infoFields": [
{
"name": "name",
"label": "Full Name",
"type": "Full Name",
"validation": ".*\\s+.+",
"required": true,
"editable": false,
"disabled": false
},
{
"name": "email",
"label": "Email",
"type": "Email",
"validation": "^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$",
"required": true,
"editable": false,
"disabled": false
},
{
"name": "registration",
"label": "Registration Number/National ID",
"type": "Text",
"validation": "",
"required": true,
"editable": false,
"disabled": true
},
{
"name": "tax-number",
"label": "Tax number",
"type": "Text",
"validation": "",
"required": true,
"editable": false,
"disabled": true
},
{
"name": "is-individual",
"label": "Is Person",
"type": "Checkbox",
"validation": "",
"required": false,
"editable": false,
"disabled": true
},
{
"name": "country-iso-code",
"label": "Country ISO code",
"type": "Text",
"validation": "",
"required": true,
"editable": false,
"disabled": true
}
],
"planRules": {
"maxTotalAddonsQuantity": null,
"exactTotalAddonsQuantity": null
},
"addOns": [
{
"id": "37dfd8b5-b534-464e-98db-77542319c8ef",
"name": "sssdsadasdasdasd",
"data": "{\"taxInvoicing\":{\"sku\":\"ssss\",\"item-type\":\"ssss\",\"unit-type\":\"ssss\"}}",
"code": "sssdsadasdasdasd",
"description": null,
"imageUrl": null,
"status": "Active",
"billingModel": "PrePaid",
"billingType": "Recurring",
"displaySettings": "{\"image\":{},\"description\":{}}",
"billingCycle": {
"unit": "Month",
"duration": 1,
"termLimit": {
"cycles": 12,
"actionOnEnd": "Renew"
}
},
"pricingModel": "Fixed",
"fixedPricing": {
"price": 22,
"required": false,
"displayCurrencyConversion": null
},
"variablePricing": null,
"perUnitPricing": null
},
{
"id": "3d703b6b-e499-4c28-95c6-5021c48d5088",
"name": "addon 1",
"data": "{\"taxInvoicing\":{\"sku\":\"sssss\",\"item-type\":\"ssss\",\"unit-type\":\"sssss\"}}",
"code": "addon-1",
"description": null,
"imageUrl": null,
"status": "Active",
"billingModel": "PrePaid",
"billingType": "Recurring",
"displaySettings": "{\"image\":{},\"description\":{}}",
"billingCycle": {
"unit": "Month",
"duration": 1,
"termLimit": {
"cycles": 12,
"actionOnEnd": "Renew"
}
},
"pricingModel": "PerUnit",
"fixedPricing": null,
"variablePricing": null,
"perUnitPricing": {
"pricePerUnit": 150,
"freeQuantity": 0,
"unit": "giga",
"rules": {
"min": 1,
"max": 10,
"step": 1
},
"displayCurrencyConversion": null
}
}
],
"id": "571a6b8f-0730-4146-b2f5-7a5a6b92279d"
},
"planId": "571a6b8f-0730-4146-b2f5-7a5a6b92279d",
"siteId": "test-site"
}- You can specify any of the fields detailed in the Plan Type Definition.
Enable or Disable Change Plan by Customer
To enable or disable the "Change Plan by Customer" feature for a specific plan by modifying its canBeChanged attribute, you will need to follow these steps:
- Query the Plan:
Use this GraphQL query
GetPlanto retrieve the plan information, including thedatafield.
mutation UpdatePlan($siteId: String!, $planId: String!, $plan: PlanGQLInputType!) {
plan(siteId: $siteId, planId: $planId) {
update(plan: $plan) {
isSuccess
message
value {
planCode
}
}
}
}- Add
dataField: Thisdatafield should include thecanBeChangedflag with the desired value (trueorfalse).
- Update Plan with New Flag:
Once you have fetched the plan details, modify the
datafield by adding thecanBeChangedflag with a value oftrueorfalse. This modification is performed using a mutationUpdatePlan.
For true (indicating "Change Plan by Customer" is enabled):
"data": "{\"canBeChanged\": true}",For false (indicating "Change Plan by Customer" is disabled):
"data": "{\"canBeChanged\": false}",Copy Plan
- To copy a plan, you need to use the following Mutation:
mutation CopyPlan($siteId: String!, $planId: String!){
plan(siteId: $siteId, planId: $planId){
copy{
isSuccess
message
value{
id
#All properties are found in the PlanGQLType
}
}
}
}// Variables Sample:
{
"siteId": "test-site",
"planId": "0110d46e-6e33-4817-839d-d600cba83f6b"
}- You can specify any of the fields detailed in the Plan Type Definition.
Delete Plan
- To delete a plan, you need to use the following Mutation:
mutation DeletePlan($siteId: String!, $planId: String!){
plan(siteId: $siteId, planId: $planId){
delete{
isSuccess
message
}
}
}// Variables Sample:
{
"siteId": "test-site",
"planId": "0110d46e-6e33-4817-839d-d600cba83f6b"
}- You can specify any of the fields detailed in the Plan Type Definition.