| Requires any of the roles: | SystemAdministrator, Manager, Customer |
| GET | /customers |
|---|
import Foundation
import ServiceStack
/**
* Retrieve customers
*/
// @Api(Description="Retrieve customers")
public class ListCustomers : ListRequest<CustomerInfo>
{
/**
* Filter by accounts
*/
// @ApiMember(Description="Filter by accounts")
public var accountIds:[String]
/**
* Filter by name
*/
// @ApiMember(Description="Filter by name")
public var nameFilter:String
/**
* The IDs of the parent customers you want to filter by
*/
// @ApiMember(Description="The IDs of the parent customers you want to filter by")
public var parentCustomerIds:[String]
/**
* If you want a shall parent customer filter (e.g. no deep children)
*/
// @ApiMember(Description="If you want a shall parent customer filter (e.g. no deep children)")
public var shallowParent:Bool
/**
* The list of tag IDs to filter by (must contain all)
*/
// @ApiMember(Description="The list of tag IDs to filter by (must contain all)")
public var tagIds:[String]
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case accountIds
case nameFilter
case parentCustomerIds
case shallowParent
case tagIds
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
accountIds = try container.decodeIfPresent([String].self, forKey: .accountIds) ?? []
nameFilter = try container.decodeIfPresent(String.self, forKey: .nameFilter)
parentCustomerIds = try container.decodeIfPresent([String].self, forKey: .parentCustomerIds) ?? []
shallowParent = try container.decodeIfPresent(Bool.self, forKey: .shallowParent)
tagIds = try container.decodeIfPresent([String].self, forKey: .tagIds) ?? []
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if accountIds != nil { try container.encode(accountIds, forKey: .accountIds) }
if nameFilter != nil { try container.encode(nameFilter, forKey: .nameFilter) }
if parentCustomerIds != nil { try container.encode(parentCustomerIds, forKey: .parentCustomerIds) }
if shallowParent != nil { try container.encode(shallowParent, forKey: .shallowParent) }
if tagIds != nil { try container.encode(tagIds, forKey: .tagIds) }
}
}
public class ListRequest<T : Codable> : IGet, Codable
{
/**
* The page of data to retrieve
*/
// @ApiMember(Description="The page of data to retrieve")
public var page:Int
/**
* If you want all objects to be returned. This should be used with care
*/
// @ApiMember(Description="If you want all objects to be returned. This should be used with care")
public var all:Bool
/**
* The number per page to retrieve
*/
// @ApiMember(Description="The number per page to retrieve")
public var countPerPage:Int
/**
* Specific IDs
*/
// @ApiMember(Description="Specific IDs")
public var specificIds:[String]
/**
* Specify a sort field
*/
// @ApiMember(Description="Specify a sort field")
public var sortField:String
/**
* Specify a sort order
*/
// @ApiMember(Description="Specify a sort order")
public var sortOrder:SortOrders
/**
* Disables total / page counts - improves performance. Returns only data. If there is no more data, Items will be empty array
*/
// @ApiMember(Description="Disables total / page counts - improves performance. Returns only data. If there is no more data, Items will be empty array")
public var simplifiedPaging:Bool
required public init(){}
}
public enum SortOrders : String, Codable
{
case Ascend
case Descend
}
public class CustomerInfo : EntityInfo
{
/**
* The ID of the account associated with this customer
*/
// @ApiMember(Description="The ID of the account associated with this customer")
public var accountId:String
/**
* The parent customer ID for this customer
*/
// @ApiMember(Description="The parent customer ID for this customer")
public var parentCustomerId:String
/**
* The breadcrumb to this customer
*/
// @ApiMember(Description="The breadcrumb to this customer")
public var breadcrumb:[CustomerBreadcrumb]
/**
* The name of the account associated with this customer
*/
// @ApiMember(Description="The name of the account associated with this customer")
public var accountName:String
/**
* Is this customer staging or production?
*/
// @ApiMember(Description="Is this customer staging or production?")
public var isStaging:Bool
/**
* The name of the company
*/
// @ApiMember(Description="The name of the company")
public var name:String
/**
* The reference ID for this company
*/
// @ApiMember(Description="The reference ID for this company")
public var referenceId:String
/**
* This customer's data values
*/
// @ApiMember(Description="This customer's data values")
public var data:Struct
/**
* The list of tags for this customer
*/
// @ApiMember(Description="The list of tags for this customer")
public var tags:[Tag]
/**
* This customer's schedule
*/
// @ApiMember(Description="This customer's schedule")
public var schedule:Schedule
/**
* Integration data for this customer
*/
// @ApiMember(Description="Integration data for this customer")
public var integrationData:EntityIntegrationData
/**
* Override this customer's billing settings? Otherwise inherits from parent
*/
// @ApiMember(Description="Override this customer's billing settings? Otherwise inherits from parent")
public var overrideBillingSettings:Bool
/**
* Billing settings for this customer
*/
// @ApiMember(Description="Billing settings for this customer")
public var billingSettings:BillingSettings
/**
* Should this customer override the parent customer's app settings
*/
// @ApiMember(Description="Should this customer override the parent customer's app settings")
public var overrideAppSettings:Bool
/**
* App / Portal settings for this customer
*/
// @ApiMember(Description="App / Portal settings for this customer")
public var appSettings:AppSettings
/**
* Is international dialing enabled? This setting will only take effect if the account has international dialing settings turned on
*/
// @ApiMember(Description="Is international dialing enabled? This setting will only take effect if the account has international dialing settings turned on")
public var enableInternationalDialing:Bool
/**
* The list of country codes (in addition to the account default) which will be enabled for this customer
*/
// @ApiMember(Description="The list of country codes (in addition to the account default) which will be enabled for this customer")
public var enabledInternationalCountryCodes:[String]
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case accountId
case parentCustomerId
case breadcrumb
case accountName
case isStaging
case name
case referenceId
case data
case tags
case schedule
case integrationData
case overrideBillingSettings
case billingSettings
case overrideAppSettings
case appSettings
case enableInternationalDialing
case enabledInternationalCountryCodes
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
accountId = try container.decodeIfPresent(String.self, forKey: .accountId)
parentCustomerId = try container.decodeIfPresent(String.self, forKey: .parentCustomerId)
breadcrumb = try container.decodeIfPresent([CustomerBreadcrumb].self, forKey: .breadcrumb) ?? []
accountName = try container.decodeIfPresent(String.self, forKey: .accountName)
isStaging = try container.decodeIfPresent(Bool.self, forKey: .isStaging)
name = try container.decodeIfPresent(String.self, forKey: .name)
referenceId = try container.decodeIfPresent(String.self, forKey: .referenceId)
data = try container.decodeIfPresent(Struct.self, forKey: .data)
tags = try container.decodeIfPresent([Tag].self, forKey: .tags) ?? []
schedule = try container.decodeIfPresent(Schedule.self, forKey: .schedule)
integrationData = try container.decodeIfPresent(EntityIntegrationData.self, forKey: .integrationData)
overrideBillingSettings = try container.decodeIfPresent(Bool.self, forKey: .overrideBillingSettings)
billingSettings = try container.decodeIfPresent(BillingSettings.self, forKey: .billingSettings)
overrideAppSettings = try container.decodeIfPresent(Bool.self, forKey: .overrideAppSettings)
appSettings = try container.decodeIfPresent(AppSettings.self, forKey: .appSettings)
enableInternationalDialing = try container.decodeIfPresent(Bool.self, forKey: .enableInternationalDialing)
enabledInternationalCountryCodes = try container.decodeIfPresent([String].self, forKey: .enabledInternationalCountryCodes) ?? []
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if accountId != nil { try container.encode(accountId, forKey: .accountId) }
if parentCustomerId != nil { try container.encode(parentCustomerId, forKey: .parentCustomerId) }
if breadcrumb != nil { try container.encode(breadcrumb, forKey: .breadcrumb) }
if accountName != nil { try container.encode(accountName, forKey: .accountName) }
if isStaging != nil { try container.encode(isStaging, forKey: .isStaging) }
if name != nil { try container.encode(name, forKey: .name) }
if referenceId != nil { try container.encode(referenceId, forKey: .referenceId) }
if data != nil { try container.encode(data, forKey: .data) }
if tags != nil { try container.encode(tags, forKey: .tags) }
if schedule != nil { try container.encode(schedule, forKey: .schedule) }
if integrationData != nil { try container.encode(integrationData, forKey: .integrationData) }
if overrideBillingSettings != nil { try container.encode(overrideBillingSettings, forKey: .overrideBillingSettings) }
if billingSettings != nil { try container.encode(billingSettings, forKey: .billingSettings) }
if overrideAppSettings != nil { try container.encode(overrideAppSettings, forKey: .overrideAppSettings) }
if appSettings != nil { try container.encode(appSettings, forKey: .appSettings) }
if enableInternationalDialing != nil { try container.encode(enableInternationalDialing, forKey: .enableInternationalDialing) }
if enabledInternationalCountryCodes != nil { try container.encode(enabledInternationalCountryCodes, forKey: .enabledInternationalCountryCodes) }
}
}
public class EntityInfo : Codable
{
/**
* The ID of the object
*/
// @ApiMember(Description="The ID of the object")
public var id:String
/**
* The date the object was created
*/
// @ApiMember(Description="The date the object was created")
public var dateCreated:String
/**
* The date the object was last modified
*/
// @ApiMember(Description="The date the object was last modified")
public var dateLastModified:String
/**
* The user that created this object
*/
// @ApiMember(Description="The user that created this object")
public var createdBy:String
/**
* The user that last modified this object
*/
// @ApiMember(Description="The user that last modified this object")
public var lastModifiedBy:String
required public init(){}
}
public class CustomerBreadcrumb : Codable
{
public var id:String
public var name:String
required public init(){}
}
public class Struct : List<String:Value>
{
required public init(){ super.init() }
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
}
}
public class Value : Codable
{
public var boolValue:Bool?
public var stringValue:String
public var numberValue:Double?
public var listValue:[Struct]
public var structValue:Struct
required public init(){}
}
public class Tag : Codable
{
public var id:String
public var name:String
public var color:TagColors
required public init(){}
}
public enum TagColors : String, Codable
{
case Magenta
case Red
case Volcano
case Orange
case Gold
case Lime
case Green
case Cyan
case Blue
case GeekBlue
case Purple
}
public class Schedule : Codable
{
public var timeZoneId:String
public var inherit:Bool
public var forceClosed:Bool
public var rules:[SchedulingRule]
public var defaultState:String
required public init(){}
}
public class SchedulingRule : Codable
{
public var id:String
public var name:String
public var priority:Int
public var state:String
public var source:String
public var condition:String
public var simpleRuleType:SimpleSchedulingRuleTypes
public var customerState:String
public var flowId:String
public var flowParams:Struct
public var isAllDay:Bool
public var startDate:String
public var startTime:String
public var endTime:String
public var bySetPosition:[Int]
public var byMonth:[Int]
public var byWeekNo:[Int]
public var byYearDay:[Int]
public var byMonthDay:[Int]
public var byDay:[ScheduleDay]
public var byHour:[Int]
public var byMinute:[Int]
public var interval:Int
public var count:Int
public var untilDate:String
public var frequency:SchedulingRuleFrequency
required public init(){}
}
public enum SimpleSchedulingRuleTypes : String, Codable
{
case Always
case CustomerState
case Time
}
public class ScheduleDay : Codable
{
public var offset:Int
public var dayOfWeek:DayOfWeek
required public init(){}
}
public enum SchedulingRuleFrequency : String, Codable
{
case None
case Secondly
case Minutely
case Hourly
case Daily
case Weekly
case Monthly
case Yearly
}
public class EntityIntegrationData : List<String:IntegrationData>
{
required public init(){ super.init() }
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
}
}
public class IntegrationData : Codable
{
public var thirdPartyId:String
required public init(){}
}
public class BillingSettings : Codable
{
public var base:BillingItem
public var localNumbers:BillingItem
public var tollFreeNumbers:BillingItem
public var inboundVoiceCalls:BillingItem
public var outboundVoiceCalls:BillingItem
public var inboundFaxes:BillingItem
public var outboundFaxes:BillingItem
public var inboundSmsMessages:BillingItem
public var outboundSmsMessages:BillingItem
public var aiInsights:BillingItem
public var aiLiveMinutes:BillingItem
public var aiMessages:BillingItem
public var aiTranscriptions:BillingItem
required public init(){}
}
public class BillingItem : Codable
{
public var baseCost:Double
public var rawUnitMultiplier:Double
public var unitCost:Double
public var allowance:Int
required public init(){}
}
public class AppSettings : Codable
{
public var enablePhoneNumberManagement:Bool
public var enableDeviceManagement:Bool
public var enableDialer:Bool
public var enableCallHistory:Bool
public var enableAssistants:Bool
public var showFileNameInMessageCenter:Bool
public var chakraTheme:String
public var customCss:String
public var pageTitle:String
public var stringMappings:String
public var logoutUrl:String
public var portMyNumberUrl:String
required public init(){}
}
public class ListResponse<T : Codable> : Codable
{
/**
* The items
*/
// @ApiMember(Description="The items")
public var items:[AccountInfo]
/**
* The total number of items
*/
// @ApiMember(Description="The total number of items")
public var totalCount:Int
/**
* The total number of pages
*/
// @ApiMember(Description="The total number of pages")
public var totalPages:Int
/**
* Are there more pages of items? Used with simplified paging
*/
// @ApiMember(Description="Are there more pages of items? Used with simplified paging")
public var hasMorePages:Bool
required public init(){}
}
public class AccountInfo : EntityInfo
{
/**
* The name of this account
*/
// @ApiMember(Description="The name of this account")
public var name:String
/**
* The ID of this account's parent
*/
// @ApiMember(Description="The ID of this account's parent")
public var parentAccountId:String
/**
* The twilio account SID
*/
// @ApiMember(Description="The twilio account SID")
public var twilioAccountSid:String
/**
* The ancestors of this account. Useful for breadcrumbs
*/
// @ApiMember(Description="The ancestors of this account. Useful for breadcrumbs")
public var ancestorIds:[String]
/**
* The max number of phone numbers this account can have
*/
// @ApiMember(Description="The max number of phone numbers this account can have")
public var maxPhoneNumbers:Int
/**
* This account is BYOA
*/
// @ApiMember(Description="This account is BYOA")
public var isBYOA:Bool
/**
* TrustHub Profile Sid
*/
// @ApiMember(Description="TrustHub Profile Sid")
public var trustHubProfileSid:String
/**
* The ID of the logo file
*/
// @ApiMember(Description="The ID of the logo file")
public var logoId:String
/**
* The URI of the logo file
*/
// @ApiMember(Description="The URI of the logo file")
public var logoUri:String
/**
* The billing settings for this account
*/
// @ApiMember(Description="The billing settings for this account")
public var billingSettings:BillingSettings
/**
* Enable international settings for the account?
*/
// @ApiMember(Description="Enable international settings for the account?")
public var enableInternationalSettings:Bool
/**
* The default list of country codes the account can dial when not specified on customer
*/
// @ApiMember(Description="The default list of country codes the account can dial when not specified on customer")
public var defaultInternationalCountryCodes:[String]
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case name
case parentAccountId
case twilioAccountSid
case ancestorIds
case maxPhoneNumbers
case isBYOA
case trustHubProfileSid
case logoId
case logoUri
case billingSettings
case enableInternationalSettings
case defaultInternationalCountryCodes
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decodeIfPresent(String.self, forKey: .name)
parentAccountId = try container.decodeIfPresent(String.self, forKey: .parentAccountId)
twilioAccountSid = try container.decodeIfPresent(String.self, forKey: .twilioAccountSid)
ancestorIds = try container.decodeIfPresent([String].self, forKey: .ancestorIds) ?? []
maxPhoneNumbers = try container.decodeIfPresent(Int.self, forKey: .maxPhoneNumbers)
isBYOA = try container.decodeIfPresent(Bool.self, forKey: .isBYOA)
trustHubProfileSid = try container.decodeIfPresent(String.self, forKey: .trustHubProfileSid)
logoId = try container.decodeIfPresent(String.self, forKey: .logoId)
logoUri = try container.decodeIfPresent(String.self, forKey: .logoUri)
billingSettings = try container.decodeIfPresent(BillingSettings.self, forKey: .billingSettings)
enableInternationalSettings = try container.decodeIfPresent(Bool.self, forKey: .enableInternationalSettings)
defaultInternationalCountryCodes = try container.decodeIfPresent([String].self, forKey: .defaultInternationalCountryCodes) ?? []
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if name != nil { try container.encode(name, forKey: .name) }
if parentAccountId != nil { try container.encode(parentAccountId, forKey: .parentAccountId) }
if twilioAccountSid != nil { try container.encode(twilioAccountSid, forKey: .twilioAccountSid) }
if ancestorIds != nil { try container.encode(ancestorIds, forKey: .ancestorIds) }
if maxPhoneNumbers != nil { try container.encode(maxPhoneNumbers, forKey: .maxPhoneNumbers) }
if isBYOA != nil { try container.encode(isBYOA, forKey: .isBYOA) }
if trustHubProfileSid != nil { try container.encode(trustHubProfileSid, forKey: .trustHubProfileSid) }
if logoId != nil { try container.encode(logoId, forKey: .logoId) }
if logoUri != nil { try container.encode(logoUri, forKey: .logoUri) }
if billingSettings != nil { try container.encode(billingSettings, forKey: .billingSettings) }
if enableInternationalSettings != nil { try container.encode(enableInternationalSettings, forKey: .enableInternationalSettings) }
if defaultInternationalCountryCodes != nil { try container.encode(defaultInternationalCountryCodes, forKey: .defaultInternationalCountryCodes) }
}
}
To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
GET /customers HTTP/1.1 Host: evovoice.io Accept: text/jsv
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length
{
items:
[
{
accountId: String,
parentCustomerId: String,
breadcrumb:
[
{
id: String,
name: String
}
],
accountName: String,
isStaging: False,
name: String,
referenceId: String,
tags:
[
{
id: String,
name: String,
color: Magenta
}
],
schedule:
{
timeZoneId: String,
inherit: False,
forceClosed: False,
rules:
[
{
id: String,
name: String,
priority: 0,
state: String,
source: String,
condition: String,
simpleRuleType: Always,
customerState: String,
flowId: String,
isAllDay: False,
startDate: String,
startTime: String,
endTime: String,
bySetPosition:
[
0
],
byMonth:
[
0
],
byWeekNo:
[
0
],
byYearDay:
[
0
],
byMonthDay:
[
0
],
byDay:
[
{
offset: 0,
dayOfWeek: Sunday
}
],
byHour:
[
0
],
byMinute:
[
0
],
interval: 0,
count: 0,
untilDate: String,
frequency: None
}
],
defaultState: String
},
integrationData:
{
String:
{
thirdPartyId: String
}
},
overrideBillingSettings: False,
billingSettings:
{
base:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
localNumbers:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
tollFreeNumbers:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
inboundVoiceCalls:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
outboundVoiceCalls:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
inboundFaxes:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
outboundFaxes:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
inboundSmsMessages:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
outboundSmsMessages:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
aiInsights:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
aiLiveMinutes:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
aiMessages:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
},
aiTranscriptions:
{
baseCost: 0,
rawUnitMultiplier: 0,
unitCost: 0,
allowance: 0
}
},
overrideAppSettings: False,
appSettings:
{
enablePhoneNumberManagement: False,
enableDeviceManagement: False,
enableDialer: False,
enableCallHistory: False,
enableAssistants: False,
showFileNameInMessageCenter: False,
chakraTheme: String,
customCss: String,
pageTitle: String,
stringMappings: String,
logoutUrl: String,
portMyNumberUrl: String
},
enableInternationalDialing: False,
enabledInternationalCountryCodes:
[
String
],
id: String,
dateCreated: String,
dateLastModified: String,
createdBy: String,
lastModifiedBy: String
}
],
totalCount: 0,
totalPages: 0,
hasMorePages: False
}