ServiceStack Home (Live)

<back to all web services

Customer

The following routes are available for this service:
All Verbs/Customer
All Verbs/Customer/{Id}
import datetime
import decimal
from marshmallow.fields import *
from servicestack import *
from typing import *
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, LetterCase, Undefined, config
from enum import Enum, IntEnum


class SkuType(str, Enum):
    PRODUCT = 'Product'
    PER_DEV = 'PerDev'
    PER_CORE = 'PerCore'
    SITE = 'Site'
    SUPPORT = 'Support'
    TRAINING = 'Training'
    REGISTER = 'Register'
    PAYMENT = 'Payment'


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class OrderDetail:
    id: int = 0
    order_id: int = 0
    sku_id: int = 0
    sku_type: Optional[SkuType] = None
    price: int = 0
    description: Optional[str] = None
    quantity: int = 0
    total: int = 0


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Order(IAddress):
    id: int = 0
    customer_id: int = 0
    product_name: Optional[str] = None
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    email: Optional[str] = None
    company: Optional[str] = None
    phone_number: Optional[str] = None
    address_line1: Optional[str] = None
    address_line2: Optional[str] = None
    address_city: Optional[str] = None
    address_zip: Optional[str] = None
    address_state: Optional[str] = None
    address_country: Optional[str] = None
    agree_terms: bool = False
    notes: Optional[str] = None
    last4: Optional[str] = None
    sub_total: int = 0
    coupon_id: Optional[str] = None
    discount: int = 0
    tax: int = 0
    total: int = 0
    item_quantity: int = 0
    authorized_quantity: Optional[int] = None
    subscription_id: Optional[int] = None
    license_ref: Optional[str] = None
    payment_id: Optional[int] = None
    email_id: Optional[int] = None
    paid: bool = False
    created_date: datetime.datetime = datetime.datetime(1, 1, 1)
    modified_date: datetime.datetime = datetime.datetime(1, 1, 1)
    modified_by: Optional[str] = None
    cancelled_date: Optional[datetime.datetime] = None
    cancelled_reason: Optional[str] = None
    ip_address: Optional[str] = None
    order_details: Optional[List[OrderDetail]] = None


class LicenseType(str, Enum):
    FREE = 'Free'
    FREE_INDIVIDUAL = 'FreeIndividual'
    FREE_OPEN_SOURCE = 'FreeOpenSource'
    INDIE = 'Indie'
    BUSINESS = 'Business'
    ENTERPRISE = 'Enterprise'
    TEXT_INDIE = 'TextIndie'
    TEXT_BUSINESS = 'TextBusiness'
    ORM_LITE_INDIE = 'OrmLiteIndie'
    ORM_LITE_BUSINESS = 'OrmLiteBusiness'
    REDIS_INDIE = 'RedisIndie'
    REDIS_BUSINESS = 'RedisBusiness'
    AWS_INDIE = 'AwsIndie'
    AWS_BUSINESS = 'AwsBusiness'
    TRIAL = 'Trial'
    SITE = 'Site'
    TEXT_SITE = 'TextSite'
    REDIS_SITE = 'RedisSite'
    ORM_LITE_SITE = 'OrmLiteSite'


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class LicenseKey:
    ref: Optional[str] = None
    name: Optional[str] = None
    type: Optional[LicenseType] = None
    meta: int = 0
    hash: Optional[str] = None
    halg: Optional[str] = None
    expiry: datetime.datetime = datetime.datetime(1, 1, 1)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Subscription:
    id: int = 0
    customer_id: int = 0
    email: Optional[str] = None
    sku_id: int = 0
    sku_name: Optional[str] = None
    sku_type: Optional[SkuType] = None
    code: Optional[str] = None
    quantity: int = 0
    support_quantity: int = 0
    total: int = 0
    is_plan: bool = False
    is_renewal: bool = False
    subscription_duration_days: int = 0
    renewal_date: Optional[datetime.datetime] = None
    license_ref: Optional[str] = None
    license_name: Optional[str] = None
    license_address: Optional[str] = None
    license_type: Optional[LicenseType] = None
    expiry_date: datetime.datetime = datetime.datetime(1, 1, 1)
    license_key: Optional[LicenseKey] = None
    license_key_text: Optional[str] = None
    created_date: datetime.datetime = datetime.datetime(1, 1, 1)
    modified_date: datetime.datetime = datetime.datetime(1, 1, 1)
    cancelled_date: Optional[datetime.datetime] = None
    stripe_subscription_id: Optional[str] = None
    email_id: Optional[int] = None
    email_renewal_id: Optional[int] = None
    email_expired_id: Optional[int] = None
    renewal_subscription_id: Optional[int] = None
    external_ref: Optional[str] = None
    notes: Optional[str] = None
    error: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Customer(IAddress):
    id: int = 0
    email: Optional[str] = None
    display_name: Optional[str] = None
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    company: Optional[str] = None
    phone_number: Optional[str] = None
    address_line1: Optional[str] = None
    address_line2: Optional[str] = None
    address_city: Optional[str] = None
    address_zip: Optional[str] = None
    address_state: Optional[str] = None
    address_country: Optional[str] = None
    stripe_customer_id: Optional[str] = None
    stripe_coupon_id: Optional[str] = None
    plan: Optional[str] = None
    created_date: datetime.datetime = datetime.datetime(1, 1, 1)
    is_referrer: bool = False
    orders: Optional[List[Order]] = None
    subscriptions: Optional[List[Subscription]] = None

Python Customer DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv

HTTP + JSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /Customer HTTP/1.1 
Host: account.servicestack.net 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	id: 0,
	email: String,
	displayName: String,
	firstName: String,
	lastName: String,
	company: String,
	phoneNumber: String,
	addressLine1: String,
	addressLine2: String,
	addressCity: String,
	addressZip: String,
	addressState: String,
	addressCountry: String,
	stripeCustomerId: String,
	stripeCouponId: String,
	plan: String,
	createdDate: 0001-01-01,
	isReferrer: False,
	orders: 
	[
		{
			id: 0,
			customerId: 0,
			productName: String,
			firstName: String,
			lastName: String,
			email: String,
			company: String,
			phoneNumber: String,
			addressLine1: String,
			addressLine2: String,
			addressCity: String,
			addressZip: String,
			addressState: String,
			addressCountry: String,
			agreeTerms: False,
			notes: String,
			last4: String,
			subTotal: 0,
			couponId: String,
			discount: 0,
			tax: 0,
			total: 0,
			itemQuantity: 0,
			authorizedQuantity: 0,
			subscriptionId: 0,
			licenseRef: String,
			paymentId: 0,
			emailId: 0,
			paid: False,
			createdDate: 0001-01-01,
			modifiedDate: 0001-01-01,
			modifiedBy: String,
			cancelledDate: 0001-01-01,
			cancelledReason: String,
			ipAddress: String,
			orderDetails: 
			[
				{
					id: 0,
					orderId: 0,
					skuId: 0,
					skuType: Product,
					price: 0,
					description: String,
					quantity: 0,
					total: 0
				}
			]
		}
	],
	subscriptions: 
	[
		{
			id: 0,
			customerId: 0,
			email: String,
			skuId: 0,
			skuName: String,
			skuType: Product,
			code: String,
			quantity: 0,
			supportQuantity: 0,
			total: 0,
			isPlan: False,
			isRenewal: False,
			subscriptionDurationDays: 0,
			renewalDate: 0001-01-01,
			licenseRef: String,
			licenseName: String,
			licenseAddress: String,
			licenseType: Free,
			expiryDate: 0001-01-01,
			licenseKey: 
			{
				ref: String,
				name: String,
				type: Free,
				meta: 0,
				hash: String,
				halg: String,
				expiry: 0001-01-01
			},
			licenseKeyText: String,
			createdDate: 0001-01-01,
			modifiedDate: 0001-01-01,
			cancelledDate: 0001-01-01,
			stripeSubscriptionId: String,
			emailId: 0,
			emailRenewalId: 0,
			emailExpiredId: 0,
			renewalSubscriptionId: 0,
			externalRef: String,
			notes: String,
			error: String
		}
	]
}