query before the field(s).
Query VariablesWe use variables throughout our example requests. We do this in order to mirror real-world application practices whereby you would most likely want dynamic values for your arguments. Take a look at this guide if you’re unfamiliar with how variables work in GraphQL.
feature
Retrieve a Feature.Arguments
Returns
Examples
- Request/Response
- cURL
- Node.js
Request Body
query canUseFeature($userId: String!, $featureId: String!, $delta: Int) {
canUseFeature(userId: $userId, featureId: $featureId, delta: $delta) {
data {
access
reason
consumption {
budget
used
overageEnabled
}
}
}
}
Request Query Variables
{
"userId": "124",
"featureId": "api-calls",
"delta": 1
}
Response Body
{
"data": {
"canUseFeature": {
"access": true,
"reason": "The user has a subcription to a package with this consumable feature and either has an allowance remaining or overage is enabled.",
"consumption": {
"used": 0,
"budget": 50,
"overageEnabled": false
}
}
}
}
curl https://api.usekana.com/graphql \
-X POST \
-H "Authorization: INSERT_API_KEY" \
-H "Content-Type:application/json" \
-d '{ "query": "query canUseFeature($userId: String!, $featureId: String!, $delta: Int) { canUseFeature(userId: $userId, featureId: $featureId, delta: $delta) { access reason consumption { budget used overageEnabled } } }", "variables": "{ \"userId\": \"124\", \"featureId\": \"api-calls\", \"delta\": 1 }" }'
Node.js
import { KanaAdmin } from '@usekana/admin-kana-js'; \
const client = new KanaAdmin({
apiKey: API_KEY // Replace with own Private API Key
});
const { data, error } = await client.features.canUse({userId: '124', featureId: 'api-calls', delta: 1});
console.log(data);
console.log(error);
features
List all Features.Returns
| Name | Type | Description |
|---|---|---|
data | [Feature!]! | An array of all features. |
errors / error | See Errors | Returns any errors which may have occurred with the request. |
Examples
- Request/Response
- cURL
- Node.js
Request Body
query listFeatures {
features {
id
name
type
unitLabel
unitLabelPlural
metadata
packages {
id
name
status
metadata
isAddon
updatedAt
}
}
}
{
"data": {
"features": [
{
"id": "api-calls",
"name": "API Calls",
"type": "CONSUMABLE",
"unitLabel": "API Call",
"unitLabelPlural": "API Calls",
"metadata": {},
"packages": [
{
"id": "pro-plan",
"name": "Pro Plan",
"status": "PUBLISHED",
"metadata": {},
"isAddon": false,
"updatedAt": "2022-01-21T16:08:09.640Z"
}
]
},
{
"id": "messages",
"name": "Messages",
"type": "CONSUMABLE",
"unitLabel": "Message",
"unitLabelPlural": "Messages",
"metadata": {},
"packages": [
{
"id": "free-plan",
"name": "Free Plan",
"status": "PUBLISHED",
"metadata": {},
"isAddon": false,
"updatedAt": "2022-01-21T16:08:09.640Z"
}
]
}
]
}
}
curl https://api.usekana.com/graphql \
-X POST \
-H "Authorization: {API_KEY}" \
-H "Content-Type:application/json" \
-d '{ "query": "query listFeatures { features { id name type unitLabel unitLabelPlural metadata packages { id name metadata isAddon updatedAt } } }"}'
import { KanaAdmin } from '@usekana/admin-kana-js'; \
const client = new KanaAdmin({
apiKey: {API_KEY}
});
const { data, error } = await client.features.list();
console.log(data);
console.log(error);
canUseFeature
Understand if a User is able to use a particular Feature. The returnedaccess boolean is true when the user has access (for Binary features), has enough of a feature remaining to be used (for Consumable features), or has overage enabled (for Consumable features).
Arguments
| Name | Type | Description |
|---|---|---|
featureId | String! | The id of the feature. This maps to the id field as set on the Feature object. |
userId | String! | The id of the user. This maps to the id field as set on the User object. |
delta | Int | The amount of the consumable feature which the user will be using and you want to check access against. Defaults to 1. |
Returns
| Name | Type | Description |
|---|---|---|
data | CanUseFeatureData! | An object containing details on if the user can use the feature (access, reason) and on a user’s current Consumption of the feature (consumption). |
errors / error | See Errors | Returns any errors which may have occurred with the request. |
Examples
- Request/Response
- cURL
- Node.js
Request Body
query canUseFeature($userId: String!, $featureId: String!, $delta: Int) {
canUseFeature(userId: $userId, featureId: $featureId, delta: $delta) {
data {
access
reason
consumption {
budget
used
overageEnabled
}
}
}
}
Request Query Variables
{
"userId": "124",
"featureId": "api-calls",
"delta": 1
}
{
"data": {
"canUseFeature": {
"access": true,
"reason": "The user has a subcription to a package with this consumable feature and either has an allowance remaining or overage is enabled.",
"consumption": {
"used": 0,
"budget": 50,
"overageEnabled": false
}
}
}
}
curl https://api.usekana.com/graphql \
-X POST \
-H "Authorization: INSERT_API_KEY" \
-H "Content-Type:application/json" \
-d '{ "query": "query canUseFeature($userId: String!, $featureId: String!, $delta: Int) { canUseFeature(userId: $userId, featureId: $featureId, delta: $delta) { access reason consumption { budget used overageEnabled } } }", "variables": "{ \"userId\": \"124\", \"featureId\": \"api-calls\", \"delta\": 1 }" }'
import { KanaAdmin } from '@usekana/admin-kana-js'; \
const client = new KanaAdmin({
apiKey: API_KEY // Replace with own Private API Key
});
const { data, error } = await client.features.canUse({userId: '124', featureId: 'api-calls', delta: 1});
console.log(data);
console.log(error);
showUsage
Retrieve both the current and historical usage of a Feature for a User.Why can I only see the current usage through the SDKs?We’re in the process of returning past usage of a feature via our SDKs. Let us know if you’d love to see it and we’ll keep you posted on when it’s launched!
Arguments
Returns
| Name | Type | Description |
|---|---|---|
data | ShowUsageData! | An object containing details on the how many of the feature a user has used (usages) and since when (since). |
errors / error | See Errors | Returns any errors which may have occurred with the request. |
Examples
- Request/Response
- cURL
- Node.js
Request Body
query showUsage($userId: String!, $featureId: String!) {
showUsage(userId: $userId, featureId: $featureId) {
current {
periodStart
periodEnd
consumption {
used
budget
overageEnabled
}
}
past {
periodStart
periodEnd
consumption {
used
budget
overageEnabled
}
}
}
}
Request Query Variables
{
"userId": "124",
"featureId": "api-calls"
}
{
"data": {
"showUsage": {
"current": {
"periodStart": "2022-08-10T15:07:01.803Z",
"periodEnd": "2022-09-10T15:07:01.803Z",
"consumption": {
"used": 0,
"budget": 50,
"overageEnabled": false
}
},
"past": [
{
"periodStart": "2022-07-10T15:07:01.803Z",
"periodEnd": "2022-08-10T15:07:01.803Z",
"consumption": {
"used": 48,
"budget": 50,
"overageEnabled": false
}
}
]
}
}
}
curl https://api.usekana.com/graphql \
-X POST \
-H "Authorization: INSERT_API_KEY" \
-H "Content-Type:application/json" \
-d '{ "query": "query showUsage($userId: String!, $featureId: String!) { showUsage(userId: $userId, featureId: $featureId) { current { periodStart periodEnd consumption { used budget overageEnabled } } past { periodStart periodEnd consumption { used budget overageEnabled } } } }", "variables": "{ \"userId\": \"124\", \"featureId\": \"api-calls\" }" }'
import { KanaAdmin } from '@usekana/admin-kana-js'; \
const client = new KanaAdmin({
apiKey: API_KEY // Replace with own Private API Key
});
const { data, error } = await client.features.showUsage({userId: '124', featureId: 'api-calls'});
console.log(data);
console.log(error);
package
Retrieve a Package.Arguments
Returns
Examples
- Request/Response
- cURL
- Node.js
Request Body
query retrievePackage($id: String!) {
package(id: $id) {
id
name
status
metadata
features {
id
name
limit
type
unitLabel
unitLabelPlural
metadata
}
prices {
id
provider
amount
displayAmount
currency
interval
}
isAddon
updatedAt
}
}
Request Query Variables
{
"id": "pro-plan"
}
{
"data": {
"package": {
"id": "pro-plan",
"name": "Pro Plan",
"status": "PUBLISHED",
"metadata": {},
"features": [
{
"id": "api-calls",
"name": "API Calls",
"limit": "1000",
"type": "CONSUMABLE",
"unitLabel": "API Call",
"unitLabelPlural": "API Calls",
"metadata": {}
}
],
"prices": [
{
"id": "price_1L7NHvIiEnRX8aivoxbSWREF",
"provider": "STRIPE",
"amount": 5000,
"displayAmount": "50.00",
"currency": "gbp",
"interval": "month"
}
],
"isAddon": false,
"updatedAt": "2021-11-25T16:57:42.778Z"
}
}
}
curl https://api.usekana.com/graphql \
-X POST \
-H "Authorization: INSERT_API_KEY" \
-H "Content-Type:application/json" \
-d '{ "query": "query retirevePackage($id: String!, $includeFeatures: Boolean) { package(id: $id, includeFeatures: $includeFeatures) { id name status metadata features { id name limit type unitLabel unitLabelPlural metadata } prices { id provider amount displayAmount currency interval } isAddon updatedAt } }", "variables": "{ \"id\": \"pro-plan\", \"includeFeatures\": true }" }'
import { KanaAdmin } from '@usekana/admin-kana-js'; \
const client = new KanaAdmin({
apiKey: API_KEY // Replace with own Private API Key
});
const { data, error } = await client.packages.retrieve({id: "pro-plan"});
console.log(data);
console.log(error);
packages
List all Packages.Arguments
| Name | Type | Description |
|---|---|---|
status | String | The status of the package. Maps to one of the PackageStatus enum options. Defaults to PUBLISHED. |
includeFeatures | Boolean | SDK Only. Whether you want a features array to be present as part of the response. Defaults to false. |
Returns
| Name | Type | Description |
|---|---|---|
data | [Package!]! | An array of all packages. |
errors / error | See Errors | Returns any errors which may have occurred with the request. |
Examples
- Request/Response
- cURL
- Node.js
Request Body
query listPackages($status: String!) {
package(status: $status) {
data {
id
name
status
metadata
features {
id
name
limit
type
unitLabel
unitLabelPlural
metadata
}
prices {
id
provider
amount
displayAmount
currency
interval
}
isAddon
updatedAt
}
}
}
Request Query Variables
{
"status": "PUBLISHED"
}
{
"data":{
"packages":[
{
"id":"free-plan",
"name":"Free Plan",
"status":"PUBLISHED",
"features":[
{
"id":"api-calls",
"name":"API Calls",
"limit":"1000",
"type":"CONSUMABLE"
"unitLabel": "API Call",
"unitLabelPlural": "API Calls",
"metadata": {},
}
],
"prices":[
{
"id": "price_1L7NHvIiEnRX8aivoxbSWREF",
"provider": "STRIPE",
"amount": 5000,
"displayAmount": "50.00",
"currency": "gbp",
"interval": "month"
}
],
"isAddon":false,
"updatedAt":"2021-11-25T16:57:42.778Z"
},
{
"id":"premium-plan",
"name":"Premium Plan",
"status":"PUBLISHED",
"features":[
{
"id":"api-calls",
"name":"API Calls",
"limit":"10000",
"type":"CONSUMABLE"
"unitLabel": "API Call",
"unitLabelPlural": "API Calls",
"metadata": {},
}
],
"prices":[
{
"id": "price_id_36w8sjd",
"provider": "STRIPE",
"amount": 10000,
"displayAmount": "100.00",
"currency": "gbp",
"interval": "month"
}
],
"isAddon":false,
"updatedAt":"2021-11-26T12:50:12.298Z"
}
]
}
}
curl https://api.usekana.com/graphql \
-X POST \
-H "Authorization: INSERT_API_KEY" \
-H "Content-Type:application/json" \
-d '{ "query": "query listPackages($status: String!) { packages(status: $status) { id name status metadata features { id name limit type unitLabel unitLabelPlural metadata } prices { id provider amount displayAmount currency interval } isAddon updatedAt } }", "variables": "{ \"status\": \"PUBLISHED\"}" }'
import { KanaAdmin } from '@usekana/admin-kana-js'; \
const client = new KanaAdmin({
apiKey: API_KEY // Replace with own Private API Key
});
const { data, error } = await client.packages.list({includeFeatures: true});
console.log(data);
console.log(error);
user
Retrieve a User.Arguments
Returns
Examples
- Request/Response
- cURL
- Node.js
Request Body
query retrieveUser($id: String!) {
user(id: $id) {
id
billingId
name
email
metadata
}
}
Request Query Variables
{
"id": "124"
}
{
"data": {
"user": {
"id": "124",
"billingId": "cus_Lp1bSKob4laHDD",
"name": "Test User",
"email": "test@usekana.com",
"metadata": {}
}
}
}
curl https://api.usekana.com/graphql \
-X POST \
-H "Authorization: INSERT_API_KEY" \
-H "Content-Type:application/json" \
-d '{ "query": "query retrieveUser($id: String!) { user(id: $id) { id name email metadata } }", "variables": "{ \"id\": \"124\"}" }'
import { KanaAdmin } from '@usekana/admin-kana-js'; \
const client = new KanaAdmin({
apiKey: API_KEY // Replace with own Private API Key
});
const { data, error } = await client.users.retrieve({id: '124'});
console.log(data);
console.log(error);
users
List all Users.Returns
Examples
- Request/Response
- cURL
- Node.js
Request Body
query listUsers($id: String!) {
users(id: $id) {
id
billingId
name
email
metadata
}
}
{
"data": {
"users": [
{
"id": "124",
"billingId": "cus_Lp1bSKob4laHDD",
"name": "Test User",
"email": "test@usekana.com",
"metadata": {}
}
]
}
}
curl https://api.usekana.com/graphql \
-X POST \
-H "Authorization: INSERT_API_KEY" \
-H "Content-Type:application/json" \
-d '{ "query": "query listUsers { users { id name email metadata } }", "variables": "{ \"id\": \"124\"}" }'
import { KanaAdmin } from '@usekana/admin-kana-js'; \
const client = new KanaAdmin({
apiKey: API_KEY // Replace with own Private API Key
});
const { data, error } = await client.users();
console.log(data);
console.log(error);
subscription
Retrieve a PackageSubscription.Arguments
| Name | Type | Description |
|---|---|---|
id | String! | The id of the subscription. This maps to the id field as set on the PackageSubscription object. |
Returns
| Name | Type | Description |
|---|---|---|
data | PackageSubscription! | The PackageSubscription of a user to a package. This corresponds to the id you passed. |
errors / error | See Errors | Returns any errors which may have occurred with the request. |
Examples
- Request/Response
- cURL
- Node.js
Request Body
query retrieveSubscription($id: String!) {
subscription(id: $id) {
id
userId
status
package {
id
name
status
metadata
features {
id
name
limit
type
unitLabel
unitLabelPlural
metadata
}
prices {
id
provider
amount
displayAmount
currency
interval
}
isAddon
updatedAt
}
}
}
Request Query Variables
{
"id": "2"
}
{
"data": {
"subscription": {
"id": "2",
"userId": "124",
"status": "ACTIVE",
"package": {
"id": "free-trial",
"name": "Free Trial",
"status": "PUBLISHED",
"metadata": {},
"features": [
{
"name": "API Calls",
"limit": "1000",
"type": "CONSUMABLE",
"unitLabel": "API Call",
"unitLabelPlural": "API Calls",
"metadata": {}
}
],
"prices": [
{
"id": "price_1L7NHvIiEnRX8aivoxbSWREF",
"provider": "STRIPE",
"amount": 5000,
"displayAmount": "50.00",
"currency": "gbp",
"interval": "month"
}
],
"isAddon": false,
"updatedAt": "2021-11-25T16:57:42.778Z"
}
}
}
}
curl https://api.usekana.com/graphql \
-X POST \
-H "Authorization: INSERT_API_KEY" \
-H "Content-Type:application/json" \
-d '{ "query": "query retrieveSubscription($id: String!) { subscription(id: $id) { id userId status package { id name status metadata features { id name limit type unitLabel unitLabelPlural metadata } prices { id provider amount displayAmount currency interval } isAddon updatedAt } } }", "variables": "{ \"id\": \"2\"}" }'
import { KanaAdmin } from '@usekana/admin-kana-js'; \
const client = new KanaAdmin({
apiKey: API_KEY // Replace with own Private API Key
});
const { data, error } = await client.subscriptions.retrieve({id: '2'});
console.log(data);
console.log(error);
subscriptions
List all PackageSubscriptions, or all PackageSubscriptions associated to a User.Arguments
| Name | Type | Description |
|---|---|---|
userId | String | The id of the User whose PackageSubscriptions you want to fetch. |
Returns
| Name | Type | Description |
|---|---|---|
data | [PackageSubscription!] | A list of subscriptions. These could correspond to a User if a userId is passed. |
errors / error | See Errors | Returns any errors which may have occurred with the request. |
Examples
- Request/Response
- cURL
- Node.js
Request Body
query listSubscriptions($userId: String!) {
subscriptions(userId: $userId) {
id
userId
status
package {
id
name
status
metadata
features {
id
name
limit
type
unitLabel
unitLabelPlural
metadata
}
prices {
id
provider
amount
displayAmount
currency
interval
}
isAddon
updatedAt
}
}
}
Request Query Variables
{
"userId": "124"
}
{
"data": {
"subscriptions": [
{
"id": "2",
"userId": "124",
"status": "ACTIVE",
"package": {
"id": "free-trial",
"name": "Free Trial",
"status": "PUBLISHED",
"metadata": {},
"features": [
{
"id": "api-calls",
"name": "API Calls",
"limit": "1000",
"type": "CONSUMABLE",
"unitLabel": "API Call",
"unitLabelPlural": "API Calls",
"metadata": {}
}
],
"prices": [
{
"id": "price_1L7NHvIiEnRX8aivoxbSWREF",
"provider": "STRIPE",
"amount": 5000,
"displayAmount": "50.00",
"currency": "gbp",
"interval": "month"
}
],
"isAddon": false,
"updatedAt": "2021-11-25T16:57:42.778Z"
}
},
{
"id": "3",
"userId": "124",
"status": "CANCELLED",
"package": {
"id": "extra-500-api-calls",
"name": "Extra 500 API Calls",
"status": "PUBLISHED",
"metadata": {},
"features": [
{
"id": "api-calls",
"name": "API Calls",
"limit": "500",
"type": "CONSUMABLE",
"unitLabel": "API Call",
"unitLabelPlural": "API Calls",
"metadata": {}
}
],
"prices": [
{
"id": "price_6378hdsjhshgsu4w8AJNSGL",
"provider": "STRIPE",
"amount": 3500,
"displayAmount": "35.00",
"currency": "gbp",
"interval": null
}
],
"isAddon": true,
"updatedAt": "2022-02-23T11:19:48.604Z"
}
}
]
}
}
curl https://api.usekana.com/graphql \
-X POST \
-H "Authorization: INSERT_API_KEY" \
-H "Content-Type:application/json" \
-d '{ "query": "query listSubscriptions($userId: String!) { subscription(userId: $userId) { id userId status package { id name status metadata features { id name limit type unitLabel unitLabelPlural metadata } prices { id provider amount displayAmount currency interval } isAddon updatedAt } } }", "variables": "{ \"userId\": \"124\"}" }'
import { KanaAdmin } from '@usekana/admin-kana-js'; \
const client = new KanaAdmin({
apiKey: API_KEY // Replace with own Private API Key
});
const { data, error } = await client.subscriptions.list({userId: '124'});
console.log(data);
console.log(error);