channelape-typescript-sdk
eCommerce
TypeScript
ChannelApe SDK
TypeScript and JavaScript SDK for the ChannelApe REST API
Features
- Getting Started
- Errors
- Sessions
- Actions
- Channels
- Suppliers
- Orders
- Variants
- Businesses
- Subscriptions
- Order Activities
- Analytics
- Product Filters
- Users
- Inventories
- Locations
- Steps
- Plays
- Batches
Getting Started
The ChannelApe SDK is asynchronous and all functions return promises.
Creating a client
Create a new instance of the ChannelApeClient with your sessionId.
const channelApeClient = new ChannelApeClient({
sessionId: '4674b668-c4d2-4270-bf9b-ebaab78c378d'
});
Optional client configurations
- timeout – Number of milliseconds to wait for the API to send response headers. Defaults to 180000 (3 minutes). Cannot be set lower than 2000 (2 seconds).
- endpoint – Environment endpoint you would like to hit. Defaults to https://api.channelape.com
- logLevel – Level of logs you wish to see from the SDK. Defaults to OFF.
- maximumRequestRetryTimeout – Number of milliseconds to keep retrying a request for when an undesired response status code is received. Defaults to 180000 (3 minutes). Cannot be set lower than 2000 (2 seconds).
- minimumRequestRetryRandomDelay – Minimum number of milliseconds to randomly delay by when an undesired response status code is received. Defaults to 1000 (1 second). Cannot be set lower than 1000 (1 second).
- maximumRequestRetryRandomDelay – Maximum number of milliseconds to randomly delay by when an undesired response status code is received. Defaults to 5000 (5 seconds). Cannot be set lower than 2000 (2 seconds).
- maximumConcurrentConnections – Maximum number of connections or requests that can be made to the API at a single time. Defaults to 5.
Error Handling
When a call to the ChannelApe API returns an error, it can be accessed through the ApiErrors array on the error object. The following is an example:
try {
newOrder = await client.orders().create(orderWithChannelOrderIdThatAlreadyExists);
} catch (error) {
if (error?.ApiErrors?.code === 168) {
... Handle duplicate channel order ID error
}
}
Error codes and descriptions can be found here: Postman API Error Handling
Sessions
Get Session
A User Account session will include your userId which is useful when retrieving Businesses. API Account sessions will return an apiAccountId instead.
channelApeClient.sessions().get(sessionId)
.then((session: Session) => {
// do what you need to do with session data here
// session will also include your userId or apiAccountId
});
Actions
Get action
channelapeClient.actions().get(actionId)
.then((action: Action) => {
// do what you need to do with action data here
});
Complete action
channelapeClient.actions().complete(actionId)
.then((action: Action) => {
// do what you need to do with action data here
});
Update action with error
channelapeClient.actions().error(actionId)
.then((action: Action) => {
// do what you need to do with action data here
});
Update action health check
channelapeClient.actions().updateHealthCheck(actionId)
.then((action: Action) => {
// do what you need to do with action data here
});
Channels
Get channel
channelapeClient.channels().get(channelId)
.then((channel: Channel) => {
// do what you need to do with channel data here
});
Get all channels for a business
channelapeClient.channels().get({ businessId: 'some-valid-business-id' })
.then((channels: Channel[]) => {
// do what you need to do with channel data here
});
Create a channels for a business
channelapeClient.channels().create({
additionalFields: [],
integrationId: 'some-valid-integration-id',
name: 'channel-name',
credentials: {
healthCheckInterval: 300,
payloadUrl: 'channelape.com'
},
businessId: 'some-valid-business-id',
enabled: true
})
.then((channels: Channel) => {
// do what you need to do with channel data here
});
Update a channels for a business
channelapeClient.channels().update({
additionalFields: [],
id: 'valid-channel-id'
integrationId: 'some-valid-integration-id',
name: 'channel-name',
credentials: {
healthCheckInterval: 300,
payloadUrl: 'channelape.com'
},
businessId: 'some-valid-business-id',
enabled: true
})
.then((channels: Channel) => {
// do what you need to do with channel data here
});
Suppliers
Get supplier
channelapeClient.suppliers().get(supplierId)
.then((supplier: Supplier) => {
// do what you need to do with supplier data here
});
Get all suppliers for a business
channelapeClient.suppliers().get({ businessId: 'some-valid-business-id' })
.then((suppliers: Supplier[]) => {
// do what you need to do with supplier data here
});
Update a supplier
channelapeClient.suppliers().update(supplierUpdateRequest)
.then((supplier: Supplier) => {
// do what you need to do with supplier data here
});
Create a supplier
channelapeClient.suppliers().create(SupplierCreateRequest)
.then((supplier: Supplier) => {
// do what you need to do with supplier data here
});
Orders
Get order
channelapeClient.orders().get(orderId)
.then((order: Order) => {
// do what you need to do with order data here
});
Update order
channelapeClient.orders().update(order)
.then((updatedOrder: Order) => {
// do what you need to do with updatedOrder data here
});
Patch order
channelapeClient.orders().patch(order)
.then((patchedOrder: Order) => {
// do what you need to do with patchedOrder data here
});
Create order
const orderToCreate: OrderCreateRequest = {
additionalFields: [
{ name: 'name', value: 'CA1001' },
{ name: 'order_number', value: '1001' }
],
totalPrice: 295.99,
alphabeticCurrencyCode: 'USD',
channelId: 'your-channel-id',
channelOrderId: 'specify-your-channel-order-id',
customer: {
firstName: 'John',
lastName: 'Smith',
name: 'John Smith',
additionalFields: [
{ name: 'extraCustomerData', value: 'Put whatever you would like here' }
]
},
status: OrderStatus.OPEN,
purchasedAt: new Date(),
lineItems: [{
id: 'some-line-item-id',
quantity: 1,
sku: 'NCC1701D',
title: 'A model space ship',
additionalFields: [
{ name: 'extraLineItemData', value: 'Put whatever you would like here' }
]
}]
};
channelapeClient.orders().create(orderCreateRequest)
.then((createdOrder: Order) => {
// do what you need to do with the createdOrder data here
});
Variants
Get Variant
const variantsRequest: VariantsRequest = {
productId,
inventoryItemValue
};
channelApeClient.variants().get(variantsRequest)
.then((variant: Variant) => {
// do what you need to do with variant data here
});
Get Variants for a Product
const variantsRequestByProductId: VariantsRequestByProductId = {
productId
};
channelApeClient.variants().get(variantsRequestByProductId)
.then((variants: Variant[]) => {
// do what you need to do with variant array
})
Get Variant Search Results for a Vendor
const variantsRequest: VariantsSearchRequestByVendor = {
vendor,
businessId
};
channelApeClient.variants().search(variantsRequest)
.then((variantSearchResults: VariantSearchResults[]) => {
// do what you need to do with Variant Search Results array
});
Get Variant Search Results using a Product Filter
const variantsRequest: VariantsSearchRequestByProductFilterId = {
productFilterId
};
channelApeClient.variants().search(variantsRequest)
.then((variantSearchResults: VariantSearchResults[]) => {
// do what you need to do with Variant Search Results array
});
Get Variant Search Results for a SKU
- exactMatch parameter if set to true will only match the exact sku set on the request instead of all sku’s that start with that given character sequence.
const variantsRequest: VariantsSearchRequestBySku = {
sku,
businessId,
exactMatch: true
};
channelApeClient.variants().search(variantsRequest)
.then((variantSearchResults: VariantSearchResults[]) => {
// do what you need to do with Variant Search Results array
});
Get Variant Search Results for a UPC
- exactMatch parameter if set to true will only match the exact upc set on the request instead of all upc’s that start with that given character sequence.
const variantsRequest: VariantsSearchRequestByUpc = {
upc,
businessId,
exactMatch: true
};
channelApeClient.variants().search(variantsRequest)
.then((variantSearchResults: VariantSearchResults[]) => {
// do what you need to do with Variant Search Results array
});
Get Variant Search Results for a Tag
const variantsRequest: VariantsSearchRequestByTag = {
tag,
businessId
};
channelApeClient.variants().search(variantsRequest)
.then((variantSearchResults: VariantSearchResults[]) => {
// do what you need to do with Variant Search Results array
});
Businesses
Get Business
const businessesQueryRequestByBusinessId: BusinessesQueryRequestByBusinessId = {
businessId
}
channelApeClient.businesses().get(businessesQueryRequestByBusinessId)
.then((business: Business) => {
// do what you need to do with business data here
});
Get Businesses
const businessesQueryRequestByUserId: BusinessesQueryRequestByUserId = {
userId
}
channelApeClient.businesses().get(businessesQueryRequestByUserId)
.then((businesses: Business[]) => {
// do what you need to do with businesses array data here
});
See Sessions for how to retrieve your userId
Get Business Member
const businessMemberRequest: BusinessMemberRequest = {
userId,
businessId
}
channelApeClient.businesses().getBusinessMember(businessMemberQueryRequest)
.then((businessMember: BusinessMember) => {
// do what you need to do with the business member here
});
Get Business Members
const businessMemberRequest: BusinessMemberRequest = {
userId,
businessId
}
channelApeClient.businesses().getBusinessUsers(businessId)
.then((users: User[]) => {
// do what you need to do with the business members here
});
Invite a Member to a business
const businessId = 'valid-business-id';
const email = 'valid-email-id';
channelApeClient.businesses().inviteMember(email, businessId)
then((invitationMember: InvitationResponse) => {
// send invitationMember to a user
});
Remove a Member from a business
const businessId = 'valid-business-id';
const userId = 'valid-id';
channelApeClient.businesses().removeMember(businessId, userId)
then((removedMember: BusinessMember) => {
// remove a member from business
});
Update a Business’s Settings
const businessToUpdate: Business = {
name: 'name',
inventoryItemKey: InventoryItemKey.SKU,
timeZone: TimeZoneId.US_ALASKA,
alphabeticCurrencyCode: AlphabeticCurrencyCode.USD,
id: 'valid-id',
embeds: [],
errors: []
}
channelApeClient.businesses().update(businessToUpdate)
.then((updatedBusiness: Business) => {
// do what you need to do with the updated business here
});
Verify Business Member
const verificationCode = '1234567';
channelApeClient.businesses().verifyBusinessMember(verificationCode)
.then((business: Business) => {
// do what you need to do with the business here
});
Create Business
const businessToCreate: BusinessCreateRequest = {
name: 'Valid Business Name',
timeZone: TimeZoneId.AMERICA_NEW_YORK,
inventoryItemKey: InventoryItemKey.SKU,
alphabeticCurrencyCode: AlphabeticCurrencyCode.USD
}
channelApeClient.businesses().create(businessToCreate)
.then((business: Business) => {
// do what you need to do with the newly created business here
});
API Accounts
Get API Account By ID
const businessId = 'valid-business-id';
const apiAccountId = 'valid-api-account-id';
channelApeClient.businesses().apiAccounts().get(businessId, apiAccountId)
.then((apiAccount: ApiAccount) => {
// do what you need to do with the API account here
});
Get All API Accounts for a Business
const businessId =...