ClubReady Api

<back to all web services

ContractSoldNewUserEndpoint

The following routes are available for this service:
POST/sales/contract/sold/new/userCreate a user and sell them a packageCreate a new user and sell them a package. The PaymentMethods property is an array of objects describing how you want ClubReady to take payment while selling the PackageId/InstallmentPlanId. **NOTE** This endpoint is not Click-to-Cancel compliant and should be transitioned to
import 'package:servicestack/servicestack.dart';

// @DataContract
class PaymentMethodDto implements IConvertible
{
    // @DataMember
    String? AcctToken;

    // @DataMember
    String? ProfileToken;

    // @DataMember
    String? PaymentProfileId;

    // @DataMember
    double? PaymentAmount;

    // @DataMember
    bool? UsePreferred;

    // @DataMember
    bool? DoNotUpdatePaymentTypePreference;

    PaymentMethodDto({this.AcctToken,this.ProfileToken,this.PaymentProfileId,this.PaymentAmount,this.UsePreferred,this.DoNotUpdatePaymentTypePreference});
    PaymentMethodDto.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        AcctToken = json['AcctToken'];
        ProfileToken = json['ProfileToken'];
        PaymentProfileId = json['PaymentProfileId'];
        PaymentAmount = JsonConverters.toDouble(json['PaymentAmount']);
        UsePreferred = json['UsePreferred'];
        DoNotUpdatePaymentTypePreference = json['DoNotUpdatePaymentTypePreference'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'AcctToken': AcctToken,
        'ProfileToken': ProfileToken,
        'PaymentProfileId': PaymentProfileId,
        'PaymentAmount': PaymentAmount,
        'UsePreferred': UsePreferred,
        'DoNotUpdatePaymentTypePreference': DoNotUpdatePaymentTypePreference
    };

    getTypeName() => "PaymentMethodDto";
    TypeContext? context = _ctx;
}

enum RestrictedResourceType
{
    Store,
    Chain,
    User,
    Undefined,
}

// @ApiResponse(Description="", ResponseType=typeof(ContractSoldNewUserResponse), StatusCode=200)
class ContractSoldNewUserEndpoint implements IContractSoldNewUserEndpoint, IRestrictedApiRequest, IConvertible
{
    /**
    * IP address of the end user
    */
    // @ApiMember(Description="IP address of the end user", Name="X-Forwarded-For", ParameterType="header")
    String? XForwardedFor;

    /**
    * Api Authentication Key
    */
    // @ApiMember(Description="Api Authentication Key", IsRequired=true, ParameterType="query")
    String? ApiKey;

    /**
    * Id for the chain of the Api Key
    */
    // @ApiMember(Description="Id for the chain of the Api Key", ParameterType="query")
    int? ChainId;

    /**
    * Id of the store for the user
    */
    // @ApiMember(Description="Id of the store for the user", IsRequired=true, ParameterType="query")
    int? StoreId;

    /**
    * Package Id being sold
    */
    // @ApiMember(Description="Package Id being sold", IsRequired=true)
    int? PackageId;

    /**
    * Installment Plan Id being sold
    */
    // @ApiMember(Description="Installment Plan Id being sold", IsRequired=true)
    int? InstallmentPlanId;

    /**
    * Amount being paid
    */
    // @ApiMember(Description="Amount being paid", IsRequired=true)
    double? PaymentAmount;

    /**
    * Date contract takes affect
    */
    // @ApiMember(Description="Date contract takes affect")
    DateTime? StartDate;

    /**
    * First Name
    */
    // @ApiMember(Description="First Name", IsRequired=true)
    String? FirstName;

    /**
    * Last Name
    */
    // @ApiMember(Description="Last Name", IsRequired=true)
    String? LastName;

    /**
    * Email Address
    */
    // @ApiMember(Description="Email Address", IsRequired=true)
    String? Email;

    /**
    * Gender
    */
    // @ApiMember(Description="Gender")
    String? Gender;

    /**
    * Address
    */
    // @ApiMember(Description="Address")
    String? Address;

    /**
    * City
    */
    // @ApiMember(Description="City")
    String? City;

    /**
    * State
    */
    // @ApiMember(Description="State")
    String? State;

    /**
    * Zip Code
    */
    // @ApiMember(Description="Zip Code")
    String? Zip;

    /**
    * Home phone
    */
    // @ApiMember(Description="Home phone")
    String? Phone;

    /**
    * Work phone
    */
    // @ApiMember(Description="Work phone")
    String? WorkPhone;

    /**
    * Date of Birth
    */
    // @ApiMember(Description="Date of Birth")
    DateTime? DateOfBirth;

    /**
    * Cell phone
    */
    // @ApiMember(Description="Cell phone")
    String? CellPhone;

    /**
    * Add an internal note for the new prospect
    */
    // @ApiMember(Description="Add an internal note for the new prospect")
    String? Note;

    /**
    * Unique Id for the user from your system. We store internally as ExternalUserId
    */
    // @ApiMember(Description="Unique Id for the user from your system. We store internally as ExternalUserId")
    String? ExternalId;

    /**
    * Promo code to apply a discount.
    */
    // @ApiMember(Description="Promo code to apply a discount.")
    String? PromoCode;

    /**
    * Username should be between 4 and 255 characters long
    */
    // @ApiMember(Description="Username should be between 4 and 255 characters long")
    String? Username;

    /**
    * ReferralTypeId
    */
    // @ApiMember(Description="ReferralTypeId")
    int? ReferralTypeId;

    /**
    * Emergency contact name
    */
    // @ApiMember(Description="Emergency contact name")
    String? EmergencyContactName;

    /**
    * Emergency contact phone number
    */
    // @ApiMember(Description="Emergency contact phone number")
    String? EmergencyContactPhone;

    /**
    * Emergency contact relationship
    */
    // @ApiMember(Description="Emergency contact relationship")
    String? EmergencyContactType;

    /**
    * An array of PaymentMethod objects to be used for this purchase. A null array (or omitted property) will use thePreferred method for the total amount.Each object of the array may contain properties:| Property | Description || --- | --- || PaymentAmount | The maximum amount to be attempted for this PaymentMethod. When null or omitted, the remaining PaymentAmount will be attempted. || **Use only one of the following three** | **UsePreferred** or **AcctToken** or **ProfileToken [DoNotUpdatePaymentTypePreference]** || UsePreferred | Set to `true` to use the Preferred method, otherwise omit the value or set to `null` or `false` || AcctToken | The AcctToken to attempt payment || ProfileToken | When provided, a PaymentMethod will be created (this will prevent the requirement to call `/sales/paymentprofile/import`) || DoNotUpdatePaymentTypePreference | [Optional] When creating a PaymentMethod (ProfileToken), it is set as the preferred method. To not create as preferred, set `DoNotUpdatePaymentTypePreference` to `true`. (for more information, see `/sales/paymentprofile/import`) || | |Only one of `UsePreferred`, `AcctToken`, `ProfileToken` or is needed. `DoNotUpdatePaymentTypePreference` is optionaland only valid with `ProfileToken`.* Scenario #1: Sell $3 contract using an existing PaymentMethod (i.e. AcctToken) for $1 and the Preferred method for $2.JSON:```json{    ...    "PaymentAmount": 3.00,    "PaymentMethods": [        {            "PaymentAmount": "1.00",            "AcctToken": "eyJ..."        },        {            "PaymentAmount": "2.00",            "UsePreferred": true        }    ]}```JSV:```...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,AcctToken:eyJ...NdQ},{PaymentAmount:2.00,UsePreferred:true}]```* Scenario #2: Sell $3 contract using a new PaymentMethod (i.e. ProfileToken) for $1 and the Preferred method for the remaining.Note, the sum of the PaymentMethod's PaymentAmount ($4) is greater than the agreement amount ($3). PaymentAmount is the maximum amount.This allows the first PaymentMethod to decline or partially approve (common with gift cards). Therefore, if the first PaymentMethod approvesfor $0.75, the second will be attempted for $2.25.JSON:```json{     ...    "PaymentAmount": 3.00,    "PaymentMethods": [        {            "PaymentAmount": "1.00",            "ProfileToken": "eyJ..."        },        {            "PaymentAmount": "3.00",            "UsePreferred": true        }    ]}```JSV:```jsv...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,ProfileToken:eyj...NdQ},{PaymentAmount:3.00,UsePreferred:true}]```Notes:  * AcctTokens should not be parsed or persisted in the client application. They are currently jsonbased, but can be updated without notice.* ProfileToken is used to create a PaymentMethod in the ClubReady system. For more information, see `/sales/paymentprofile/import`.* If `PaymentMethods` is missing or `null`, the Preferred method will be used.* If a `PaymentMethods` `PaymentAmount` is not specified, the remaining amount will be attempted.* If a PaymentMethod is partially approved (common for gift cards), the PaymentMethod with anunspecified PaymentAmount will be charged the remaining amount, including the unapproved amount not.* When testing with this website, the PaymentMethods textbox needs JSV and only the square brackets and contents(e.g. `[{PaymentAmount:1.00,UsePreferred:true}]`).
    */
    // @ApiMember(Description="An array of PaymentMethod objects to be used for this purchase. A null array (or omitted property) will use the\r\nPreferred method for the total amount.\r\n\r\nEach object of the array may contain properties:\r\n\r\n| Property | Description |\r\n| --- | --- |\r\n| PaymentAmount | The maximum amount to be attempted for this PaymentMethod. When null or omitted, the remaining PaymentAmount will be attempted. |\r\n| **Use only one of the following three** | **UsePreferred** or **AcctToken** or **ProfileToken [DoNotUpdatePaymentTypePreference]** |\r\n| UsePreferred | Set to `true` to use the Preferred method, otherwise omit the value or set to `null` or `false` |\r\n| AcctToken | The AcctToken to attempt payment |\r\n| ProfileToken | When provided, a PaymentMethod will be created (this will prevent the requirement to call `/sales/paymentprofile/import`) |\r\n| DoNotUpdatePaymentTypePreference | [Optional] When creating a PaymentMethod (ProfileToken), it is set as the preferred method. To not create as preferred, set `DoNotUpdatePaymentTypePreference` to `true`. (for more information, see `/sales/paymentprofile/import`) |\r\n| | |\r\n\r\nOnly one of `UsePreferred`, `AcctToken`, `ProfileToken` or is needed. `DoNotUpdatePaymentTypePreference` is optional\r\nand only valid with `ProfileToken`.\r\n\r\n* Scenario #1: Sell $3 contract using an existing PaymentMethod (i.e. AcctToken) for $1 and the Preferred method for $2.\r\n\r\nJSON:\r\n```json\r\n{\r\n    ...\r\n    \"PaymentAmount\": 3.00,\r\n    \"PaymentMethods\": [\r\n        {\r\n            \"PaymentAmount\": \"1.00\",\r\n            \"AcctToken\": \"eyJ...\"\r\n        },\r\n        {\r\n            \"PaymentAmount\": \"2.00\",\r\n            \"UsePreferred\": true\r\n        }\r\n    ]\r\n}\r\n```\r\nJSV:\r\n```\r\n...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,AcctToken:eyJ...NdQ},{PaymentAmount:2.00,UsePreferred:true}]\r\n```\r\n\r\n* Scenario #2: Sell $3 contract using a new PaymentMethod (i.e. ProfileToken) for $1 and the Preferred method for the remaining.\r\nNote, the sum of the PaymentMethod's PaymentAmount ($4) is greater than the agreement amount ($3). PaymentAmount is the maximum amount.\r\nThis allows the first PaymentMethod to decline or partially approve (common with gift cards). Therefore, if the first PaymentMethod approves\r\nfor $0.75, the second will be attempted for $2.25.\r\n\r\nJSON:\r\n```json\r\n{ \r\n    ...\r\n    \"PaymentAmount\": 3.00,\r\n    \"PaymentMethods\": [\r\n        {\r\n            \"PaymentAmount\": \"1.00\",\r\n            \"ProfileToken\": \"eyJ...\"\r\n        },\r\n        {\r\n            \"PaymentAmount\": \"3.00\",\r\n            \"UsePreferred\": true\r\n        }\r\n    ]\r\n}\r\n```\r\nJSV:\r\n```jsv\r\n...,PaymentAmount:3.00,PaymentMethods:[{PaymentAmount:1.00,ProfileToken:eyj...NdQ},{PaymentAmount:3.00,UsePreferred:true}]\r\n```\r\n\r\nNotes:  \r\n\r\n* AcctTokens should not be parsed or persisted in the client application. They are currently json\r\nbased, but can be updated without notice.\r\n\r\n* ProfileToken is used to create a PaymentMethod in the ClubReady system. For more information, \r\nsee `/sales/paymentprofile/import`.\r\n\r\n* If `PaymentMethods` is missing or `null`, the Preferred method will be used.\r\n\r\n* If a `PaymentMethods` `PaymentAmount` is not specified, the remaining amount will be attempted.\r\n\r\n* If a PaymentMethod is partially approved (common for gift cards), the PaymentMethod with an\r\nunspecified PaymentAmount will be charged the remaining amount, including the unapproved amount not.\r\n\r\n* When testing with this website, the PaymentMethods textbox needs JSV and only the square brackets and contents\r\n(e.g. `[{PaymentAmount:1.00,UsePreferred:true}]`).")
    List<PaymentMethodDto>? PaymentMethods;

    int? RestrictedId;
    RestrictedResourceType? RestrictedResourceType;

    ContractSoldNewUserEndpoint({this.XForwardedFor,this.ApiKey,this.ChainId,this.StoreId,this.PackageId,this.InstallmentPlanId,this.PaymentAmount,this.StartDate,this.FirstName,this.LastName,this.Email,this.Gender,this.Address,this.City,this.State,this.Zip,this.Phone,this.WorkPhone,this.DateOfBirth,this.CellPhone,this.Note,this.ExternalId,this.PromoCode,this.Username,this.ReferralTypeId,this.EmergencyContactName,this.EmergencyContactPhone,this.EmergencyContactType,this.PaymentMethods,this.RestrictedId,this.RestrictedResourceType});
    ContractSoldNewUserEndpoint.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        XForwardedFor = json['XForwardedFor'];
        ApiKey = json['ApiKey'];
        ChainId = json['ChainId'];
        StoreId = json['StoreId'];
        PackageId = json['PackageId'];
        InstallmentPlanId = json['InstallmentPlanId'];
        PaymentAmount = JsonConverters.toDouble(json['PaymentAmount']);
        StartDate = JsonConverters.fromJson(json['StartDate'],'DateTime',context!);
        FirstName = json['FirstName'];
        LastName = json['LastName'];
        Email = json['Email'];
        Gender = json['Gender'];
        Address = json['Address'];
        City = json['City'];
        State = json['State'];
        Zip = json['Zip'];
        Phone = json['Phone'];
        WorkPhone = json['WorkPhone'];
        DateOfBirth = JsonConverters.fromJson(json['DateOfBirth'],'DateTime',context!);
        CellPhone = json['CellPhone'];
        Note = json['Note'];
        ExternalId = json['ExternalId'];
        PromoCode = json['PromoCode'];
        Username = json['Username'];
        ReferralTypeId = json['ReferralTypeId'];
        EmergencyContactName = json['EmergencyContactName'];
        EmergencyContactPhone = json['EmergencyContactPhone'];
        EmergencyContactType = json['EmergencyContactType'];
        PaymentMethods = JsonConverters.fromJson(json['PaymentMethods'],'List<PaymentMethodDto>',context!);
        RestrictedId = json['RestrictedId'];
        RestrictedResourceType = JsonConverters.fromJson(json['RestrictedResourceType'],'RestrictedResourceType',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'XForwardedFor': XForwardedFor,
        'ApiKey': ApiKey,
        'ChainId': ChainId,
        'StoreId': StoreId,
        'PackageId': PackageId,
        'InstallmentPlanId': InstallmentPlanId,
        'PaymentAmount': PaymentAmount,
        'StartDate': JsonConverters.toJson(StartDate,'DateTime',context!),
        'FirstName': FirstName,
        'LastName': LastName,
        'Email': Email,
        'Gender': Gender,
        'Address': Address,
        'City': City,
        'State': State,
        'Zip': Zip,
        'Phone': Phone,
        'WorkPhone': WorkPhone,
        'DateOfBirth': JsonConverters.toJson(DateOfBirth,'DateTime',context!),
        'CellPhone': CellPhone,
        'Note': Note,
        'ExternalId': ExternalId,
        'PromoCode': PromoCode,
        'Username': Username,
        'ReferralTypeId': ReferralTypeId,
        'EmergencyContactName': EmergencyContactName,
        'EmergencyContactPhone': EmergencyContactPhone,
        'EmergencyContactType': EmergencyContactType,
        'PaymentMethods': JsonConverters.toJson(PaymentMethods,'List<PaymentMethodDto>',context!),
        'RestrictedId': RestrictedId,
        'RestrictedResourceType': JsonConverters.toJson(RestrictedResourceType,'RestrictedResourceType',context!)
    };

    getTypeName() => "ContractSoldNewUserEndpoint";
    TypeContext? context = _ctx;
}

TypeContext _ctx = TypeContext(library: 'www.clubready.com', types: <String, TypeInfo> {
    'PaymentMethodDto': TypeInfo(TypeOf.Class, create:() => PaymentMethodDto()),
    'RestrictedResourceType': TypeInfo(TypeOf.Enum, enumValues:RestrictedResourceType.values),
    'ContractSoldNewUserEndpoint': TypeInfo(TypeOf.Class, create:() => ContractSoldNewUserEndpoint()),
    'List<PaymentMethodDto>': TypeInfo(TypeOf.Class, create:() => <PaymentMethodDto>[]),
});

Dart ContractSoldNewUserEndpoint DTOs

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

HTTP + CSV

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

POST /sales/contract/sold/new/user HTTP/1.1 
Host: www.clubready.com 
Accept: text/csv
Content-Type: text/csv
Content-Length: length

{"XForwardedFor":"String","ApiKey":"String","ChainId":0,"StoreId":0,"PackageId":0,"InstallmentPlanId":0,"PaymentAmount":0,"StartDate":"0001-01-01T00:00:00.0000000","FirstName":"String","LastName":"String","Email":"String","Gender":"String","Address":"String","City":"String","State":"String","Zip":"String","Phone":"String","WorkPhone":"String","DateOfBirth":"0001-01-01T00:00:00.0000000","CellPhone":"String","Note":"String","ExternalId":"String","PromoCode":"String","Username":"String","ReferralTypeId":0,"EmergencyContactName":"String","EmergencyContactPhone":"String","EmergencyContactType":"String","PaymentMethods":[{"AcctToken":"String","ProfileToken":"String","PaymentProfileId":"String","PaymentAmount":0,"UsePreferred":false,"DoNotUpdatePaymentTypePreference":false}],"RestrictedId":0,"RestrictedResourceType":"Chain","AuthToken":"String","AcctToken":"String","Last4":"String","ExpMonth":0,"ExpYear":0,"AcctType":"Uninitialized","CardType":0,"BnkRoute":0,"IsTemp":false}
HTTP/1.1 200 OK
Content-Type: text/csv
Content-Length: length

{}